Opcode | Encoding | 16-bit | 32-bit | 64-bit | Description |
---|---|---|---|---|---|
0F 40 /r CMOVO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "overflow" (EFLAGS.OF = 1 ). |
0F 40 /r CMOVO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "overflow" (EFLAGS.OF = 1 ). |
REX.W 0F 40 /r CMOVO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "overflow" (EFLAGS.OF = 1 ). |
0F 41 /r CMOVNO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not overflow" (EFLAGS.OF = 0 ). |
0F 41 /r CMOVNO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not overflow" (EFLAGS.OF = 0 ). |
REX.W 0F 41 /r CMOVNO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not overflow" (EFLAGS.OF = 0 ). |
0F 42 /r CMOVB r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "below" (EFLAGS.CF = 1 ). |
0F 42 /r CMOVC r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "carry" (EFLAGS.CF = 1 ). |
0F 42 /r CMOVNAE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not above or equal" (EFLAGS.CF = 1 ). |
0F 42 /r CMOVB r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "below" (EFLAGS.CF = 1 ). |
0F 42 /r CMOVC r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "carry" (EFLAGS.CF = 1 ). |
0F 42 /r CMOVNAE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not above or equal" (EFLAGS.CF = 1 ). |
REX.W 0F 42 /r CMOVB r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "below" (EFLAGS.CF = 1 ). |
REX.W 0F 42 /r CMOVC r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "carry" (EFLAGS.CF = 1 ). |
REX.W 0F 42 /r CMOVNAE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not above or equal" (EFLAGS.CF = 1 ). |
0F 43 /r CMOVAE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "above or equal" (EFLAGS.CF = 0 ). |
0F 43 /r CMOVNB r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not below" (EFLAGS.CF = 0 ). |
0F 43 /r CMOVNC r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not carry" (EFLAGS.CF = 0 ). |
0F 43 /r CMOVAE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "above or equal" (EFLAGS.CF = 0 ). |
0F 43 /r CMOVNB r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not below" (EFLAGS.CF = 0 ). |
0F 43 /r CMOVNC r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not carry" (EFLAGS.CF = 0 ). |
REX.W 0F 43 /r CMOVAE 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 /r CMOVNB r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not below" (EFLAGS.CF = 0 ). |
REX.W 0F 43 /r CMOVNC r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not carry" (EFLAGS.CF = 0 ). |
0F 44 /r CMOVE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "equal" (EFLAGS.ZF = 1 ). |
0F 44 /r CMOVZ r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "zero" (EFLAGS.ZF = 1 ). |
0F 44 /r CMOVE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "equal" (EFLAGS.ZF = 1 ). |
0F 44 /r CMOVZ r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "zero" (EFLAGS.ZF = 1 ). |
REX.W 0F 44 /r CMOVE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "equal" (EFLAGS.ZF = 1 ). |
REX.W 0F 44 /r CMOVZ r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "zero" (EFLAGS.ZF = 1 ). |
0F 45 /r CMOVNE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not equal" (EFLAGS.ZF = 0 ). |
0F 45 /r CMOVNZ r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not zero" (EFLAGS.ZF = 0 ). |
0F 45 /r CMOVNE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not equal" (EFLAGS.ZF = 0 ). |
0F 45 /r CMOVNZ r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not zero" (EFLAGS.ZF = 0 ). |
REX.W 0F 45 /r CMOVNE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not equal" (EFLAGS.ZF = 0 ). |
REX.W 0F 45 /r CMOVNZ r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not zero" (EFLAGS.ZF = 0 ). |
0F 46 /r CMOVBE 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 /r CMOVNA r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not above" (EFLAGS.CF = 1 and EFLAGS.ZF = 1 ). |
0F 46 /r CMOVBE 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 /r CMOVNA 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 /r CMOVBE 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 /r CMOVNA 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 /r CMOVA r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "above" (EFLAGS.CF = 0 and EFLAGS.ZF = 0 ). |
0F 47 /r CMOVNBE 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 /r CMOVA r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "above" (EFLAGS.CF = 0 and EFLAGS.ZF = 0 ). |
0F 47 /r CMOVNBE 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 /r CMOVA 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 /r CMOVNBE 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 /r CMOVS r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "sign" (EFLAGS.SF = 1 ). |
0F 48 /r CMOVS r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "sign" (EFLAGS.SF = 1 ). |
REX.W 0F 48 /r CMOVS r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "sign" (EFLAGS.SF = 1 ). |
0F 49 /r CMOVNS r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not sign" (EFLAGS.SF = 0 ). |
0F 49 /r CMOVNS r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not sign" (EFLAGS.SF = 0 ). |
REX.W 0F 49 /r CMOVNS r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not sign" (EFLAGS.SF = 0 ). |
0F 4A /r CMOVP r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity" (EFLAGS.PF = 1 ). |
0F 4A /r CMOVPE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity even" (EFLAGS.PF = 1 ). |
0F 4A /r CMOVP r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity" (EFLAGS.PF = 1 ). |
0F 4A /r CMOVPE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity even" (EFLAGS.PF = 1 ). |
REX.W 0F 4A /r CMOVP r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity" (EFLAGS.PF = 1 ). |
REX.W 0F 4A /r CMOVPE r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity even" (EFLAGS.PF = 1 ). |
0F 4B /r CMOVNP r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not parity" (EFLAGS.PF = 0 ). |
0F 4B /r CMOVPO r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "parity odd" (EFLAGS.PF = 0 ). |
0F 4B /r CMOVNP r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not parity" (EFLAGS.PF = 0 ). |
0F 4B /r CMOVPO r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "parity odd" (EFLAGS.PF = 0 ). |
REX.W 0F 4B /r CMOVNP r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not parity" (EFLAGS.PF = 0 ). |
REX.W 0F 4B /r CMOVPO r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "parity odd" (EFLAGS.PF = 0 ). |
0F 4C /r CMOVL r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "less than" (EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4C /r CMOVNGE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not greater than or equal" (EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4C /r CMOVL r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "less than" (EFLAGS.SF ≠ EFLAGS.OF ). |
0F 4C /r CMOVNGE 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 /r CMOVL 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 /r CMOVNGE 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 /r CMOVGE r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "greater than or equal" (EFLAGS.SF = EFLAGS.OF ). |
0F 4D /r CMOVNL r16, r/m16 | rm | Valid | Valid | Valid | Move r/m16 into r16 if "not less than" (EFLAGS.SF = EFLAGS.OF ). |
0F 4D /r CMOVGE r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "greater than or equal" (EFLAGS.SF = EFLAGS.OF ). |
0F 4D /r CMOVNL r32, r/m32 | rm | Valid | Valid | Valid | Move r/m32 into r32 if "not less than" (EFLAGS.SF = EFLAGS.OF ). |
REX.W 0F 4D /r CMOVGE 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 /r CMOVNL r64, r/m64 | rm | N/E | N/E | Valid | Move r/m64 into r64 if "not less than" (EFLAGS.SF = EFLAGS.OF ). |
0F 4E /r CMOVLE 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 /r CMOVNG 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 /r CMOVLE 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 /r CMOVNG 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 /r CMOVLE 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 /r CMOVNG 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 /r CMOVG 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 /r CMOVNLE 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 /r CMOVG 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 /r CMOVNLE 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 /r CMOVG 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 /r CMOVNLE 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
NULL
selector. - 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
NULL
selector. - 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
SS
segment is in non-canonical form. - If a memory operand using the
SS
segment has an effective address that is outside theSS
segment'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
NULL
selector. - 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.