Extensions
Forms
30 (30 Legacy)
Data
Intel XED v2026.08.23

MOV is the plain copy: register to register, memory to register, register or immediate to memory. No form copies memory to memory; MOVS does that, or two MOVs through a register.

Upper bits

Writing a 32-bit register clears bits 63:32, while writing an 8- or 16-bit register keeps the bits above it. So a 32-bit MOV widens an unsigned 32-bit value to 64 bits (GCC 14 and Clang 23 at -O2 compile (uint64_t)x to mov eax, edi), and MOVZX has no 32-to-64-bit form; MOVSXD is the signed counterpart.

Constants

A 64-bit register can take a constant in three encodings, and compilers pick the shortest that fits:

  • B8+r without REX.W, 5 bytes: a 32-bit immediate, zero-extended, for 0 to 4,294,967,295 (mov eax, 1).
  • C7 /0 with REX.W, 7 bytes: a 32-bit immediate, sign-extended, for -2,147,483,648 to -1 (mov rax, -1).
  • B8+r with REX.W, 10 bytes: all 64 bits, the form GNU assemblers write as movabs.

The moffs forms, A0 to A3, also take an 8-byte constant: an absolute address in place of ModRM, with AL, AX, EAX or RAX only.

Atomicity and ordering

An aligned load or store of 1, 2, 4 or 8 bytes is atomic on both vendors’ processors. For unaligned ones the manuals differ: Intel guarantees atomicity within a cache line (P6 and later), AMD only within an aligned quadword. Because x86 keeps loads in order with loads, and stores in order with stores and earlier loads, a plain MOV is already an acquire load or a release store, and both compilers emit MOV for C11’s atomic_load even in its sequentially consistent form. A later load may still pass an earlier store, so for a sequentially consistent atomic_store both emit XCHG, whose implicit lock forbids that.

System registers

The forms for control and debug registers belong to the kernel (CPL 0), and the vendors differ again: on AMD processors that report CPUID Fn8000_0001_ECX[4] (AltMovCr8), a LOCK prefix turns MOV to or from CR0 into the same move for CR8, the task-priority register, which 32-bit code cannot otherwise name; Intel’s manual lists the LOCK prefix as #UD for these forms.

In the optimization guide

What the optimization guide says about MOV, a line per claim. Each links to the claim in the guide, with its sources and where they differ.

Front end

  • Macro-fusion: Newer cores also fuse a register move with the operation after it, which gives the non-destructive three-operand form that the instruction set lacks: Zen 5 for operations on registers and immediates, and Intel’s Redwood Cove for a move or a load followed by an operation, though only when the code runs from the micro-op cache.

Out of order

  • Move elimination: A register-to-register copy can be made at renaming, by pointing the destination at the physical register of the source; the move then has no latency and uses no execution unit.
  • Move elimination: Moves into 8-bit, 16-bit and MMX registers are not eliminated, nor on Intel’s cores a register moved onto itself such as mov eax, eax, and on Intel’s cores elimination can fail when its resources run short.
  • Partial register and flag writes: A write to AL, AH or AX, such as mov al, [rsi], keeps the rest of RAX, so its result must be merged with the old value.

Crestmont and Gracemont

  • Integer execution: Moves, NOPs and zeroing idioms are handled at allocation and may never execute.

Golden Cove and Raptor Cove

  • Integer execution: Register-to-register moves and zeroing idioms are handled when micro-ops are renamed, and adding a small constant to a register sometimes takes no cycle either.

Ice Lake to Rocket Lake

  • Integer execution: On Ice Lake, moves between general registers are no longer removed at renaming, and zeroing idioms take an execution unit. sources differ

Redwood Cove

  • Front end: A register-to-register mov followed by an operation that overwrites the moved-to register, as mov rax, rbx then sub rax, rcx, becomes one micro-op computing rbx - rcx into RAX: the three-operand form the instruction set lacks, with one slot from the queue to retirement.
  • Front end: Redwood Cove fuses a load into a register with the operation on that register that follows it.
  • Front end: Redwood Cove’s load-and-operate fusion takes only some loads, addresses and operations.

Skylake to Cooper Lake

  • Integer execution: xor, sub and the vector pxor, xorps, pandn, psub and pcmpgt of a register with itself zero it without an execution unit, four a cycle, for 32-bit and 64-bit and all vector registers.

Zen and Zen+

  • Integer execution: Register-to-register moves of 32-bit and 64-bit general registers and of XMM registers, and xchg of general registers, take no execution cycle, while a YMM move renames only its lower half and moves the upper one in a pipe. sources differ

Zen 2

  • Integer execution: Register-to-register moves of general registers of 32 and 64 bits, xchg of them and moves of whole XMM and YMM registers take no execution cycle, where Zen 1 moves the upper half of a YMM register in a pipe. sources differ

Zen 3

  • Integer execution: Register-to-register moves of general registers of 32 and 64 bits, xchg of them and moves of whole XMM and YMM registers take no execution cycle, nor do the zeroing idioms such as xor eax, eax and vpxor, which also break the dependency on the old value; sbb eax, eax depends only on the carry flag, and pcmpeqd xmm0, xmm0 sets all ones without waiting. sources differ

Zen 4

  • Integer execution: Register-to-register moves of general registers of 32 and 64 bits, xchg of them and moves of whole vector registers take no execution cycle, nor do the zeroing idioms such as xor eax, eax and vpxor, which also break the dependency on the old value; sbb eax, eax depends only on the carry flag. sources differ

Zen 5

  • Integer execution: New in Zen 5, a register-to-register mov fuses with a following ALU instruction that writes the same register and reads only registers or an immediate, as in mov eax, edi then add eax, esi.
  • Integer execution: Register-to-register moves of 32-bit and 64-bit general registers and of whole vector registers take no execution cycle, nor do the zeroing idioms such as xor eax, eax and vpxor, which also break the dependency on the old value.

Forms

Every encoding of MOV that Intel XED knows, one row per XED instruction form (iform). How to read the notation.
InstructionEncodingRequires
MOV r8, imm8 MOV_GPR8_IMMb_C6r0C6 /0 ibBase instruction set
MOV m8, imm8 MOV_MEMb_IMMbC6 /0 ibBase instruction set
MOV r16/32/64, imm16/32 MOV_GPRv_IMMzC7 /0 iw/idBase instruction set
MOV m16/32/64, imm16/32 MOV_MEMv_IMMzC7 /0 iw/idBase instruction set
MOV r8, r8 MOV_GPR8_GPR8_8888 /rBase instruction set
MOV m8, r8 MOV_MEMb_GPR888 /rBase instruction set
MOV m16/32/64, r16/32/64 MOV_MEMv_GPRv89 /rBase instruction set
MOV r16/32/64, r16/32/64 MOV_GPRv_GPRv_8989 /rBase instruction set
MOV r8, m8 MOV_GPR8_MEMb8A /rBase instruction set
MOV r8, r8 MOV_GPR8_GPR8_8A8A /rBase instruction set
MOV r16/32/64, m16/32/64 MOV_GPRv_MEMv8B /rBase instruction set
MOV r16/32/64, r16/32/64 MOV_GPRv_GPRv_8B8B /rBase instruction set
MOV m16, sreg MOV_MEMw_SEG8C /rBase instruction set
MOV r16/32/64, sreg MOV_GPRv_SEG8C /rBase instruction set
MOV sreg, m16 MOV_SEG_MEMw8E /rBase instruction set
MOV sreg, r16 MOV_SEG_GPR168E /rBase instruction set
MOV AL, m8 MOV_AL_MEMbA0 moffsBase instruction set
MOV rAX, m16/32/64 MOV_OrAX_MEMvA1 moffsBase instruction set
MOV m8, AL MOV_MEMb_ALA2 moffsBase instruction set
MOV m16/32/64, rAX MOV_MEMv_OrAXA3 moffsBase instruction set
MOV r8, imm8 MOV_GPR8_IMMb_B0B0+r ibBase instruction set
MOV r16/32/64, imm16/32/64 MOV_GPRv_IMMvB8+r iw/id/ioBase instruction set
MOV cr, r32 not in 64-bit mode MOV_CR_CR_GPR320F 22 /rBase instruction set
MOV cr, r64 64-bit mode only MOV_CR_CR_GPR640F 22 /rBase instruction set
MOV r32, cr not in 64-bit mode MOV_CR_GPR32_CR0F 20 /rBase instruction set
MOV r64, cr 64-bit mode only MOV_CR_GPR64_CR0F 20 /rBase instruction set
MOV dr, r32 not in 64-bit mode MOV_DR_DR_GPR320F 23 /rBase instruction set
MOV dr, r64 64-bit mode only MOV_DR_DR_GPR640F 23 /rBase instruction set
MOV r32, dr not in 64-bit mode MOV_DR_GPR32_DR0F 21 /rBase instruction set
MOV r64, dr 64-bit mode only MOV_DR_GPR64_DR0F 21 /rBase instruction set

Latency and throughput

What the scheduling models of LLVM 23.1.2 give for each form, not measurements: latency / reciprocal throughput in cycles, the ports under them. A row is a model, or models that agree; a dash, a form that its processors lack. Memory forms: latency from the address, ports without the load and store units. Which processors each model covers.
Modelm8, imm8
m8, r8
r64, imm32
r32, imm32
m16, imm16
m32, imm32
m64, imm32
m16, r16
m32, r32
m64, r64
r8, r8
r16, r16
r8, imm8
r16, imm16
r64, imm64
r32, r32r64, r64r8, m8r16, m16r32, m32
r64, m64
m16, sregr32, sreg
r64, sreg
sreg, m16sreg, r16AL, m8rAX, m16rAX, m32
rAX, m64
m8, AL
m32, rAX
m64, rAX
m16, rAXcr, r64r64, crdr, r64r64, dr
Sandy Bridge1 / 1p4 p231 / 0.33p0151 / 1p4 p231 / 0.33p0151 / 0.33p0151 / 0.33p0155 / 0.5p235 / 0.5p235 / 0.5p231 / 0.33p0151 / 0.33p0156 / 1p51 / 0.33p0151 / 0.33p0151 / 0.33p0151 / 0.33p0151 / 0.33p0151 / 0.33p015100 / 0.33p015100 / 0.33p015100 / 0.33p015100 / 0.33p015
Haswell, Broadwell, Skylake, Skylake-SP1 / 1p23471 / 0.25p01561 / 1p23471 / 0.25p01561 / 0.25p01561 / 0.25p01565 / 0.5p235 / 0.5p235 / 0.5p231 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p0156100 / 0.25p0156100 / 0.25p0156100 / 0.25p0156100 / 0.25p0156
Ice Lake1 / 0.5p47891 / 0.25p01561 / 0.5p47891 / 0.25p01561 / 0.25p01561 / 0.25p01565 / 0.5p235 / 0.5p235 / 0.5p231 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p01561 / 0.25p0156100 / 0.25p0156100 / 0.25p0156100 / 0.25p0156100 / 0.25p0156
Alder Lake, Sapphire Rapids13 / 0.5p47891 / 0.2p0 p1 p5 p6 p1112 / 0.5p47891 / 0.2p0 p1 p5 p6 p110 / 0.2p0 p1 p5 p6 p111 / 06 / 0.33p0 p1 p5 p6 p116 / 0.33p0 p1 p5 p6 p115 / 0.33p2 p3 p1012 / 1p11 / 1p0 p1 p5 p6 p111 / 0.25p01561 / 0.25p01561 / 0.33p0 p1 p5 p6 p115 / 0.33p0 p1 p5 p6 p111 / 0.33p2 p3 p101 / 0.5p0 p1 p5 p6 p115 / 0.5p0 p1 p5 p6 p11100 / 0.25p0156100 / 1p0 p1 p5 p6 p11217 / 12p0 p1 p4 p5 p6 p7 p8 p9 p11181 / 4.8p0 p1 p5 p6 p11
Lunar Lake13 / 0.5p10 p11 p25 p26 p271 / 0.17p01234512 / 0.5p10 p11 p25 p26 p271 / 0.17p0123450 / 0.17p0123451 / 06 / 0.33p0123456 / 0.33p0123454 / 0.33p20 p21 p2212 / 0.5p1351 / 0.33p0123451 / 0.17p0123451 / 0.17p0123451 / 0.33p0123455 / 0.33p0123451 / 0.33p20 p21 p221 / 0.5p0123455 / 0.5p012345100 / 0.17p012345100 / 0.5p012345100 / 0.17p012345100 / 0.17p012345
Bonnell1 / 1p01 / 0.5p011 / 1p01 / 0.5p011 / 0.5p011 / 0.5p011 / 1p01 / 1p01 / 1p01 / 0.5p11 / 0.5p011 / 0.5p11 / 0.5p011 / 0.5p11 / 0.5p11 / 0.5p11 / 0.5p11 / 0.5p1100 / 0.5p01100 / 0.5p01100 / 0.5p01100 / 0.5p01
Silvermont1 / 1IEC0 IEC1 MEC1 / 0.5IEC0 IEC11 / 1IEC0 IEC1 MEC1 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC13 / 1MEC3 / 1MEC3 / 1MEC1 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC11 / 0.5IEC0 IEC1100 / 1FPC0100 / 1FPC0100 / 1FPC0100 / 1FPC0
Piledriver1 / 1AGLU01 Store1 / 1EX0 EX11 / 1AGLU01 Store1 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX15 / 1AGLU01 Load5 / 1AGLU01 Load5 / 1AGLU01 Load1 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX11 / 1EX0 EX1100 / 0.5EX0 EX1100 / 0.5EX0 EX1100 / 0.5EX0 EX1100 / 0.5EX0 EX1
Zen1 / 0.5AGU0 AGU11 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.5AGU0 AGU11 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU34 / 0.5AGU0 AGU15 / 0.5ALU0 ALU1 ALU2 ALU34 / 0.5AGU0 AGU11 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU3100 / 0.25100 / 0.25100 / 0.25100 / 0.25
Zen 21 / 0.33AGU0 AGU1 AGU21 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.33AGU0 AGU1 AGU21 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU34 / 0.33AGU0 AGU1 AGU25 / 0.33ALU0 ALU1 ALU2 ALU34 / 0.33AGU0 AGU1 AGU21 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU3100 / 0.25100 / 0.25100 / 0.25100 / 0.25
Zen 3, Zen 41 / 1AGU0 AGU1 AGU2 LSU Store1 / 0.5ALU0 ALU1 ALU2 ALU31 / 1AGU0 AGU1 AGU2 LSU Store1 / 1ALU0 ALU1 ALU2 ALU30 / 0.170 / 0.175 / 1AGU0 AGU1 AGU2 LSU Load5 / 1AGU0 AGU1 AGU2 LSU Load5 / 0.33AGU0 AGU1 AGU2 LSU Load1 / 1ALU0 ALU1 ALU2 ALU31 / 1ALU0 ALU1 ALU2 ALU31 / 1ALU0 ALU1 ALU2 ALU31 / 1ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU31 / 0.25ALU0 ALU1 ALU2 ALU3100 / 25ALU0 ALU1 ALU2 ALU3100 / 25ALU0 ALU1 ALU2 ALU3100 / 25ALU0 ALU1 ALU2 ALU3100 / 25ALU0 ALU1 ALU2 ALU3
Jaguar1 / 1SAGU1 / 0.5ALU0 ALU11 / 1SAGU1 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU13 / 1LAGU3 / 1LAGU3 / 1LAGU1 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU11 / 0.5ALU0 ALU1100 / 0.5ALU0 ALU1100 / 0.5ALU0 ALU1100 / 0.5ALU0 ALU1100 / 0.5ALU0 ALU1

Operation

What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.

MOV r/m8, imm8 MOV r/m8, r8 MOV r8, r/m8 MOV AL, m8 MOV m8, AL MOV r/m16/32/64, imm16/32 MOV r/m16/32/64, r16/32/64 MOV r16/32/64, r/m16/32/64 MOV rAX, m16/32/64 MOV m16/32/64, rAX MOV r16/32/64, imm16/32/64
v = sext(src)                    # only an imm32 to a 64-bit operand is
                                 # sign-extended; imm64 fills all 64 bits
dest.write(v)                    # a 32-bit register: bits 63:32 cleared

Run on AMD Zen 5 (EPYC 9645) and an Intel processor under KVM (model hidden): 358 cases.

MOV m16, sreg MOV r16/32/64, sreg
dest.write(src)                  # the 16-bit selector: m16 whatever the
                                 # operand size; a 32- or 64-bit register
                                 # gets it zero-extended, a 16-bit one
                                 # keeps bits 63:16

Run on AMD Zen 5 (EPYC 9645) and an Intel processor under KVM (model hidden): 72 cases.

MOV sreg, r/m16
if dest.number == 1:
    fault(UD)                    # MOV cannot load CS
load_segment(dest, src)          # checks the descriptor the selector
                                 # names: #GP(sel), #SS(sel), #NP(sel)
# FS and GS also take its base, or 0 with a null selector (Zen 5,
# as AMD's NullSelectorClearsBase has it)
# after MOV SS, interrupts and most debug exceptions wait until
# the next instruction is done, so that it can load RSP

Run on AMD Zen 5 (EPYC 9645): 57 cases.

MOV cr, r32 not in 64-bit mode MOV cr, r64 64-bit mode only
n = dest.number
if n not in (0, 2, 3, 4, 8):
    fault(UD)                    # CR1, CR5 to CR7 and CR9 to CR15
if CPL != 0:
    fault(GP, 0)
v = src.read()                   # MOV cr, r32 (outside 64-bit mode):
                                 # zero-extended to 64 bits
if n == 0:
    if v >> 32 != 0:
        fault(GP, 0)             # bits 63:32 are reserved
    if (v >> 29 & 3) == 1:
        fault(GP, 0)             # NW set with CD clear
    if v >> 31 == 0:
        fault(GP, 0)             # PG clear, which 64-bit mode forbids
    if cr4 >> 23 & 1 and (v >> 16 & 1) == 0:
        fault(GP, 0)             # WP clear while CR4.CET is set
if n == 3 and cr4 >> 17 & 1:
    v &= ~(1 << 63)              # with PCIDE, bit 63 set keeps the TLB
                                 # entries of the PCID; it is not stored
if n == 4:
    if (v >> 5 & 1) == 0:
        fault(GP, 0)             # PAE clear (64-bit mode)
    if (v ^ cr4) >> 12 & 1:
        fault(GP, 0)             # LA57 changed (64-bit mode)
    if (cr4 >> 17 & 1) == 0 and v >> 17 & 1:
        if cr3 & 0xFFF:
            fault(GP, 0)         # PCIDE set while CR3 names a PCID
    if v >> 23 & 1 and (cr0 >> 16 & 1) == 0:
        fault(GP, 0)             # CET set while CR0.WP is clear
if n == 8 and v >> 4 != 0:
    fault(GP, 0)                 # CR8 is the 4-bit task priority
# also #GP(0) for a 1 in a bit the processor reserves: CR3 bits
# from MAXPHYADDR up, CR4 bits of features it lacks
dest.write(v)                    # CR0, CR3 and CR4 writes can flush TLBs
of = sf = zf = af = pf = cf = UNDEFINED

Not run on a processor: control registers can be written at CPL 0 only.

MOV r32, cr not in 64-bit mode MOV r64, cr 64-bit mode only
if src.number not in (0, 2, 3, 4, 8):
    fault(UD)                    # CR1, CR5 to CR7 and CR9 to CR15
if CPL != 0:
    fault(GP, 0)
dest.write(src)                  # CR8 reads as the task priority, bits
                                 # 3:0; MOV r32, cr keeps bits 31:0
of = sf = zf = af = pf = cf = UNDEFINED

Not run on a processor: control registers can be read at CPL 0 only.

MOV dr, r32 not in 64-bit mode MOV dr, r64 64-bit mode only
n = dest.number
if n > 7:
    fault(UD)                    # DR8 to DR15 do not exist
if CPL != 0:
    fault(GP, 0)
if n in (4, 5) and cr4 >> 3 & 1:
    fault(UD)                    # with CR4.DE, DR4 and DR5 do not exist
if dr7 >> 13 & 1:
    fault(DB)                    # DR7.GD guards the debug registers
v = src.read()
if n in (4, 5):
    n += 2                       # otherwise they are DR6 and DR7
if n >= 6 and v >> 32 != 0:
    fault(GP, 0)                 # bits 63:32 of DR6 and DR7 are reserved
if n == 6:
    dr6 = v
elif n == 7:
    dr7 = v
else:
    dest.write(v)
of = sf = zf = af = pf = cf = UNDEFINED

Not run on a processor: debug registers can be written at CPL 0 only.

MOV r32, dr not in 64-bit mode MOV r64, dr 64-bit mode only
n = src.number
if n > 7:
    fault(UD)                    # DR8 to DR15 do not exist
if CPL != 0:
    fault(GP, 0)
if n in (4, 5) and cr4 >> 3 & 1:
    fault(UD)                    # with CR4.DE, DR4 and DR5 do not exist
if dr7 >> 13 & 1:
    fault(DB)                    # DR7.GD guards the debug registers
if n == 4:
    dest.write(dr6)              # without CR4.DE, DR4 and DR5 are DR6
elif n == 5:                     # and DR7
    dest.write(dr7)
else:
    dest.write(src)
of = sf = zf = af = pf = cf = UNDEFINED

Not run on a processor: debug registers can be read at CPL 0 only.

Operands

What each form reads and writes, as Intel XED records it: the operands of its syntax, in order, and the implicit ones that the syntax does not name. How to read.
OperandKindAction
MOV r/m8, imm8 MOV r/m16/32/64, imm16/32
r/m8/16/32/64explicitwrite
imm8/16/32explicitread
MOV r/m8, r8 MOV r/m16/32/64, r16/32/64
r/m8/16/32/64explicitwrite
r8/16/32/64explicitread
MOV r8, r/m8 MOV r16/32/64, r/m16/32/64
r8/16/32/64explicitwrite
r/m8/16/32/64explicitread
MOV m16, sreg
m16explicitwrite
sregexplicitread
MOV r16/32/64, sreg
r16/32/64explicitwrite
sregexplicitread
MOV sreg, r/m16
sregexplicitwrite
r/m16explicitread
MOV AL, m8 MOV rAX, m16/32/64
AL, rAXexplicitwrite
m8/16/32/64explicitread
MOV m8, AL MOV m16/32/64, rAX
m8/16/32/64explicitwrite
AL, rAXexplicitread
MOV r16/32/64, imm16/32/64
r16/32/64explicitwrite
imm16/32/64explicitread
MOV cr, r32 not in 64-bit mode MOV cr, r64 64-bit mode only
crexplicitwrite
r32/64explicitread
MOV r32, cr not in 64-bit mode MOV r64, cr 64-bit mode only
r32/64explicitwrite
crexplicitread
MOV dr, r32 not in 64-bit mode MOV dr, r64 64-bit mode only
drexplicitwrite
r32/64explicitread
MOV r32, dr not in 64-bit mode MOV r64, dr 64-bit mode only
r32/64explicitwrite
drexplicitread

Flags

None: XED records no flag that the forms test or change.

Attributes

What else XED records about the forms. How to read.

MOV cr, r32 not in 64-bit mode MOV r32, cr not in 64-bit mode MOV dr, r32 not in 64-bit mode MOV r32, dr not in 64-bit mode MOV cr, r64 64-bit mode only MOV r64, cr 64-bit mode only MOV dr, r64 64-bit mode only MOV r64, dr 64-bit mode only
privileged: CPL 0 only
MOV sreg, r/m16 MOV cr, r32 not in 64-bit mode MOV dr, r32 not in 64-bit mode MOV cr, r64 64-bit mode only MOV dr, r64 64-bit mode only
may abort a TSX transaction
MOV m8, imm8 MOV m8, r8 MOV m16/32/64, imm16/32 MOV m16/32/64, r16/32/64
accepts XRELEASE

CPUID and processors

Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.

CPUID requirements and processors of the XED ISA sets above. Alternatives are separated by “or”; processors follow XED’s chip model, whose AMD processors end with Zen 2, and the CPU data of this site for Zen 3 to Zen 6.
ISA setCPUIDProcessors
I86

No CPUID bit: part of the base instruction set.

Every x86-64 processor in XED’s model and Zen 3 to Zen 6

More General-purpose instructions

All 109 General-purpose instructions

Sources

  1. Intel XED v2026.08.23 (commit 0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model.
  2. The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s -march feature sets and AMD’s Processor Programming References, which the page of each processor cites.
  3. LLVM 23.1.2's x86 scheduling models (commit 85ac56026243): the latency, reciprocal throughput and ports of each form, as llvm-mca reports them.
  4. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2B, page 4-28 (MOV); Volume 2B, page 4-32 (MOV); Volume 2B, page 4-35 (MOV)
  5. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
  6. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3 (325384-093, September 2026)
  7. AMD64 Architecture Programmer's Manual, Volume 2: System Programming (24593, rev. 3.46, October 2026)
  8. AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (24594, rev. 3.39, October 2026)

The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The timings come from LLVM's scheduling models, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.