luaur_code_gen/functions/
is_direct_compare.rs1use crate::type_aliases::instruction_ir_builder::Instruction;
2use luaur_common::macros::luau_insn_a::LUAU_INSN_A;
3use luaur_common::macros::luau_insn_b::LUAU_INSN_B;
4use luaur_common::macros::luau_insn_c::LUAU_INSN_C;
5use luaur_common::macros::luau_insn_d::LUAU_INSN_D;
6use luaur_common::macros::luau_insn_op::LUAU_INSN_OP;
7
8const LOP_LOADB: u32 = 3;
9
10pub fn is_direct_compare(
11 proto: *const luaur_vm::records::proto::Proto,
12 pc: *const Instruction,
13 i: i32,
14) -> bool {
15 let proto = unsafe { &*proto };
16 if i + 3 < proto.sizecode as i32 {
17 let pc_val = unsafe { *pc };
18 if LUAU_INSN_D(pc_val) == 2 {
19 let load_true = unsafe { *pc.add(2) };
20 let load_false = unsafe { *pc.add(3) };
21
22 if LUAU_INSN_OP(load_true) == LOP_LOADB && LUAU_INSN_OP(load_false) == LOP_LOADB {
23 let same_target = LUAU_INSN_A(load_true) == LUAU_INSN_A(load_false);
24 let zero_and_one = LUAU_INSN_B(load_true) == 0 && LUAU_INSN_B(load_false) == 1;
25 let correct_jumps = LUAU_INSN_C(load_true) == 1 && LUAU_INSN_C(load_false) == 0;
26
27 return same_target && zero_and_one && correct_jumps;
28 }
29 }
30 }
31
32 false
33}