Instruction
CQO
Sign-extends RAX into RDX:RAX, filling RDX with the sign bit of RAX, typically before a 64-bit IDIV (AT&T cqto); 64-bit mode only.
- Extensions
- Forms
- 1 (1 Legacy)
- Data
- Intel XED v2026.08.23
CQO fills RDX with copies of the sign bit of RAX, so that RDX:RAX holds
the value of RAX as a signed 128-bit number. That is the dividend
IDIV takes, and the two come in pairs: GCC 14 at -O2
compiles a / b on two longs to mov rax, rdi, cqo and
idiv rsi, and a % b the same way, with the remainder taken from
RDX. CQO changes no flag.
The family
Opcode 99 extends rAX into rDX at each operand size, and 98 extends the lower half of rAX into the whole of it:
Both compilers divide ints, and shorts too, with CDQ and a 32-bit
IDIV.
Signed and unsigned
The unsigned DIV needs zeros in the upper half instead,
which compilers write with xor edx, edx. Mixing the two up is a
classic bug: CQO before DIV turns a dividend with its top bit set into
one whose upper half is all ones, and DIV then raises #DE, as the
quotient cannot fit. Intel’s optimization manual notes that CDQ and
CWD cost as many micro-ops as the MOV and shift they replace, being
only shorter, and suggests the XOR when the dividend is known not to be
negative (Section 3.5.1.1).
Clang 23 uses the XOR on a path of its own. For a / b on longs it
first checks whether both operands fit in 32 bits, with
or rcx, rsi on a copy of a and shr rcx, 32, and if they do, it
divides with xor edx, edx and a 32-bit DIV; only otherwise does it
run CQO and the 64-bit IDIV.
Other ways to the sign
CQO writes only RDX, and only from RAX. A sign mask in any other
register is a SAR by 63, which both compilers emit for
x >> 63 on a long. To widen a long to __int128, GCC uses CQO
and Clang a MOV and a SAR.
In the optimization guide
What the optimization guide says about CQO, a line per claim. Each links to the claim in the guide, with its sources and where they differ.
Zen 4
- Integer execution:
xor edx, edxbefore DIV, or CDQ or CQO before IDIV, with the same operand size and a divisor in a register other than rDX, saves a macro-op: the pair is dispatched as one fewer.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
CQO 64-bit mode only
CQO | REX.W 99 | LM |
Latency and throughput
| Model | CQO |
|---|---|
| Sandy Bridge | 1 / 0.5p05 |
| Haswell, Broadwell, Skylake, Skylake-SP, Ice Lake, Alder Lake, Sapphire Rapids | 1 / 0.5p06 |
| Lunar Lake | 1 / 0.33p024 |
| Bonnell | 4 / 2p01 |
| Silvermont | 1 / 0.5IEC0 IEC1 |
| Piledriver | 1 / 1EX0 EX1 |
| Zen, Zen 2, Zen 3, Zen 4 | 1 / 0.25ALU0 ALU1 ALU2 ALU3 |
| Jaguar | 1 / 0.5ALU0 ALU1 |
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
rdx = -1 if msb(rax) else 0Run on AMD Zen 5 (EPYC 9645): 8 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
CQO 64-bit mode only | ||
RDX | implicit | write |
RAX | implicit | read |
Flags
None: XED records no flag that the forms test or change.
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.
| ISA set | CPUID | Processors |
|---|---|---|
LONGMODE | LM | Every x86-64 processor in XED’s model and Zen 3 to Zen 6 |
More General-purpose instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s
-marchfeature sets and AMD’s Processor Programming References, which the page of each processor cites. - LLVM 23.1.2's x86 scheduling models (commit
85ac56026243): the latency, reciprocal throughput and ports of each form, as llvm-mca reports them. - Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2A, page 3-257 (CWD/
CDQ/ CQO) - AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions (24594, rev. 3.39, October 2026)
- Intel 64 and IA-32 Architectures Optimization Reference Manual, Volume 1 (248966-051, 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.