Value | Meaning |
---|---|
invalid @(_ii()) | |
jump @(_ii(0, IFLG.isBlockExit | IFLG.hasSideEffects)) | |
branch_unary @(_ii(1, IFLG.hasCondition | IFLG.isBlockExit | IFLG.hasSideEffects)) | Uses IrUnaryCondition inside IrInstrHeader.cond |
branch_binary @(_ii(2, IFLG.hasCondition | IFLG.isBlockExit | IFLG.hasSideEffects)) | Uses IrBinaryCondition inside IrInstrHeader.cond |
branch_switch @(_ii(1, IFLG.hasVariadicArgs | IFLG.isBlockExit | IFLG.hasSideEffects)) | Args: iNN value to be switched on _k_ >= 0 integer constants (no duplicated constants allowed) Basic block successors are in the following order default basic block 0 or more case blocks |
ret @(_ii(0, IFLG.isBlockExit | IFLG.hasSideEffects)) | |
ret_val @(_ii(1, IFLG.isBlockExit | IFLG.hasSideEffects)) | Only for ABI handling |
unreachable @(_ii(0, IFLG.isBlockExit | IFLG.hasSideEffects)) | |
parameter @(_ii(0, IFLG.hasResult | IFLG.hasSideEffects, 1)) | Emitted by frontend and replaced in lowering pass Extra argument represents parameter index and stored as plain uint of type IrValueKind.none. |
call @(_ii(1, IFLG.hasVariadicArgs | IFLG.hasVariadicResult | IFLG.hasSideEffects)) | |
syscall @(_ii(1, IFLG.hasVariadicArgs | IFLG.hasVariadicResult | IFLG.hasSideEffects)) | |
inline_marker @(_ii(0)) | |
set_binary_cond @(_ii(2, IFLG.hasResult | IFLG.hasCondition)) | Args: iNN a, iNN b Returns boolean result of binary comparison: a cond b |
set_unary_cond @(_ii(1, IFLG.hasResult | IFLG.hasCondition)) | Args: iNN a Returns boolean result of unary comparison: cond a |
move @(_ii(1, IFLG.hasResult)) | Only for ABI handling Args: T Returns: T |
copy @(_ii(2, IFLG.hasSideEffects)) | Lowered into load+store sequence Args: T* dst, T* src |
shrink_stack @(_ii(1, IFLG.hasSideEffects)) | Only for ABI handling Args: int that is added to stack pointer |
grow_stack @(_ii(1, IFLG.hasSideEffects)) | Only for ABI handling Args: int that is substracted from stack pointer |
push @(_ii(1, IFLG.hasSideEffects)) | Only for ABI handling Args: iNN |
store @(_ii(2, IFLG.hasSideEffects)) | Args: T*, T |
load @(_ii(1, IFLG.hasResult)) | Args: T* Returns: T |
load_aggregate @(_ii(1, IFLG.hasResult)) | Args: aggregate pointer Returns: member pointer |
get_element_ptr @(_ii(2, IFLG.hasVariadicArgs | IFLG.hasResult)) | |
get_element_ptr_0 @(_ii(2, IFLG.hasVariadicArgs | IFLG.hasResult)) | Args: aggregate pointer, 1 or more index Returns: member pointer Same as get_element_ptr, but first index is hardcoded to be 0. 0 indixies do not make sense, because then instuction is no op and can replaced with first arg Indices are compatible with ones from get_element and insert_element |
create_aggregate @(_ii(1, IFLG.hasVariadicArgs | IFLG.hasResult)) | Args: aggregate members |
get_element @(_ii(2, IFLG.hasVariadicArgs | IFLG.hasResult)) | Args: aggregate, byte offset Returns: member of aggregate at given offset For now offset must be a constant |
get_aggregate_slice @(_ii(2, IFLG.hasResult)) | Gets a register sized slice of aggregate Args: aggregate, 1 index of 8byte chunk |
insert_element @(_ii(3, IFLG.hasVariadicArgs | IFLG.hasResult)) | Args: aggregate, byte offset, new element value Returns: aggregate with replaced element Restriction: original aggregate's member that is being replaced here, must not be read from in postdominating instructions. But it can be read on other control flow paths. In other words, after this instruction got executed, original aggregate can not be read. All reads must go through result of this instruction. |
not @(_ii(1, IFLG.hasResult)) | One's complement negation Args: iNN a Returns ~a |
neg @(_ii(1, IFLG.hasResult)) | Two's complement negation Args: iNN a Returns -a |
fneg @(_ii(1, IFLG.hasResult)) | Float negation Args: fNN a Returns -a |
conv @(_ii(1, IFLG.hasResult)) | Args: source value, target size is represented with argSize field Currently is used as bitcast. Need clearer semantics |
zext @(_ii(1, IFLG.hasResult)) | Args: iNN a, argSize sets MM. MM must be > NN Returns iMM |
sext @(_ii(1, IFLG.hasResult)) | Args: iNN a, argSize sets MM. MM must be > NN Returns iMM |
trunc @(_ii(1, IFLG.hasResult)) | Args: iNN a, argSize sets MM. MM must be < NN Returns iMM |
fptrunc @(_ii(1, IFLG.hasResult)) | Args: fNN a, argSize sets MM. MM must be < NN Returns fMM |
fpext @(_ii(1, IFLG.hasResult)) | Args: fNN a, argSize sets MM. MM must be > NN Returns fMM |
fptoui @(_ii(1, IFLG.hasResult)) | Args: fNN a, argSize sets MM Returns iMM |
fptosi @(_ii(1, IFLG.hasResult)) | Args: fNN a, argSize sets MM Returns iMM |
uitofp @(_ii(1, IFLG.hasResult)) | Args: iNN a, argSize sets MM Returns fMM |
sitofp @(_ii(1, IFLG.hasResult)) | Args: iNN a, argSize sets MM Returns fMM |
generic_binary @(_ii(2, IFLG.hasResult | IFLG.isGeneric)) | Used when generating any of binary instructions. Actual opcode is passed via ExtraInstrArgs.opcode |
add @(_ii(2, IFLG.hasResult)) | |
sub @(_ii(2, IFLG.hasResult)) | |
and @(_ii(2, IFLG.hasResult)) | |
or @(_ii(2, IFLG.hasResult)) | |
xor @(_ii(2, IFLG.hasResult)) | |
umul @(_ii(2, IFLG.hasResult)) | Unsigned multiply |
smul @(_ii(2, IFLG.hasResult)) | Signed multiply |
udiv @(_ii(2, IFLG.hasResult)) | Unsigned division |
sdiv @(_ii(2, IFLG.hasResult)) | Signed division |
urem @(_ii(2, IFLG.hasResult)) | Unsigned remainder |
srem @(_ii(2, IFLG.hasResult)) | Signed remainder |
shl @(_ii(2, IFLG.hasResult)) | |
lshr @(_ii(2, IFLG.hasResult)) | |
ashr @(_ii(2, IFLG.hasResult)) | |
fadd @(_ii(2, IFLG.hasResult)) | |
fsub @(_ii(2, IFLG.hasResult)) | |
fmul @(_ii(2, IFLG.hasResult)) | |
fdiv @(_ii(2, IFLG.hasResult)) | |
noop @(_ii(0)) |
List of machine-independent opcodes