const BITRK: u32 = 1 << 8;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum RK {
R(u8),
K(u8),
}
impl RK {
pub fn decode(value: u32) -> RK {
if value & BITRK != 0 {
RK::K((value & !BITRK) as u8)
} else {
RK::R(value as u8)
}
}
pub fn encode(&self) -> u32 {
match self {
&RK::R(r) => r as u32,
&RK::K(k) => (k as u32) | BITRK,
}
}
}
pub fn encode(op: Opcode, a: u8, b: u32, c: u32) -> u32 {
(op as u32) | ((a as u32) << 6) | ((c & 0x1ff) << 14) | ((b & 0x1ff) << 23)
}
pub fn encode_bx(op: Opcode, a: u8, bx: u32) -> u32 {
(op as u32) | ((a as u32) << 6) | ((bx & 0x3ffff) << 14)
}
pub fn encode_sbx(op: Opcode, a: u8, sbx: i32) -> u32 {
(op as u32) | ((a as u32) << 6) | ((((sbx + 0x20000) as u32) & 0x3ffff) << 14)
}
pub fn encode_ax(op: Opcode, ax: u32) -> u32 {
(op as u32) | ((ax & 0x3ffffff) << 6)
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub enum Opcode { Move, LoadK, LoadKX, LoadBool, LoadNil,
GetUpval, GetTabUp, GetTable,
SetTabUp, SetUpval, SetTable,
NewTable,
Self_,
Add, Sub, Mul, Mod, Pow, Div, IntDiv, BinAnd, BinOr, BinXor, ShLeft, ShRight, UnMinus, BinNot, Not, Len,
Concat,
Jump, Eq, Less, LessEq, Test, TestSet,
Call, TailCall, Return,
ForLoop, ForPrep, TForCall, TForLoop, SetList, Closure, VarArg, ExtraArg, }