| Opcode | Encoding | 16-bit | 32-bit | 64-bit | Description |
|---|---|---|---|---|---|
0F 40 /rCMOVO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "overflow" (EFLAGS.OF = 1). |
0F 40 /rCMOVO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "overflow" (EFLAGS.OF = 1). |
REX.W 0F 40 /rCMOVO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "overflow" (EFLAGS.OF = 1). |
0F 41 /rCMOVNO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not overflow" (EFLAGS.OF = 0). |
0F 41 /rCMOVNO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not overflow" (EFLAGS.OF = 0). |
REX.W 0F 41 /rCMOVNO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not overflow" (EFLAGS.OF = 0). |
0F 42 /rCMOVB r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "below" (EFLAGS.CF = 1). |
0F 42 /rCMOVC r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "carry" (EFLAGS.CF = 1). |
0F 42 /rCMOVNAE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not above or equal" (EFLAGS.CF = 1). |
0F 42 /rCMOVB r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "below" (EFLAGS.CF = 1). |
0F 42 /rCMOVC r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "carry" (EFLAGS.CF = 1). |
0F 42 /rCMOVNAE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not above or equal" (EFLAGS.CF = 1). |
REX.W 0F 42 /rCMOVB r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "below" (EFLAGS.CF = 1). |
REX.W 0F 42 /rCMOVC r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "carry" (EFLAGS.CF = 1). |
REX.W 0F 42 /rCMOVNAE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not above or equal" (EFLAGS.CF = 1). |
0F 43 /rCMOVAE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "above or equal" (EFLAGS.CF = 0). |
0F 43 /rCMOVNB r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not below" (EFLAGS.CF = 0). |
0F 43 /rCMOVNC r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not carry" (EFLAGS.CF = 0). |
0F 43 /rCMOVAE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "above or equal" (EFLAGS.CF = 0). |
0F 43 /rCMOVNB r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not below" (EFLAGS.CF = 0). |
0F 43 /rCMOVNC r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not carry" (EFLAGS.CF = 0). |
REX.W 0F 43 /rCMOVAE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "above or equal" (EFLAGS.CF = 0). |
REX.W 0F 43 /rCMOVNB r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not below" (EFLAGS.CF = 0). |
REX.W 0F 43 /rCMOVNC r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not carry" (EFLAGS.CF = 0). |
0F 44 /rCMOVE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "equal" (EFLAGS.ZF = 1). |
0F 44 /rCMOVZ r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "zero" (EFLAGS.ZF = 1). |
0F 44 /rCMOVE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "equal" (EFLAGS.ZF = 1). |
0F 44 /rCMOVZ r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "zero" (EFLAGS.ZF = 1). |
REX.W 0F 44 /rCMOVE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "equal" (EFLAGS.ZF = 1). |
REX.W 0F 44 /rCMOVZ r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "zero" (EFLAGS.ZF = 1). |
0F 45 /rCMOVNE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not equal" (EFLAGS.ZF = 0). |
0F 45 /rCMOVNZ r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not zero" (EFLAGS.ZF = 0). |
0F 45 /rCMOVNE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not equal" (EFLAGS.ZF = 0). |
0F 45 /rCMOVNZ r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not zero" (EFLAGS.ZF = 0). |
REX.W 0F 45 /rCMOVNE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not equal" (EFLAGS.ZF = 0). |
REX.W 0F 45 /rCMOVNZ r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not zero" (EFLAGS.ZF = 0). |
0F 46 /rCMOVBE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "below or equal" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
0F 46 /rCMOVNA r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not above" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
0F 46 /rCMOVBE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "below or equal" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
0F 46 /rCMOVNA r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not above" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
REX.W 0F 46 /rCMOVBE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "below or equal" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
REX.W 0F 46 /rCMOVNA r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not above" (EFLAGS.CF = 1 and EFLAGS.ZF = 1). |
0F 47 /rCMOVA r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "above" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
0F 47 /rCMOVNBE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not below or equal" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
0F 47 /rCMOVA r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "above" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
0F 47 /rCMOVNBE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not below or equal" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
REX.W 0F 47 /rCMOVA r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "above" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
REX.W 0F 47 /rCMOVNBE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not below or equal" (EFLAGS.CF = 0 and EFLAGS.ZF = 0). |
0F 48 /rCMOVS r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "sign" (EFLAGS.SF = 1). |
0F 48 /rCMOVS r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "sign" (EFLAGS.SF = 1). |
REX.W 0F 48 /rCMOVS r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "sign" (EFLAGS.SF = 1). |
0F 49 /rCMOVNS r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not sign" (EFLAGS.SF = 0). |
0F 49 /rCMOVNS r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not sign" (EFLAGS.SF = 0). |
REX.W 0F 49 /rCMOVNS r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not sign" (EFLAGS.SF = 0). |
0F 4A /rCMOVP r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity" (EFLAGS.PF = 1). |
0F 4A /rCMOVPE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity even" (EFLAGS.PF = 1). |
0F 4A /rCMOVP r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity" (EFLAGS.PF = 1). |
0F 4A /rCMOVPE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity even" (EFLAGS.PF = 1). |
REX.W 0F 4A /rCMOVP r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity" (EFLAGS.PF = 1). |
REX.W 0F 4A /rCMOVPE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity even" (EFLAGS.PF = 1). |
0F 4B /rCMOVNP r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not parity" (EFLAGS.PF = 0). |
0F 4B /rCMOVPO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity odd" (EFLAGS.PF = 0). |
0F 4B /rCMOVNP r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not parity" (EFLAGS.PF = 0). |
0F 4B /rCMOVPO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity odd" (EFLAGS.PF = 0). |
REX.W 0F 4B /rCMOVNP r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not parity" (EFLAGS.PF = 0). |
REX.W 0F 4B /rCMOVPO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity odd" (EFLAGS.PF = 0). |
0F 4C /rCMOVL r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "less than" (EFLAGS.SF ≠ EFLAGS.OF). |
0F 4C /rCMOVNGE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not greater than or equal" (EFLAGS.SF ≠ EFLAGS.OF). |
0F 4C /rCMOVL r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "less than" (EFLAGS.SF ≠ EFLAGS.OF). |
0F 4C /rCMOVNGE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not greater than or equal" (EFLAGS.SF ≠ EFLAGS.OF). |
REX.W 0F 4C /rCMOVL r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "less than" (EFLAGS.SF ≠ EFLAGS.OF). |
REX.W 0F 4C /rCMOVNGE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not greater than or equal" (EFLAGS.SF ≠ EFLAGS.OF). |
0F 4D /rCMOVGE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "greater than or equal" (EFLAGS.SF = EFLAGS.OF). |
0F 4D /rCMOVNL r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not less than" (EFLAGS.SF = EFLAGS.OF). |
0F 4D /rCMOVGE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "greater than or equal" (EFLAGS.SF = EFLAGS.OF). |
0F 4D /rCMOVNL r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not less than" (EFLAGS.SF = EFLAGS.OF). |
REX.W 0F 4D /rCMOVGE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "greater than or equal" (EFLAGS.SF = EFLAGS.OF). |
REX.W 0F 4D /rCMOVNL r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not less than" (EFLAGS.SF = EFLAGS.OF). |
0F 4E /rCMOVLE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "less than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4E /rCMOVNG r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not greater than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4E /rCMOVLE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "less than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4E /rCMOVNG r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not greater than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
REX.W 0F 4E /rCMOVLE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "less than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
REX.W 0F 4E /rCMOVNG r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not greater than or equal" (EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4F /rCMOVG r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "greater than" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
0F 4F /rCMOVNLE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not less than or equal" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
0F 4F /rCMOVG r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "greater than" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
0F 4F /rCMOVNLE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not less than or equal" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
REX.W 0F 4F /rCMOVG r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "greater than" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
REX.W 0F 4F /rCMOVNLE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not less than or equal" (EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF ). |
Encoding
| Encoding | Operand 1 | Operand 2 |
|---|---|---|
rm | ModRM.reg[w] | ModRM.r/m[r] |
Description
The CMOVcc set of instructions conditionally moves the source operand into the destination operand. The exact condition is determined by the condition code (cc) field of the opcode (bits 0..3).
The condition code's four bits are three bits determining the condition, and one bit that, if set, inverts the result of the condition. For example, CMOVNE's opcode (0x45) is simply CMOVE's opcode (0x44) with the least significant bit set (to invert the condition). As such, instead of checking if EFLAGS.ZF is set (as CMOVE would do), it is checked to see if it is cleared.
The condition bits (bits 0..3) determine the condition according to this table (x is the invert bit):
| Condition Code Bits | Condition if x = 0 | Condition if x = 1 |
|---|---|---|
000x | EFLAGS.OF = 1 | EFLAGS.OF = 0 |
001x | EFLAGS.CF = 1 | EFLAGS.CF = 0 |
010x | EFLAGS.ZF = 1 | EFLAGS.ZF = 0 |
011x | EFLAGS.CF = 1 and EFLAGS.ZF = 1 | EFLAGS.CF = 0 and EFLAGS.ZF = 0 |
100x | EFLAGS.SF = 1 | EFLAGS.SF = 0 |
101x | EFLAGS.PF = 1 | EFLAGS.PF = 0 |
110x | EFLAGS.SF ≠ EFLAGS.OF | EFLAGS.SF = EFLAGS.OF |
111x | EFLAGS.ZF = 0 and EFLAGS.SF ≠ EFLAGS.OF | EFLAGS.ZF = 1 and EFLAGS.SF = EFLAGS.OF |
Operation
void CMOVcc(ref U16 dest, U16 src, bool condition)
{
if (condition)
dest = src;
}
void CMOVcc(ref U32 dest, U32 src, bool condition)
{
if (condition)
dest = src;
}
void CMOVcc(ref U64 dest, U64 src, bool condition)
{
if (condition)
dest = src;
}
public void CMOVO(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.OF);
public void CMOVO(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.OF);
public void CMOVO(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.OF);
public void CMOVNO(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.OF);
public void CMOVNO(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.OF);
public void CMOVNO(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.OF);
// aliased as CMOVC and CMOVNAE
public void CMOVB(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.CF);
public void CMOVB(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.CF);
public void CMOVB(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.CF);
// aliased as CMOVNB aand CMOVNC
public void CMOVAE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.CF);
public void CMOVAE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.CF);
public void CMOVAE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.CF);
// aliased as CMOVZ
public void CMOVE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.ZF);
public void CMOVE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.ZF);
public void CMOVE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.ZF);
// aliased as CMOVNZ
public void CMOVNE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.ZF);
public void CMOVNE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.ZF);
public void CMOVNE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.ZF);
// aliased as CMOVNA
public void CMOVBE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.CF && EFLAGS.ZF);
public void CMOVBE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.CF && EFLAGS.ZF);
public void CMOVBE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.CF && EFLAGS.ZF);
// aliased as CMOVNBE
public void CMOVA(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.CF && !EFLAGS.ZF);
public void CMOVA(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.CF && !EFLAGS.ZF);
public void CMOVA(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.CF && !EFLAGS.ZF);
public void CMOVS(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.SF);
public void CMOVS(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.SF);
public void CMOVS(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.SF);
public void CMOVNS(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.SF);
public void CMOVNS(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.SF);
public void CMOVNS(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.SF);
// aliased as CMOVPE
public void CMOVP(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.PF);
public void CMOVP(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.PF);
public void CMOVP(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.PF);
// aliased as CMOVPO
public void CMOVNP(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.PF);
public void CMOVNP(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.PF);
public void CMOVNP(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.PF);
// aliased as CMOVNGE
public void CMOVL(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.SF != EFLAGS.OF);
public void CMOVL(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.SF != EFLAGS.OF);
public void CMOVL(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.SF != EFLAGS.OF);
// aliased as CMOVNL
public void CMOVGE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.SF == EFLAGS.OF);
public void CMOVGE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.SF == EFLAGS.OF);
public void CMOVGE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.SF == EFLAGS.OF);
// aliased as CMOVNG
public void CMOVLE(ref U16 dest, U16 src) =>
CMOVcc(dest, src, !EFLAGS.ZF && EFLAGS.SF != EFLAGS.OF);
public void CMOVLE(ref U32 dest, U32 src) =>
CMOVcc(dest, src, !EFLAGS.ZF && EFLAGS.SF != EFLAGS.OF);
public void CMOVLE(ref U64 dest, U64 src) =>
CMOVcc(dest, src, !EFLAGS.ZF && EFLAGS.SF != EFLAGS.OF);
// aliased as CMOVNLE
public void CMOVG(ref U16 dest, U16 src) =>
CMOVcc(dest, src, EFLAGS.ZF && EFLAGS.SF == EFLAGS.OF);
public void CMOVG(ref U32 dest, U32 src) =>
CMOVcc(dest, src, EFLAGS.ZF && EFLAGS.SF == EFLAGS.OF);
public void CMOVG(ref U64 dest, U64 src) =>
CMOVcc(dest, src, EFLAGS.ZF && EFLAGS.SF == EFLAGS.OF);Flags Affected
None.Intrinsics
None. Auto-generated by compiler.
Exceptions
Real-Address Mode
#UD- If the
LOCK- prefix is used.
#SS(0)- If a memory operand using the
SS- segment has an effective address that is outside the
SS- segment's limit.
#GP(0)- If a memory operand (using a segment other than
SS- ) has an effective address that is outside the segment's limit.
Virtual-8086 Mode
#UD- If the
LOCK- prefix is used.
#SS(0)- If a memory operand using the
SS- segment has an effective address that is outside the
SS- segment's limit.
#GP(0)- If a memory operand (using a segment other than
SS- ) has an effective address that is outside the segment's limit.
#PF(fc)- If a page fault occurs.
#AC(0)- If alignment checking is enabled while the current privilege level is 3 and an unaligned memory access is made.
Protected Mode
#UD- If the
LOCK- prefix is used.
#SS(0)- If a memory operand using the
SS- segment has an effective address that is outside the
SS- segment's limit.
#GP(0)- If the destination is located in a non-writable segment.
- If a memory operand uses a segment containing a
NULLselector. - If a memory operand (using a segment other than
SS) has an effective address that is outside the segment's limit.
#PF(fc)- If a page fault occurs.
#AC(0)- If alignment checking is enabled while the current privilege level is 3 and an unaligned memory access is made.
Compatibility Mode
#UD- If the
LOCK- prefix is used.
#SS(0)- If a memory operand using the
SS- segment has an effective address that is outside the
SS- segment's limit.
#GP(0)- If the destination is located in a non-writable segment.
- If a memory operand uses a segment containing a
NULLselector. - If a memory operand (using a segment other than
SS) has an effective address that is outside the segment's limit.
#PF(fc)- If a page fault occurs.
#AC(0)- If alignment checking is enabled while the current privilege level is 3 and an unaligned memory access is made.
Long Mode
#UD- If the
LOCK- prefix is used.
#SS(0)- If a memory operand using the
SSsegment is in non-canonical form. - If a memory operand using the
SSsegment has an effective address that is outside theSSsegment's limit.
#GP(0)- If a memory operand (using a segment other than
SS) is in non-canonical form. - If the destination is located in a non-writable segment.
- If a memory operand uses a segment containing a
NULLselector. - If a memory operand (using a segment other than
SS) has an effective address that is outside the segment's limit.
#PF(fc)- If a page fault occurs.
#AC(0)- If alignment checking is enabled while the current privilege level is 3 and an unaligned memory access is made.