X86 Opcode and Instruction Reference

January 1, 2026 ยท View on GitHub

Work-in-progress repository. For more see ref.x86asm.net.

More on processors codes

The "introduced with processor" (XML proc_start) really made sense only up to some of the early Pentium processors. However, the XML reference codes until 13 (Core i7) are not going to be reconsidered because of backwards compatibility. For future, it is proposed to use Intel processor families instead:

Intel CPU FamilyHTML editions codeXML reference codeIntroducedNew instructions, ISA additionsNotes
Nehalem, BloomfieldC7132008SSE4.2, POPCNTalready implemented
Westmere, GulftownWM142010AES-NI, PCLMULQDQ
Sandy BridgeSB152011AVX
Ivy BridgeIB162012RDRAND, F16C, FSGSBASE
HaswellHW172013AVX2, FMA3, BMI1/BMI2, TSX (HLE/RTM)
Broadwell-YBW182014ADX (ADCX/ADOX), RDSEED, PREFETCHW, SMAP
SkylakeSL192015SGX, MPX, XSAVEC/XSAVES, CLFLUSHOPT
Kaby LakeKL202016PTWRITE
Knights LandingKN212016AVX-512 (first shipping implementation)
Cannon LakeCL222018AVX-512 IFMA, AVX-512 VBMI
Cascade Lake-SPCA232019AVX-512 VNNI
Ice LakeIL242019GFNI, VAES, VPCLMULQDQ, AVX-512 VNNI; other AVX-512 add-ons like VBMI2, BITALG, VPOPCNTDQ
TremontTR252020WAITPKG (UMONITOR/UMWAIT/TPAUSE)
Alder LakeAL262021AVX-VNNI, new instructions like SERIALIZE, HRESET

Notes on Addressing Methods

The J method

Might be confusing. For example, Jbs actually reads as: "Relative offset to be added to the IP register. The relative offset is sign-extended to the size of of the IP register."

This method is always used as a source operand. To make it completely correct, it should be a destination operand but it would make the byte value also the destination and that doesn't make much sense. This would need to be solved by introducing new types of operands but I don't think it's worth it.

Notes on Operand Type codes

SIMD FP instructions with integer codes

There are several MOV-like SIMD instructions that operate on floating-point data but their operands are indicated as integer ones. For example MOVHLPS Vq, Uq means "Move two packed single precision floating-point values from high quadword of source XMM register to low quadword of destination XMM register", however, all the Intel manuals from the pre-AVX era doesn't indicate its operands as packed single FP values (ps code) in the opcode map. This is presumably because the operands are treated as integers during the move operation.

The newer manuals from the AVX era indicate this instruction as VMOVHLPS Vq, Hq, Uq in the opcode map, making it unclear how the non-AVX version should look like. Anyway, even the AVX version uses integer codes.