Instruction
CFCMOVcc
APX conditionally faulting move: on a false condition, memory is untouched and cannot fault; a register destination gets zero, or a source with NDD.
- Extensions
- Mnemonics
- CFCMOVO, CFCMOVNO, CFCMOVB, CFCMOVC, CFCMOVNAE, CFCMOVNB, CFCMOVNC, CFCMOVAE, CFCMOVZ, CFCMOVE, CFCMOVNZ, CFCMOVNE, CFCMOVBE, CFCMOVNA, CFCMOVNBE, CFCMOVA, CFCMOVS, CFCMOVNS, CFCMOVP, CFCMOVPE, CFCMOVNP, CFCMOVPO, CFCMOVL, CFCMOVNGE, CFCMOVNL, CFCMOVGE, CFCMOVLE, CFCMOVNG, CFCMOVNLE, CFCMOVG
- Forms
- 5 (5 EVEX)
- Data
- Intel XED v2026.08.23
Legacy CMOVcc raises memory faults even when its condition is false, so a load from an address that is only valid when the condition holds cannot become a CMOVcc. CFCMOVcc (“conditionally faulting”) fixes that. When the condition is false, a memory operand is not accessed and cannot fault.
The EVEX ND and NF bits select four variants, and three of them are CFCMOVcc:
| ND | NF | Form | When the condition is false |
|---|---|---|---|
| 0 | 0 | CFCMOVcc reg, r/m | reg becomes zero; a memory source is not read |
| 0 | 1 | CFCMOVcc r/m, reg | a register destination becomes zero; a memory destination is not written |
| 1 | 0 | CMOVcc ndd, reg, r/m | ndd gets reg; the memory source is still read and may fault |
| 1 | 1 | CFCMOVcc ndd, reg, r/m | ndd gets reg; a memory source is not read |
The ND=0, NF=1 form is a conditional store: with a memory destination, nothing is written when the condition is false. As with NDD instructions, a register destination narrower than 64 bits is zero-extended.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
CFCMOVcc r16/32/64, r16/32/64 NF optional
CFCMOVcc_GPRv_GPRv_APX_N3 | EVEX.LLZ.NP.MAP4.SCALABLE 40+cc /r NF=0/1 | APX_F + APX_NCI_NDD_NF |
CFCMOVcc r16/32/64, m16/32/64
CFCMOVcc_GPRv_MEMv_APX_N3 | EVEX.LLZ.NP.MAP4.SCALABLE 40+cc /r | APX_F + APX_NCI_NDD_NF |
CFCMOVcc m16/32/64, r16/32/64 NF
CFCMOVcc_MEMv_GPRv_APX_N3 | EVEX.LLZ.NP.MAP4.SCALABLE 40+cc /r NF=1 | APX_F + APX_NCI_NDD_NF |
CFCMOVcc r16/32/64, r16/32/64, r16/32/64 NDD NF
CFCMOVcc_GPRv_GPRv_GPRv_APX_N3 | EVEX.LLZ.NP.MAP4.SCALABLE 40+cc /r ND=1 NF=1 | APX_F + APX_NCI_NDD_NF |
CFCMOVcc r16/32/64, r16/32/64, m16/32/64 NDD NF
CFCMOVcc_GPRv_GPRv_MEMv_APX_N3 | EVEX.LLZ.NP.MAP4.SCALABLE 40+cc /r ND=1 NF=1 | APX_F + APX_NCI_NDD_NF |
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
if cond(CC):
dest.write(src) # a register destination: bits 63:OSIZE
# cleared, even for 16 bits
elif not dest.is_memory:
dest.write(0) # a register is cleared all the same
# when the condition is false, memory is neither read nor written,
# and cannot faultNot run on a processor: none of these processors has APX.
if cond(CC):
dest.write(src2)
else:
dest.write(src1) # memory is not read, and cannot fault
# the new destination: bits 63:OSIZE cleared, even for 16 bitsNot run on a processor: none of these processors has APX.
Operands
| Operand | Kind | Action |
|---|---|---|
CFCMOVcc r16/32/64, r16/32/64 NF optional | ||
r16/32/64 | explicit | write |
r16/32/64 | explicit | read |
RFLAGS | implicit | read |
CFCMOVcc r16/32/64, m16/32/64 | ||
r16/32/64 | explicit | write |
m16/32/64 | explicit | read |
RFLAGS | implicit | read |
CFCMOVcc m16/32/64, r16/32/64 NF | ||
m16/32/64 | explicit | conditional write |
r16/32/64 | explicit | read |
RFLAGS | implicit | read |
CFCMOVcc r16/32/64, r16/32/64, r/m16/32/64 NDD NF | ||
r16/32/64 | explicit | write |
r16/32/64 | explicit | read |
r/m16/32/64 | explicit | read |
RFLAGS | implicit | read |
Flags
| When | OF | SF | ZF | PF | CF |
|---|---|---|---|---|---|
| All forms | |||||
| CFCMOVB | T | ||||
| CFCMOVBE | T | T | |||
| CFCMOVL | T | T | |||
| CFCMOVLE | T | T | T | ||
| CFCMOVNB | T | ||||
| CFCMOVNBE | T | T | |||
| CFCMOVNL | T | T | |||
| CFCMOVNLE | T | T | T | ||
| CFCMOVNO | T | ||||
| CFCMOVNP | T | ||||
| CFCMOVNS | T | ||||
| CFCMOVNZ | T | ||||
| CFCMOVO | T | ||||
| CFCMOVP | T | ||||
| CFCMOVS | T | ||||
| CFCMOVZ | T | ||||
Exceptions
The exception class is XED's name for the set of exception conditions that a form follows. How to read.
- All forms
APX-EVEX-CFCMOV
Attributes
What else XED records about the forms. How to read.
- Memory forms
- memory fault suppression
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 |
|---|---|---|
APX_F_N3 | APX_F + APX_NCI_NDD_NF | Nova Lake, Diamond Rapids |
More APX instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - Intel Advanced Performance Extensions (Intel APX) Architecture Specification, revision 9.0 (355828-009, August 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 text is our own.