Extensions
Forms
12 (4 Legacy, 8 EVEX)
Data
Intel XED v2026.08.23

MUL is the unsigned multiplication, and it has a single shape: rAX times the operand, with the whole product, twice as wide, in rDX:rAX (in AX for bytes, AH holding the upper half). RDX is written even when the upper half is 0, and no form takes an immediate or another destination.

The upper half

MUL exists for the upper half. When only the lower one is needed, compilers use the two-operand IMUL, whose low bits are the same for unsigned numbers and which names its registers freely: GCC 14 and Clang 23 at -O2 compile a * b on uint64_t to imul rax, rsi. A 32-bit by 32-bit product needs no MUL either, since both factors fit in 64-bit registers: (uint64_t)a * b with 32-bit a and b becomes two zero-extending MOVs and a 64-bit IMUL.

The upper half of a 64-bit product is where MUL appears:

  • (unsigned __int128)a * b becomes a MOV of one factor into RAX and a MUL by the other, which leaves the product exactly where the System V ABI returns an __int128, in RDX:RAX; ((unsigned __int128)a * b) >> 64 adds mov rax, rdx.
  • Unsigned division of a 64-bit value by a constant keeps the upper half of a product with a scaled reciprocal: x / 10 becomes a MOVABS of 0xCCCCCCCCCCCCCCCD, a MUL, and a right shift of the upper half by 3 (see DIV).
  • __builtin_mul_overflow on two uint64_ts is MUL followed by seto al: MUL sets CF and OF together when the upper half is not 0, that is when the product does not fit in 64 bits.

MULX

MULX from BMI2 is MUL with free choice of its two destination registers, one source still fixed in RDX, and no flags written. With -mbmi2, GCC uses it for the 128-bit product and Clang also for the upper half alone and the division by a constant; an overflow check still needs MUL, for its flags.

On Zen 5, AMD’s guide gives a 64-bit by 64-bit multiplication a latency of 3 cycles, fully pipelined, and one cycle more for the second result of an instruction with two destination registers, such as MUL (Section 2.10.2).

In the optimization guide

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

Bulldozer to Excavator

  • Integer execution: EX1’s pipelined multiplier takes 4 cycles for operands of up to 32 bits, starting one every 2 cycles, and 6 for 64-bit operands, starting one every 4; LLVM’s model agrees.

Golden Cove and Raptor Cove

  • Integer execution: A MUL of 64 by 64 bits into RDX:RAX is two micro-ops: the low half on port 1 and the high half on port 5, four cycles in LLVM’s models against three for an IMUL that keeps only the low half.

Jaguar and Puma

  • Integer execution: The pipelined multiplier takes 3 cycles for operands of up to 32 bits, one a cycle, and 6 for 64-bit ones, one every 4; a form that writes two registers, such as MUL, adds a cycle to both. sources differ

Sandy Bridge and Ivy Bridge

  • Integer and vector execution: Separate multipliers serve general-purpose and vector registers: a general-purpose multiply runs on port 1 at a latency of 3 cycles, a vector one on port 0 at 5 cycles for any precision, and both run one operation a cycle.

Silvermont to Goldmont Plus

Skylake to Cooper Lake

  • Integer execution: A MUL of 64 by 64 bits into RDX:RAX is two micro-ops on ports 1 and 5 and takes four cycles in LLVM’s models, against three for an IMUL that keeps only the low half.

Zen and Zen+

  • Integer execution: One ALU multiplies, up to 64 by 64 bits in three cycles, pipelined; a multiplication with two destination registers delivers the second a cycle later and starts only every other cycle. sources differ

Zen 2

  • Integer execution: One ALU multiplies, 64 by 64 bits in three cycles and pipelined; a multiplication that writes two registers delivers the second a cycle later and starts only every other cycle.

Zen 3

  • Integer execution: Only ALU 1 multiplies, 64 by 64 bits in three cycles and pipelined; a multiplication that writes two registers delivers the second one a cycle later.

Zen 4

  • Integer execution: Only one ALU multiplies, 64 by 64 bits in three cycles and pipelined; a multiplication that writes two registers delivers the second one a cycle later.

Zen 5

  • Integer execution: Three ALUs multiply, 64 by 64 bits in three cycles; a multiplication that writes two registers delivers the second one a cycle later.

Forms

Every encoding of MUL that Intel XED knows, one row per XED instruction form (iform). How to read the notation.
InstructionEncodingRequires
MUL m8 MUL_MEMbF6 /4Base instruction set
MUL r8 MUL_GPR8F6 /4Base instruction set
MUL m16/32/64 MUL_MEMvF7 /4Base instruction set
MUL r16/32/64 MUL_GPRvF7 /4Base instruction set
MUL r8 MUL_GPR8i8_APXEVEX.LLZ.NP.MAP4.WIG F6 /4APX_F
MUL m8 MUL_MEMi8_APXEVEX.LLZ.NP.MAP4.WIG F6 /4APX_F
MUL r8 NF MUL_GPR8i8_APX_N3EVEX.LLZ.NP.MAP4.WIG F6 /4 NF=1APX_F + APX_NCI_NDD_NF
MUL m8 NF MUL_MEMi8_APX_N3EVEX.LLZ.NP.MAP4.WIG F6 /4 NF=1APX_F + APX_NCI_NDD_NF
MUL r16/32/64 MUL_GPRv_APXEVEX.LLZ.NP.MAP4.SCALABLE F7 /4APX_F
MUL m16/32/64 MUL_MEMv_APXEVEX.LLZ.NP.MAP4.SCALABLE F7 /4APX_F
MUL r16/32/64 NF MUL_GPRv_APX_N3EVEX.LLZ.NP.MAP4.SCALABLE F7 /4 NF=1APX_F + APX_NCI_NDD_NF
MUL m16/32/64 NF MUL_MEMv_APX_N3EVEX.LLZ.NP.MAP4.SCALABLE F7 /4 NF=1APX_F + APX_NCI_NDD_NF

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.
Modelm8r8m16m32m64r16r32r64
Sandy Bridge8 / 1p13 / 1p19 / 1.33p0159 / 1p0159 / 1p014 / 1.33p0154 / 1p0154 / 1p01
Haswell8 / 1p13 / 1p19 / 1p01569 / 1p01569 / 1p164 / 1p01564 / 1p01564 / 1p16
Broadwell, Skylake, Skylake-SP, Ice Lake8 / 1p13 / 1p19 / 1p01569 / 1p01569 / 1p154 / 1p01564 / 1p01564 / 1p15
Alder Lake, Sapphire Rapids8 / 1p13 / 1p110 / 1p0 p1 p5 p6 p119 / 1p0 p1 p5 p6 p119 / 1p155 / 1p0 p1 p5 p6 p114 / 1p0 p1 p5 p6 p114 / 1p15
Lunar Lake7 / 0.33p1353 / 0.33p1359 / 0.67p0123458 / 0.33p0123458 / 0.33p0123455 / 0.67p0123454 / 0.33p0123454 / 0.33p012345
Bonnell7 / 7p17 / 7p018 / 8p17 / 7p112 / 12p17 / 7p016 / 6p0112 / 12p01
Silvermont8 / 5IEC1 MEC5 / 5IEC18 / 5IEC1 MEC8 / 5IEC1 MEC10 / 7IEC1 MEC5 / 5IEC15 / 5IEC17 / 7IEC1
Piledriver8 / 4EX1 Mul4 / 4EX1 Mul8 / 5EX1 Mul8 / 4EX1 Mul10 / 6EX1 Mul4 / 5EX1 Mul4 / 4EX1 Mul6 / 6EX1 Mul
Zen8 / 1ALU1 Mul4 / 1ALU1 Mul8 / 1ALU1 Mul8 / 1ALU1 Mul9 / 1ALU1 Mul3 / 1ALU1 Mul3 / 1ALU1 Mul4 / 1ALU1 Mul
Zen 28 / 1ALU1 Mul4 / 1ALU1 Mul7 / 1ALU1 Mul7 / 1ALU1 Mul8 / 1ALU1 Mul3 / 1ALU1 Mul3 / 1ALU1 Mul4 / 1ALU1 Mul
Zen 3, Zen 47 / 3ALU13 / 3ALU17 / 3ALU17 / 3ALU17 / 3ALU13 / 3ALU13 / 3ALU13 / 3ALU1
Jaguar6 / 1ALU1 Mul3 / 1ALU1 Mul6 / 3ALU1 Mul6 / 2ALU1 Mul9 / 4ALU1 Mul3 / 3ALU1 Mul3 / 2ALU1 Mul6 / 4ALU1 Mul

Operation

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

p = rAX * src                    # AL, AX, EAX or RAX times the source: a
                                 # product of 2 * OSIZE bits
if OSIZE == 8:
    ax = p                       # AH:AL
else:                            # EDX and EAX: bits 63:32 cleared
    rDX = p >> OSIZE             # the high half
    rAX = p                      # the low half
if not nf:                       # NF=1 (APX) leaves the flags as they were
    cf = of = p >> OSIZE != 0    # the high half is not zero
    sf = zf = af = pf = UNDEFINED

Run on AMD Zen 5 (EPYC 9645): 120 cases. The APX forms were not run: none of these processors has APX.

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
MUL r/m8
r/m8explicitread
ALimplicitread
AXimplicitwrite
RFLAGSimplicitwrite
MUL r/m16/32/64
r/m16/32/64explicitread
rAXimplicitread, write
rDXimplicitwrite
RFLAGSimplicitwrite
MUL r/m8 NF
r/m8explicitread
ALimplicitread
AXimplicitwrite
MUL r/m16/32/64 NF
r/m16/32/64explicitread
rAXimplicitread, write
rDXimplicitwrite

Flags

M modified, U undefined; blank: not affected. How to read.
OFSFZFAFPFCF
NF forms
Not affected
Other forms
MUUUUM

Exceptions

The exception class is XED's name for the set of exception conditions that a form follows. How to read.

Legacy forms
none in XED
EVEX forms
APX-EVEX-INT

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
APX_F

APX_F
CPUID.(EAX=07H,ECX=1):EDX[21] APX_F

Nova Lake, Diamond Rapids
APX_F_N3

APX_F + APX_NCI_NDD_NF
CPUID.(EAX=07H,ECX=1):EDX[21] APX_F
CPUID.(EAX=29H,ECX=0):EBX[0] APX_NCI_NDD_NF

Same as APX_F

More General-purpose instructions

All 109 General-purpose instructions

More APX instructions

All 88 APX 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-140 (MUL)
  5. Intel Advanced Performance Extensions (Intel APX) Architecture Specification, revision 9.0 (355828-009, August 2026)
  6. AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (24594, rev. 3.39, October 2026)
  7. Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP

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.