pub enum RegOp {
Show 34 variants
Mov {
dst: u16,
src: u16,
},
LoadConst {
dst: u16,
k: u32,
},
LoadGlobal {
dst: u16,
slot: u32,
},
StoreGlobal {
slot: u32,
src: u16,
},
LoadUpvalue {
dst: u16,
idx: u32,
},
StoreUpvalue {
idx: u32,
src: u16,
},
Bin {
op: BinKind,
dst: u16,
lhs: u16,
rhs: u16,
},
Un {
op: UnKind,
dst: u16,
src: u16,
},
Cmp {
op: CmpKind,
dst: u16,
lhs: u16,
rhs: u16,
},
CmpImm {
op: CmpKind,
dst: u16,
lhs: u16,
imm: i64,
},
BinImm {
op: BinKind,
dst: u16,
lhs: u16,
imm: i64,
},
Jump {
target: u32,
},
JumpIfFalse {
target: u32,
cond: u16,
},
JumpIfTrue {
target: u32,
cond: u16,
},
Call {
dst: u16,
func: u16,
args: u16,
argc: u8,
},
TailCall {
func: u16,
args: u16,
argc: u8,
},
Ret {
src: u16,
},
GetProp {
dst: u16,
obj: u16,
name: u32,
},
SetProp {
obj: u16,
name: u32,
src: u16,
},
Invoke {
dst: u16,
obj: u16,
name: u32,
args: u16,
argc: u8,
},
BuildArr {
dst: u16,
start: u16,
count: u16,
},
BuildMap {
dst: u16,
start: u16,
count: u16,
},
IndexGet {
dst: u16,
obj: u16,
idx: u16,
},
IndexSet {
obj: u16,
idx: u16,
src: u16,
},
CreateClass {
dst: u16,
k: u32,
},
CreateInstance {
dst: u16,
class: u16,
args: u16,
argc: u8,
},
MakeClosure {
dst: u16,
func: u16,
upvals: u16,
count: u8,
},
Wrap {
kind: WrapKind,
dst: u16,
src: u16,
},
Unwrap {
kind: WrapKind,
dst: u16,
flag: u16,
src: u16,
},
TryQ {
dst: u16,
src: u16,
},
Argc {
dst: u16,
},
CallChunk {
dst: u16,
chunk: u32,
args: u16,
argc: u8,
},
Nop,
Halt {
src: u16,
},
}Expand description
Three-address register instruction. Registers are u16 indices into a
flat frame-local register file. Constants live in the chunk const table.
Variants§
Mov
dst = src
LoadConst
dst = constants[k]
LoadGlobal
dst = globals[slot]
StoreGlobal
globals[slot] = src
LoadUpvalue
dst = upvalues[idx]
StoreUpvalue
upvalues[idx] = src
Bin
dst = lhs <op> rhs
Un
dst = <op> src
Cmp
dst = lhs <cmp> rhs
CmpImm
dst = lhs <cmp> imm (fused int immediate)
BinImm
dst = lhs <op> imm
Jump
Unconditional jump to instruction index target (in this chunk).
JumpIfFalse
Jump if cond register is falsy.
JumpIfTrue
Jump if cond register is truthy.
Call
dst = call(func, args[argc]) — args live in consecutive registers.
TailCall
Tail call: same as Call but reuses the frame.
Ret
return src
GetProp
dst = obj.name
SetProp
obj.name = src
Invoke
dst = obj.name(args[argc])
BuildArr
dst = [regs[start] .. start+count)
BuildMap
dst = { k/v pairs from regs[start] .. }
IndexGet
dst = obj[idx]
IndexSet
obj[idx] = src
CreateClass
Class / instance helpers (operand carries the same meaning as stack IR).
CreateInstance
MakeClosure
Wrap
dst = wrap(src) for Ok/Err/Some
Unwrap
Unwrap Ok/Err/Some: dst = inner (bool success in flag)
TryQ
? operator: dst = inner or early-return
Argc
Current frame argc (for default-parameter prologues)
CallChunk
Call a known chunk by index (lowered from stack CallDirect).
Nop
No-op
Halt
Stop and return src