Conditionals
Conditional instructions evaluate a comparison between two operands and store a boolean result (0 or 1) into a destination register. They are typically used as inputs to JS.
Comparison instructions
| Mnemonic | Op1 | Op2 | Op3 | Operation |
|---|---|---|---|---|
TG | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 > OP3 (signed) |
TGE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 >= OP3 (signed) |
TE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 == OP3 |
TNE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 != OP3 |
TL | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 < OP3 (signed) |
TLE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 <= OP3 (signed) |
TUG | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 > OP3 (unsigned) |
TUGE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 >= OP3 (unsigned) |
TUL | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 < OP3 (unsigned) |
TULE | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 <= OP3 (unsigned) |
IFS - If-Select
Evaluates the second operand as a condition. If true, assigns the third operand to the destination; otherwise assigns zero.
| Instruction | Operand 1 | Operand 2 | Operand 3 | Operation |
|---|---|---|---|---|
IFS | Reg | Reg/Imm | Reg/Imm | OP1 = OP2 ? OP3 : 0 |
// result = (rax == rbx) ? 0xFF : 0
auto cond = block->tmp(1);
block->te(cond, X86_REG_RAX, X86_REG_RBX);
block->ifs(X86_REG_RCX, cond, 0xFF);