SETcc

Set Byte on Condition

stableVMJITAOTinstruction

Encodings

OpcodeInstructionOp/En64-bitCompat/LegacyDescription
0F 97SETA r/m8MValidValidSet byte if above (CF=0 and ZF=0).
0F 93SETAE r/m8MValidValidSet byte if above or equal (CF=0).
0F 92SETB r/m8MValidValidSet byte if below (CF=1).
0F 96SETBE r/m8MValidValidSet byte if below or equal (CF=1 or ZF=1).
0F 92SETC r/m8MValidValidSet byte if carry (CF=1).
0F 94SETE r/m8MValidValidSet byte if equal (ZF=1).
0F 9FSETG r/m8MValidValidSet byte if greater (ZF=0 and SF=OF).
0F 9DSETGE r/m8MValidValidSet byte if greater or equal (SF=OF).
0F 9CSETL r/m8MValidValidSet byte if less (SF OF).
0F 9ESETLE r/m8MValidValidSet byte if less or equal (ZF=1 or SF OF).
0F 96SETNA r/m8MValidValidSet byte if not above (CF=1 or ZF=1).
0F 92SETNAE r/m8MValidValidSet byte if not above or equal (CF=1).
0F 93SETNB r/m8MValidValidSet byte if not below (CF=0).
0F 97SETNBE r/m8MValidValidSet byte if not below or equal (CF=0 and ZF=0).
0F 93SETNC r/m8MValidValidSet byte if not carry (CF=0).
0F 95SETNE r/m8MValidValidSet byte if not equal (ZF=0).
0F 9ESETNG r/m8MValidValidSet byte if not greater (ZF=1 or SF OF)
0F 9CSETNGE r/m8MValidValidSet byte if not greater or equal (SF OF).
0F 9DSETNL r/m8MValidValidSet byte if not less (SF=OF).
0F 9FSETNLE r/m8MValidValidSet byte if not less or equal (ZF=0 and SF=OF).
0F 91SETNO r/m8MValidValidSet byte if not overflow (OF=0).
0F 9BSETNP r/m8MValidValidSet byte if not parity (PF=0).
0F 99SETNS r/m8MValidValidSet byte if not sign (SF=0).
0F 95SETNZ r/m8MValidValidSet byte if not zero (ZF=0).
0F 90SETO r/m8MValidValidSet byte if overflow (OF=1)
0F 9ASETP r/m8MValidValidSet byte if parity (PF=1).
0F 9ASETPE r/m8MValidValidSet byte if parity even (PF=1).
0F 9BSETPO r/m8MValidValidSet byte if parity odd (PF=0).
0F 98SETS r/m8MValidValidSet byte if sign (SF=1).
0F 94SETZ r/m8MValidValidSet byte if zero (ZF=1).

Operand encoding

Each mode is a value of the Op/En column above. It says which field of the encoded instruction carries each operand, in the order they are written, and whether the instruction reads it, writes it or both.

M

  1. modrm.rm escrituraModRM byte, r/m field (bits 2-0); with the SIB byte and the displacement when the mod field asks for them

Measured cost

Loading measurements from arch-data...

Description

Sets the destination operand to 0 or 1 depending on the settings of the status flags (CF, SF, OF, ZF, and PF) in the EFLAGS register. The destination operand points to a byte register or a byte in memory. The condition code suffix (cc) indicates the condition being tested for.

The terms "above" and "below" are associated with the CF flag and refer to the relationship between two unsigned integer values. The terms "greater" and "less" are associated with the SF and OF flags and refer to the relationship between two signed integer values.

Many of the SETcc instruction opcodes have alternate mnemonics. For example, SETG (set byte if greater) and SETNLE (set if not less or equal) have the same opcode and test for the same condition: ZF equals 0 and SF equals OF. These alternate mnemonics are provided to make code more intelligible. Appendix B, "EFLAGS Condition Codes," in the Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 1, shows the alternate mnemonics for various test conditions.

Some languages represent a logical one as an integer with all bits set. This representation can be obtained by choosing the logically opposite condition for the SETcc instruction, then decrementing the result. For example, to test for overflow, use the SETNO instruction, then decrement the result.

The reg field of the ModR/M byte is not used for the SETCC instruction and those opcode bits are ignored by the processor.

In IA-64 mode, the operand size is fixed at 8 bits. Use of REX prefix enable uniform addressing to additional byte registers. Otherwise, this instruction's operation is the same as in legacy mode and compatibility mode.

Operation

IF condition
    THEN DEST := 1;
    ELSE DEST := 0;

FI;

Flags affected

None.

Exceptions

Protected mode
#GP(0)If the destination is located in a non-writable segment. If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a NULL segment selector.
#SS(0)If a memory operand effective address is outside the SS segment limit. #PF(fault-code) If a page fault occurs.
#UDIf the LOCK prefix is used.
Real address mode
#GPIf a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SSIf a memory operand effective address is outside the SS segment limit.
#UDIf the LOCK prefix is used.
Virtual-8086 mode
#GP(0)If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SS(0)If a memory operand effective address is outside the SS segment limit.
#PF(fault-code)If a page fault occurs.
#UDIf the LOCK prefix is used.
Compatibility mode
Same exceptions as in protected mode.
64-bit mode
#SS(0)If a memory address referencing the SS segment is in a non-canonical form.
#GP(0)If the memory address is in a non-canonical form. #PF(fault-code) If a page fault occurs.
#UDIf the LOCK prefix is used.

Sources