Skip to content

Instantly share code, notes, and snippets.

@feliwir
Created January 16, 2023 21:09
Show Gist options
  • Save feliwir/e393d7e4fe2226cedbf0b6640787c35b to your computer and use it in GitHub Desktop.
Save feliwir/e393d7e4fe2226cedbf0b6640787c35b to your computer and use it in GitHub Desktop.
https://uica.uops.info/?code=%25define%20__x86_64__%0D%0A%0D%0A%25ifdef%20ELF%20%20%20%20%3B%20----(nasm%20-felf%5B64%5D%20-DELF%20...)------------%0D%0Asection%20.note.GNU-stack%20noalloc%20noexec%20nowrite%20progbits%0D%0A%0D%0A%3B%20--%20segment%20definition%20--%0D%0A%3B%0D%0A%25ifdef%20__x86_64__%0D%0A%25define%20SEG_TEXT%20%20%20.text%20%20%20progbits%20align%3D32%0D%0A%25define%20SEG_CONST%20%20.rodata%20progbits%20align%3D32%0D%0A%25else%0D%0A%25define%20SEG_TEXT%20%20%20.text%20%20%20progbits%20alloc%20exec%20%20%20nowrite%20align%3D32%0D%0A%25define%20SEG_CONST%20%20.rodata%20progbits%20alloc%20noexec%20nowrite%20align%3D32%0D%0A%25endif%0D%0A%0D%0A%3B%20To%20make%20the%20code%20position-independent%2C%20append%20-DPIC%20to%20the%20commandline%0D%0A%3B%0D%0A%25define%20GOT_SYMBOL%20%20_GLOBAL_OFFSET_TABLE_%20%20%3B%20ELF%20supports%20PIC%0D%0A%25define%20EXTN(name)%20%20name%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20foo()%20-%3E%20foo%0D%0A%25endif%20%20%20%20%20%20%20%20%20%20%3B%20----------------------------------------------%0D%0A%0D%0A%3B%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0D%0A%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%3B%20%20Common%20types%0D%0A%3B%0D%0A%25ifdef%20__x86_64__%0D%0A%25ifnidn%20__OUTPUT_FORMAT__%2C%20elfx32%0D%0A%25define%20POINTER%20%20%20%20%20%20%20%20%20qword%20%20%20%20%20%20%20%20%20%20%20%3B%20general%20pointer%20type%0D%0A%25define%20SIZEOF_POINTER%20%20SIZEOF_QWORD%20%20%20%20%3B%20sizeof(POINTER)%0D%0A%25define%20POINTER_BIT%20%20%20%20%20QWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(POINTER)*BYTE_BIT%0D%0A%25define%20resp%20%20%20%20%20%20%20%20%20%20%20%20resq%0D%0A%25define%20dp%20%20%20%20%20%20%20%20%20%20%20%20%20%20dq%0D%0A%25define%20raxp%20%20%20%20%20%20%20%20%20%20%20%20rax%0D%0A%25define%20rbxp%20%20%20%20%20%20%20%20%20%20%20%20rbx%0D%0A%25define%20rcxp%20%20%20%20%20%20%20%20%20%20%20%20rcx%0D%0A%25define%20rdxp%20%20%20%20%20%20%20%20%20%20%20%20rdx%0D%0A%25define%20rsip%20%20%20%20%20%20%20%20%20%20%20%20rsi%0D%0A%25define%20rdip%20%20%20%20%20%20%20%20%20%20%20%20rdi%0D%0A%25define%20rbpp%20%20%20%20%20%20%20%20%20%20%20%20rbp%0D%0A%25define%20rspp%20%20%20%20%20%20%20%20%20%20%20%20rsp%0D%0A%25define%20r8p%20%20%20%20%20%20%20%20%20%20%20%20%20r8%0D%0A%25define%20r9p%20%20%20%20%20%20%20%20%20%20%20%20%20r9%0D%0A%25define%20r10p%20%20%20%20%20%20%20%20%20%20%20%20r10%0D%0A%25define%20r11p%20%20%20%20%20%20%20%20%20%20%20%20r11%0D%0A%25define%20r12p%20%20%20%20%20%20%20%20%20%20%20%20r12%0D%0A%25define%20r13p%20%20%20%20%20%20%20%20%20%20%20%20r13%0D%0A%25define%20r14p%20%20%20%20%20%20%20%20%20%20%20%20r14%0D%0A%25define%20r15p%20%20%20%20%20%20%20%20%20%20%20%20r15%0D%0A%25endif%0D%0A%25endif%0D%0A%25ifndef%20raxp%0D%0A%25define%20POINTER%20%20%20%20%20%20%20%20%20dword%20%20%20%20%20%20%20%20%20%20%20%3B%20general%20pointer%20type%0D%0A%25define%20SIZEOF_POINTER%20%20SIZEOF_DWORD%20%20%20%20%3B%20sizeof(POINTER)%0D%0A%25define%20POINTER_BIT%20%20%20%20%20DWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(POINTER)*BYTE_BIT%0D%0A%25define%20resp%20%20%20%20%20%20%20%20%20%20%20%20resd%0D%0A%25define%20dp%20%20%20%20%20%20%20%20%20%20%20%20%20%20dd%0D%0A%3B%20x86_64%20ILP32%20ABI%20(x32)%0D%0A%25define%20raxp%20%20%20%20%20%20%20%20%20%20%20%20eax%0D%0A%25define%20rbxp%20%20%20%20%20%20%20%20%20%20%20%20ebx%0D%0A%25define%20rcxp%20%20%20%20%20%20%20%20%20%20%20%20ecx%0D%0A%25define%20rdxp%20%20%20%20%20%20%20%20%20%20%20%20edx%0D%0A%25define%20rsip%20%20%20%20%20%20%20%20%20%20%20%20esi%0D%0A%25define%20rdip%20%20%20%20%20%20%20%20%20%20%20%20edi%0D%0A%25define%20rbpp%20%20%20%20%20%20%20%20%20%20%20%20ebp%0D%0A%25define%20rspp%20%20%20%20%20%20%20%20%20%20%20%20esp%0D%0A%25define%20r8p%20%20%20%20%20%20%20%20%20%20%20%20%20r8d%0D%0A%25define%20r9p%20%20%20%20%20%20%20%20%20%20%20%20%20r9d%0D%0A%25define%20r10p%20%20%20%20%20%20%20%20%20%20%20%20r10d%0D%0A%25define%20r11p%20%20%20%20%20%20%20%20%20%20%20%20r11d%0D%0A%25define%20r12p%20%20%20%20%20%20%20%20%20%20%20%20r12d%0D%0A%25define%20r13p%20%20%20%20%20%20%20%20%20%20%20%20r13d%0D%0A%25define%20r14p%20%20%20%20%20%20%20%20%20%20%20%20r14d%0D%0A%25define%20r15p%20%20%20%20%20%20%20%20%20%20%20%20r15d%0D%0A%25endif%0D%0A%0D%0A%25define%20INT%20%20%20%20%20%20%20%20%20%20%20%20%20dword%20%20%20%20%20%20%20%20%20%20%20%3B%20signed%20integer%20type%0D%0A%25define%20SIZEOF_INT%20%20%20%20%20%20SIZEOF_DWORD%20%20%20%20%3B%20sizeof(INT)%0D%0A%25define%20INT_BIT%20%20%20%20%20%20%20%20%20DWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(INT)*BYTE_BIT%0D%0A%0D%0A%25define%20FP32%20%20%20%20%20%20%20%20%20%20%20%20dword%20%20%20%20%20%20%20%20%20%20%20%3B%20IEEE754%20single%0D%0A%25define%20SIZEOF_FP32%20%20%20%20%20SIZEOF_DWORD%20%20%20%20%3B%20sizeof(FP32)%0D%0A%25define%20FP32_BIT%20%20%20%20%20%20%20%20DWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(FP32)*BYTE_BIT%0D%0A%0D%0A%25define%20MMWORD%20%20%20%20%20%20%20%20%20%20qword%20%20%20%20%20%20%20%20%20%20%20%3B%20int64%20%20(MMX%20register)%0D%0A%25define%20SIZEOF_MMWORD%20%20%20SIZEOF_QWORD%20%20%20%20%3B%20sizeof(MMWORD)%0D%0A%25define%20MMWORD_BIT%20%20%20%20%20%20QWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(MMWORD)*BYTE_BIT%0D%0A%0D%0A%3B%20NASM%20is%20buggy%20and%20doesn't%20properly%20handle%20operand%20sizes%20for%20SSE%0D%0A%3B%20instructions%2C%20so%20for%20now%20we%20have%20to%20define%20XMMWORD%20as%20blank.%0D%0A%25define%20XMMWORD%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20int128%20(SSE%20register)%0D%0A%25define%20SIZEOF_XMMWORD%20%20SIZEOF_OWORD%20%20%20%20%3B%20sizeof(XMMWORD)%0D%0A%25define%20XMMWORD_BIT%20%20%20%20%20OWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(XMMWORD)*BYTE_BIT%0D%0A%0D%0A%25define%20YMMWORD%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20int256%20(AVX%20register)%0D%0A%25define%20SIZEOF_YMMWORD%20%20SIZEOF_YWORD%20%20%20%20%3B%20sizeof(YMMWORD)%0D%0A%25define%20YMMWORD_BIT%20%20%20%20%20YWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(YMMWORD)*BYTE_BIT%0D%0A%0D%0A%25define%20ZMMWORD%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20int256%20(AVX512%20register)%0D%0A%25define%20SIZEOF_ZMMWORD%20%20SIZEOF_ZWORD%20%20%20%20%3B%20sizeof(ZMMWORD)%0D%0A%25define%20ZMMWORD_BIT%20%20%20%20%20ZWORD_BIT%20%20%20%20%20%20%20%3B%20sizeof(ZMMWORD)*BYTE_BIT%0D%0A%0D%0A%3B%20Similar%20hacks%20for%20when%20we%20load%20a%20dword%20or%20MMWORD%20into%20an%20xmm%23%20register%0D%0A%25define%20XMM_DWORD%0D%0A%25define%20XMM_MMWORD%0D%0A%0D%0A%25define%20SIZEOF_BYTE%20%20%201%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(byte)%0D%0A%25define%20SIZEOF_WORD%20%20%202%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(word)%0D%0A%25define%20SIZEOF_DWORD%20%204%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(dword)%0D%0A%25define%20SIZEOF_QWORD%20%208%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(qword)%0D%0A%25define%20SIZEOF_OWORD%20%2016%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(oword)%0D%0A%25define%20SIZEOF_YWORD%20%2032%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(yword)%0D%0A%25define%20SIZEOF_ZWORD%20%2064%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(zword)%0D%0A%0D%0A%25define%20BYTE_BIT%20%20%20%20%20%208%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20CHAR_BIT%20in%20C%0D%0A%25define%20WORD_BIT%20%20%20%20%20%2016%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(word)*BYTE_BIT%0D%0A%25define%20DWORD_BIT%20%20%20%20%2032%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(dword)*BYTE_BIT%0D%0A%25define%20QWORD_BIT%20%20%20%20%2064%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(qword)*BYTE_BIT%0D%0A%25define%20OWORD_BIT%20%20%20%20%20128%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(oword)*BYTE_BIT%0D%0A%25define%20YWORD_BIT%20%20%20%20%20256%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20sizeof(yword)*BYTE_BIT%0D%0A%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%3B%20%20External%20Symbol%20Name%0D%0A%3B%0D%0A%25ifndef%20EXTN%0D%0A%25define%20EXTN(name)%20%20_%20%25%2B%20name%20%20%20%20%20%20%20%20%20%20%20%3B%20foo()%20-%3E%20_foo%0D%0A%25endif%0D%0A%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%3B%20%20Hidden%20symbols%0D%0A%3B%0D%0A%25ifdef%20ELF%20%20%20%20%20%20%3B%20----(nasm%20-felf%5B64%5D%20-DELF%20...)--------%0D%0A%25define%20GLOBAL_FUNCTION(name)%20%20global%20EXTN(name)%3Afunction%20hidden%0D%0A%25define%20GLOBAL_DATA(name)%20%20%20%20%20%20global%20EXTN(name)%3Adata%20hidden%0D%0A%25elifdef%20MACHO%20%20%3B%20----(nasm%20-fmacho%20-DMACHO%20...)--------%0D%0A%25ifdef%20__YASM_VER__%0D%0A%25define%20GLOBAL_FUNCTION(name)%20%20global%20EXTN(name)%3Aprivate_extern%0D%0A%25define%20GLOBAL_DATA(name)%20%20%20%20%20%20global%20EXTN(name)%3Aprivate_extern%0D%0A%25else%0D%0A%25if%20__NASM_VERSION_ID__%20%3E%3D%200x020E0000%0D%0A%25define%20GLOBAL_FUNCTION(name)%20%20global%20EXTN(name)%3Aprivate_extern%0D%0A%25define%20GLOBAL_DATA(name)%20%20%20%20%20%20global%20EXTN(name)%3Aprivate_extern%0D%0A%25endif%0D%0A%25endif%0D%0A%25endif%0D%0A%0D%0A%25ifndef%20GLOBAL_FUNCTION%0D%0A%25define%20GLOBAL_FUNCTION(name)%20%20global%20EXTN(name)%0D%0A%25endif%0D%0A%25ifndef%20GLOBAL_DATA%0D%0A%25define%20GLOBAL_DATA(name)%20%20%20%20%20%20global%20EXTN(name)%0D%0A%25endif%0D%0A%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%3B%20%20Macros%20for%20position-independent%20code%20(PIC)%20support%0D%0A%3B%0D%0A%25ifndef%20GOT_SYMBOL%0D%0A%25undef%20PIC%0D%0A%25endif%0D%0A%0D%0A%25ifdef%20PIC%20%20%3B%20-------------------------------------------%0D%0A%0D%0A%25ifidn%20GOT_SYMBOL%2C%20_MACHO_PIC_%20%20%3B%20--------------------%0D%0A%0D%0A%3B%20At%20present%2C%20nasm%20doesn't%20seem%20to%20support%20PIC%20generation%20for%20Mach-O.%0D%0A%3B%20The%20PIC%20support%20code%20below%20is%20a%20little%20tricky.%0D%0A%0D%0A%20%20%20%20SECTION%20%20%20%20%20SEG_CONST%0D%0Aconst_base%3A%0D%0A%0D%0A%25define%20GOTOFF(got%2C%20sym)%20%20(got)%20%2B%20(sym)%20-%20const_base%0D%0A%0D%0A%25imacro%20get_GOT%201%0D%0A%20%20%20%20%3B%20NOTE%3A%20this%20macro%20destroys%20ecx%20resister.%0D%0A%20%20%20%20call%20%20%20%20%20%20%20%20%25%25geteip%0D%0A%20%20%20%20add%20%20%20%20%20%20%20%20%20ecx%2C%20byte%20(%25%25ref%20-%20%24)%0D%0A%20%20%20%20jmp%20%20%20%20%20%20%20%20%20short%20%25%25adjust%0D%0A%25%25geteip%3A%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20ecx%2C%20POINTER%20%5Besp%5D%0D%0A%20%20%20%20ret%0D%0A%25%25adjust%3A%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20ebp%0D%0A%20%20%20%20xor%20%20%20%20%20%20%20%20%20ebp%2C%20ebp%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20ebp%20%3D%200%0D%0A%25ifidni%20%251%2C%20ebx%20%20%3B%20(%251%20%3D%3D%20ebx)%0D%0A%20%20%20%20%3B%20db%200x8D%2C0x9C%20%2B%20jmp%20near%20const_base%20%3D%0D%0A%20%20%20%20%3B%20%20%20lea%20ebx%2C%20%5Becx%2Bebp*8%2B(const_base-%25%25ref)%5D%20%3B%208D%2C9C%2CE9%2C(offset32)%0D%0A%20%20%20%20db%20%20%20%20%20%20%20%20%20%200x8D%2C%200x9C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%208D%2C9C%0D%0A%20%20%20%20jmp%20%20%20%20%20%20%20%20%20near%20const_base%20%20%20%20%20%20%20%20%20%3B%20E9%2C(const_base-%25%25ref)%0D%0A%25%25ref%3A%0D%0A%25else%20%20%3B%20(%251%20!%3D%20ebx)%0D%0A%20%20%20%20%3B%20db%200x8D%2C0x8C%20%2B%20jmp%20near%20const_base%20%3D%0D%0A%20%20%20%20%3B%20%20%20lea%20ecx%2C%20%5Becx%2Bebp*8%2B(const_base-%25%25ref)%5D%20%3B%208D%2C8C%2CE9%2C(offset32)%0D%0A%20%20%20%20db%20%20%20%20%20%20%20%20%20%200x8D%2C%200x8C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%208D%2C8C%0D%0A%20%20%20%20jmp%20%20%20%20%20%20%20%20%20near%20const_base%20%20%20%20%20%20%20%20%20%3B%20E9%2C(const_base-%25%25ref)%0D%0A%25%25ref%3A%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20%251%2C%20ecx%0D%0A%25endif%20%20%3B%20(%251%20%3D%3D%20ebx)%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20ebp%0D%0A%25endmacro%0D%0A%0D%0A%25else%20%20%20%20%20%3B%20GOT_SYMBOL%20!%3D%20_MACHO_PIC_%20----------------%0D%0A%0D%0A%25define%20GOTOFF(got%2C%20sym)%20%20(got)%20%2B%20(sym)%20wrt%20..gotoff%0D%0A%0D%0A%25imacro%20get_GOT%201%0D%0A%20%20%20%20extern%20%20%20%20%20%20GOT_SYMBOL%0D%0A%20%20%20%20call%20%20%20%20%20%20%20%20%25%25geteip%0D%0A%20%20%20%20add%20%20%20%20%20%20%20%20%20%251%2C%20GOT_SYMBOL%20%2B%20%24%24%20-%20%24%20wrt%20..gotpc%0D%0A%20%20%20%20jmp%20%20%20%20%20%20%20%20%20short%20%25%25done%0D%0A%25%25geteip%3A%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20%251%2C%20POINTER%20%5Besp%5D%0D%0A%20%20%20%20ret%0D%0A%25%25done%3A%0D%0A%25endmacro%0D%0A%0D%0A%25endif%20%20%20%20%3B%20GOT_SYMBOL%20%3D%3D%20_MACHO_PIC_%20----------------%0D%0A%0D%0A%25imacro%20pushpic%201.nolist%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20%251%0D%0A%25endmacro%0D%0A%25imacro%20poppic%20%201.nolist%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20%251%0D%0A%25endmacro%0D%0A%25imacro%20movpic%20%202.nolist%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20%251%2C%20%252%0D%0A%25endmacro%0D%0A%0D%0A%25else%20%20%20%20%3B%20!PIC%20-----------------------------------------%0D%0A%0D%0A%25define%20GOTOFF(got%2C%20sym)%20%20(sym)%0D%0A%0D%0A%25imacro%20get_GOT%201.nolist%0D%0A%25endmacro%0D%0A%25imacro%20pushpic%201.nolist%0D%0A%25endmacro%0D%0A%25imacro%20poppic%20%201.nolist%0D%0A%25endmacro%0D%0A%25imacro%20movpic%20%202.nolist%0D%0A%25endmacro%0D%0A%0D%0A%25endif%20%20%20%3B%20%20PIC%20-----------------------------------------%0D%0A%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%3B%20%20Align%20the%20next%20instruction%20on%20%7B2%2C4%2C8%2C16%2C..%7D-byte%20boundary.%0D%0A%3B%20%20%22.balign%20n%2C%2Cm%22%20in%20GNU%20as%0D%0A%3B%0D%0A%25define%20MSKLE(x%2C%20y)%20%20(~(((y)%20%26%200xFFFF)%20-%20((x)%20%26%200xFFFF))%20%3E%3E%2016)%0D%0A%25define%20FILLB(b%2C%20n)%20%20((%24%24-(b))%20%26%20((n)-1))%0D%0A%0D%0A%25imacro%20alignx%201-2.nolist%200xFFFF%0D%0A%25%25bs%3A%20%5C%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20MSKLE(16%2C%20FILLB(%24%2C%20%251))%20%26%20FILLB(%24%2C%20%251)%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x90%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20nop%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%209%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8D%2C%200x9C%2C%200x23%2C%200x00%2C%200x00%2C%200x00%2C%200x00%20%20%3B%20lea%20ebx%2C%5Bebx%2B0x00000000%5D%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%207%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8D%2C%200xAC%2C%200x25%2C%200x00%2C%200x00%2C%200x00%2C%200x00%20%20%3B%20lea%20ebp%2C%5Bebp%2B0x00000000%5D%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%206%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8D%2C%200xAD%2C%200x00%2C%200x00%2C%200x00%2C%200x00%20%20%20%20%20%20%20%20%3B%20lea%20ebp%2C%5Bebp%2B0x00000000%5D%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%204%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8D%2C%200x6C%2C%200x25%2C%200x00%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20lea%20ebp%2C%5Bebp%2B0x00%5D%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%203%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8D%2C%200x6D%2C%200x00%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20lea%20ebp%2C%5Bebp%2B0x00%5D%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%202%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x8B%2C%200xED%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20mov%20ebp%2Cebp%0D%0A%20%20times%20MSKLE(FILLB(%25%25bs%2C%20%251)%2C%20%252)%20%26%20FILLB(%24%2C%20%251)%20%2F%201%20%5C%0D%0A%20%20%20%20%20%20%20%20db%200x90%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20nop%0D%0A%25endmacro%0D%0A%0D%0A%3B%20Align%20the%20next%20data%20on%20%7B2%2C4%2C8%2C16%2C..%7D-byte%20boundary.%0D%0A%3B%0D%0A%25imacro%20alignz%201.nolist%0D%0A%20%20%20%20align%20%20%20%20%20%20%20%251%2C%20db%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%20filling%20zeros%0D%0A%25endmacro%0D%0A%0D%0A%25ifdef%20__x86_64__%0D%0A%0D%0A%25imacro%20collect_args%201%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r10%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r10%2C%20rdi%0D%0A%25if%20%251%20%3E%201%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r11%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r11%2C%20rsi%0D%0A%25endif%0D%0A%25if%20%251%20%3E%202%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r12%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r12%2C%20rdx%0D%0A%25endif%0D%0A%25if%20%251%20%3E%203%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r13%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r13%2C%20rcx%0D%0A%25endif%0D%0A%25if%20%251%20%3E%204%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r14%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r14%2C%20r8%0D%0A%25endif%0D%0A%25if%20%251%20%3E%205%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20r15%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20r15%2C%20r9%0D%0A%25endif%0D%0A%25endmacro%0D%0A%0D%0A%25imacro%20uncollect_args%201%0D%0A%25if%20%251%20%3E%205%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r15%0D%0A%25endif%0D%0A%25if%20%251%20%3E%204%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r14%0D%0A%25endif%0D%0A%25if%20%251%20%3E%203%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r13%0D%0A%25endif%0D%0A%25if%20%251%20%3E%202%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r12%0D%0A%25endif%0D%0A%25if%20%251%20%3E%201%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r11%0D%0A%25endif%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20r10%0D%0A%25endmacro%0D%0A%0D%0A%25endif%0D%0A%0D%0A%25define%20RANGE_MASK%20%20(MAXJSAMPLE%20*%204%20%2B%203)%20%20%3B%202%20bits%20wider%20than%20legal%20samples%0D%0A%0D%0A%25define%20ROW(n%2C%20b%2C%20s)%20%20((b)%20%2B%20(n)%20*%20(s))%0D%0A%25define%20COL(n%2C%20b%2C%20s)%20%20((b)%20%2B%20(n)%20*%20(s)%20*%20DCTSIZE)%0D%0A%0D%0A%25define%20DWBLOCK(m%2C%20n%2C%20b%2C%20s)%20%5C%0D%0A%20%20((b)%20%2B%20(m)%20*%20DCTSIZE%20*%20(s)%20%2B%20(n)%20*%20SIZEOF_DWORD)%0D%0A%25define%20MMBLOCK(m%2C%20n%2C%20b%2C%20s)%20%5C%0D%0A%20%20((b)%20%2B%20(m)%20*%20DCTSIZE%20*%20(s)%20%2B%20(n)%20*%20SIZEOF_MMWORD)%0D%0A%25define%20XMMBLOCK(m%2C%20n%2C%20b%2C%20s)%20%5C%0D%0A%20%20((b)%20%2B%20(m)%20*%20DCTSIZE%20*%20(s)%20%2B%20(n)%20*%20SIZEOF_XMMWORD)%0D%0A%25define%20YMMBLOCK(m%2C%20n%2C%20b%2C%20s)%20%5C%0D%0A%20%20((b)%20%2B%20(m)%20*%20DCTSIZE%20*%20(s)%20%2B%20(n)%20*%20SIZEOF_YMMWORD)%0D%0A%25define%20ZMMBLOCK(m%2C%20n%2C%20b%2C%20s)%20%5C%0D%0A%20%20((b)%20%2B%20(m)%20*%20DCTSIZE%20*%20(s)%20%2B%20(n)%20*%20SIZEOF_ZMMWORD)%0D%0A%3B%20--------------------------------------------------------------------------%0D%0A%0D%0A%25define%20DCTSIZE%208%0D%0A%25define%20DCTSIZE2%2064%0D%0A%3B%0D%0A%3B%20--%20jmorecfg.h%0D%0A%3B%0D%0A%25define%20RGB_RED%200%0D%0A%25define%20RGB_GREEN%201%0D%0A%25define%20RGB_BLUE%202%0D%0A%25define%20RGB_PIXELSIZE%203%0D%0A%25define%20EXT_RGB_RED%200%0D%0A%25define%20EXT_RGB_GREEN%201%0D%0A%25define%20EXT_RGB_BLUE%202%0D%0A%25define%20EXT_RGB_PIXELSIZE%203%0D%0A%25define%20EXT_RGBX_RED%200%0D%0A%25define%20EXT_RGBX_GREEN%201%0D%0A%25define%20EXT_RGBX_BLUE%202%0D%0A%25define%20EXT_RGBX_PIXELSIZE%204%0D%0A%25define%20EXT_BGR_RED%202%0D%0A%25define%20EXT_BGR_GREEN%201%0D%0A%25define%20EXT_BGR_BLUE%200%0D%0A%25define%20EXT_BGR_PIXELSIZE%203%0D%0A%25define%20EXT_BGRX_RED%202%0D%0A%25define%20EXT_BGRX_GREEN%201%0D%0A%25define%20EXT_BGRX_BLUE%200%0D%0A%25define%20EXT_BGRX_PIXELSIZE%204%0D%0A%25define%20EXT_XBGR_RED%203%0D%0A%25define%20EXT_XBGR_GREEN%202%0D%0A%25define%20EXT_XBGR_BLUE%201%0D%0A%25define%20EXT_XBGR_PIXELSIZE%204%0D%0A%25define%20EXT_XRGB_RED%201%0D%0A%25define%20EXT_XRGB_GREEN%202%0D%0A%25define%20EXT_XRGB_BLUE%203%0D%0A%25define%20EXT_XRGB_PIXELSIZE%204%0D%0A%25define%20RGBX_FILLER_0XFF%201%0D%0A%3B%20Representation%20of%20a%20single%20sample%20(pixel%20element%20value).%0D%0A%3B%20On%20this%20SIMD%20implementation%2C%20this%20must%20be%20'unsigned%20char'.%0D%0A%3B%0D%0A%25define%20JSAMPLE%20byte%20%3B%20unsigned%20char%0D%0A%25define%20SIZEOF_JSAMPLE%20SIZEOF_BYTE%20%3B%20sizeof(JSAMPLE)%0D%0A%25define%20CENTERJSAMPLE%20128%0D%0A%3B%20Representation%20of%20a%20DCT%20frequency%20coefficient.%0D%0A%3B%20On%20this%20SIMD%20implementation%2C%20this%20must%20be%20'short'.%0D%0A%3B%0D%0A%25define%20JCOEF%20word%20%3B%20short%0D%0A%25define%20SIZEOF_JCOEF%20SIZEOF_WORD%20%3B%20sizeof(JCOEF)%0D%0A%3B%20Datatype%20used%20for%20image%20dimensions.%0D%0A%3B%20On%20this%20SIMD%20implementation%2C%20this%20must%20be%20'unsigned%20int'.%0D%0A%3B%0D%0A%25define%20JDIMENSION%20dword%20%3B%20unsigned%20int%0D%0A%25define%20SIZEOF_JDIMENSION%20SIZEOF_DWORD%20%3B%20sizeof(JDIMENSION)%0D%0A%25define%20JSAMPROW%20POINTER%20%3B%20JSAMPLE%20*%20(jpeglib.h)%0D%0A%25define%20JSAMPARRAY%20POINTER%20%3B%20JSAMPROW%20*%20(jpeglib.h)%0D%0A%25define%20JSAMPIMAGE%20POINTER%20%3B%20JSAMPARRAY%20*%20(jpeglib.h)%0D%0A%25define%20JCOEFPTR%20POINTER%20%3B%20JCOEF%20*%20(jpeglib.h)%0D%0A%25define%20SIZEOF_JSAMPROW%20SIZEOF_POINTER%20%3B%20sizeof(JSAMPROW)%0D%0A%25define%20SIZEOF_JSAMPARRAY%20SIZEOF_POINTER%20%3B%20sizeof(JSAMPARRAY)%0D%0A%25define%20SIZEOF_JSAMPIMAGE%20SIZEOF_POINTER%20%3B%20sizeof(JSAMPIMAGE)%0D%0A%25define%20SIZEOF_JCOEFPTR%20SIZEOF_POINTER%20%3B%20sizeof(JCOEFPTR)%0D%0A%0D%0A%25define%20DCTELEM%20word%20%3B%20short%0D%0A%25define%20SIZEOF_DCTELEM%20SIZEOF_WORD%20%3B%20sizeof(DCTELEM)%0D%0A%25define%20float%20FP32%20%3B%20float%0D%0A%25define%20SIZEOF_FAST_FLOAT%20SIZEOF_FP32%20%3B%20sizeof(float)%0D%0A%3B%20To%20maximize%20parallelism%2C%20Type%20short%20is%20changed%20to%20short.%0D%0A%3B%0D%0A%25define%20ISLOW_MULT_TYPE%20word%20%3B%20must%20be%20short%0D%0A%25define%20SIZEOF_ISLOW_MULT_TYPE%20SIZEOF_WORD%20%3B%20sizeof(ISLOW_MULT_TYPE)%0D%0A%25define%20IFAST_MULT_TYPE%20word%20%3B%20must%20be%20short%0D%0A%25define%20SIZEOF_IFAST_MULT_TYPE%20SIZEOF_WORD%20%3B%20sizeof(IFAST_MULT_TYPE)%0D%0A%25define%20IFAST_SCALE_BITS%202%20%3B%20fractional%20bits%20in%20scale%20factors%0D%0A%25define%20FLOAT_MULT_TYPE%20FP32%20%3B%20must%20be%20float%0D%0A%25define%20SIZEOF_FLOAT_MULT_TYPE%20SIZEOF_FP32%20%3B%20sizeof(FLOAT_MULT_TYPE)%0D%0A%3B%0D%0A%3B%20--%20jsimd.h%0D%0A%3B%0D%0A%25define%20JSIMD_NONE%200x00%0D%0A%25define%20JSIMD_MMX%200x01%0D%0A%25define%20JSIMD_3DNOW%200x02%0D%0A%25define%20JSIMD_SSE%200x04%0D%0A%25define%20JSIMD_SSE2%200x08%0D%0A%25define%20JSIMD_AVX2%200x80%0D%0A%25define%20JSIMD_AVX512%200x200%0D%0A%0D%0A%0D%0A%25define%20RECIPROCAL(m%2C%20n%2C%20b)%20%5C%0D%0A%20%20ZMMBLOCK(DCTSIZE%20*%200%20%2B%20(m)%2C%20(n)%2C%20(b)%2C%20SIZEOF_DCTELEM)%0D%0A%25define%20CORRECTION(m%2C%20n%2C%20b)%20%5C%0D%0A%20%20ZMMBLOCK(DCTSIZE%20*%201%20%2B%20(m)%2C%20(n)%2C%20(b)%2C%20SIZEOF_DCTELEM)%0D%0A%25define%20SCALE(m%2C%20n%2C%20b)%20%5C%0D%0A%20%20ZMMBLOCK(DCTSIZE%20*%202%20%2B%20(m)%2C%20(n)%2C%20(b)%2C%20SIZEOF_DCTELEM)%0D%0A%0D%0Aalign%20%20%20%20%20%20%2032%0D%0A%20%20%20%20GLOBAL_FUNCTION(jsimd_quantize_avx512)%0D%0A%0D%0AEXTN(jsimd_quantize_avx512)%3A%0D%0A%20%20%20%20push%20%20%20%20%20%20%20%20rbp%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20rax%2C%20rsp%0D%0A%20%20%20%20mov%20%20%20%20%20%20%20%20%20rbp%2C%20rsp%0D%0A%20%20%20%20collect_args%203%0D%0A%0D%0A%20%20%20%20vmovdqu32%20%20%20zmm18%2C%20%5BZMMBLOCK(0%2C0%2Cr12%2CSIZEOF_DCTELEM)%5D%0D%0A%20%20%20%20vmovdqu32%20%20%20zmm19%2C%20%5BZMMBLOCK(4%2C0%2Cr12%2CSIZEOF_DCTELEM)%5D%0D%0A%20%20%20%20vpabsw%20%20%20%20%20%20zmm16%2C%20zmm18%0D%0A%20%20%20%20vpabsw%20%20%20%20%20%20zmm17%2C%20zmm19%0D%0A%0D%0A%20%20%20%20vpmovw2m%20%20%20%20%20%20k1%2C%20zmm18%0D%0A%20%20%20%20vpmovw2m%20%20%20%20%20%20k2%2C%20zmm19%0D%0A%0D%0A%20%20%20%20vpaddw%20%20%20%20%20%20zmm16%2C%20ZMMWORD%20%5BCORRECTION(0%2C0%2Cr11)%5D%20%20%3B%20correction%20%2B%20roundfactor%0D%0A%20%20%20%20vpaddw%20%20%20%20%20%20zmm17%2C%20ZMMWORD%20%5BCORRECTION(4%2C0%2Cr11)%5D%0D%0A%20%20%20%20vpmulhuw%20%20%20%20zmm16%2C%20ZMMWORD%20%5BRECIPROCAL(0%2C0%2Cr11)%5D%20%20%3B%20reciprocal%0D%0A%20%20%20%20vpmulhuw%20%20%20%20zmm17%2C%20ZMMWORD%20%5BRECIPROCAL(4%2C0%2Cr11)%5D%0D%0A%20%20%20%20vpmulhuw%20%20%20%20zmm16%2C%20ZMMWORD%20%5BSCALE(0%2C0%2Cr11)%5D%20%20%20%20%20%20%20%3B%20scale%0D%0A%20%20%20%20vpmulhuw%20%20%20%20zmm17%2C%20ZMMWORD%20%5BSCALE(4%2C0%2Cr11)%5D%0D%0A%0D%0A%20%20%20%20vpxorq%20%20%20%20%20%20%20%20zmm20%2C%20zmm20%2C%20zmm20%0D%0A%20%20%20%20vpsubw%20%20%20%20%20%20%20%20zmm16%7Bk1%7D%2C%20zmm20%2C%20zmm16%0D%0A%20%20%20%20vpsubw%20%20%20%20%20%20%20%20zmm17%7Bk2%7D%2C%20zmm20%2C%20zmm17%0D%0A%0D%0A%20%20%20%20vmovdqu32%20%20%20%20%20%5BZMMBLOCK(0%2C0%2Cr10%2CSIZEOF_DCTELEM)%5D%2C%20zmm16%0D%0A%20%20%20%20vmovdqu32%20%20%20%20%20%5BZMMBLOCK(4%2C0%2Cr10%2CSIZEOF_DCTELEM)%5D%2C%20zmm17%0D%0A%0D%0A%20%20%20%20uncollect_args%203%0D%0A%20%20%20%20pop%20%20%20%20%20%20%20%20%20rbp%0D%0A%20%20%20%20ret&syntax=NASM&uArchs=SKL&uArchs=SKX&tools=IACA23&tools=OSACA&tools=CQA&alignment=0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment