luaur-code-gen 0.1.1

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::type_aliases::instruction_ir_builder::Instruction;
use luaur_common::macros::luau_insn_a::LUAU_INSN_A;
use luaur_common::macros::luau_insn_b::LUAU_INSN_B;
use luaur_common::macros::luau_insn_c::LUAU_INSN_C;
use luaur_common::macros::luau_insn_d::LUAU_INSN_D;
use luaur_common::macros::luau_insn_op::LUAU_INSN_OP;

const LOP_LOADB: u32 = 3;

pub fn is_direct_compare(
    proto: *const luaur_vm::records::proto::Proto,
    pc: *const Instruction,
    i: i32,
) -> bool {
    let proto = unsafe { &*proto };
    if i + 3 < proto.sizecode as i32 {
        let pc_val = unsafe { *pc };
        if LUAU_INSN_D(pc_val) == 2 {
            let load_true = unsafe { *pc.add(2) };
            let load_false = unsafe { *pc.add(3) };

            if LUAU_INSN_OP(load_true) == LOP_LOADB && LUAU_INSN_OP(load_false) == LOP_LOADB {
                let same_target = LUAU_INSN_A(load_true) == LUAU_INSN_A(load_false);
                let zero_and_one = LUAU_INSN_B(load_true) == 0 && LUAU_INSN_B(load_false) == 1;
                let correct_jumps = LUAU_INSN_C(load_true) == 1 && LUAU_INSN_C(load_false) == 0;

                return same_target && zero_and_one && correct_jumps;
            }
        }
    }

    false
}