IrOpcode

List of machine-independent opcodes

Values

ValueMeaning
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))

Meta