luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::ir_cmd::IrCmd;
use crate::enums::ir_op_kind::IrOpKind;
use crate::functions::has_side_effects::has_side_effects;
use crate::functions::vm_reg_op::vm_reg_op;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::const_prop_state::ConstPropState;
use crate::records::ir_inst::IrInst;
use crate::records::ir_op::IrOp;

impl ConstPropState {
    pub fn get_previous_versioned_load_index(
        &mut self,
        cmd: IrCmd,
        vm_reg: IrOp,
    ) -> Option<*mut u32> {
        CODEGEN_ASSERT!(vm_reg.kind() == IrOpKind::VmReg);

        let reg = vm_reg_op(vm_reg) as usize;
        let mut versioned_reg = vm_reg;
        versioned_reg = IrOp::ir_op_ir_op_kind_u32(
            IrOpKind::VmReg,
            (vm_reg_op(versioned_reg) as u32) | (self.regs[reg].version << 8),
        );
        let mut ops = crate::type_aliases::ir_ops::IrOps::new();
        ops.push(versioned_reg);
        let versioned_load = IrInst {
            cmd,
            ops,
            last_use: 0,
            use_count: 0,
            reg_x64: Default::default(),
            reg_a64: Default::default(),
            reused_reg: false,
            spilled: false,
            needs_reload: false,
        };

        let prev_idx = match self.value_map.find_mut(&versioned_load) {
            Some(prev_idx) => prev_idx as *mut u32,
            None => return None,
        };

        let inst = unsafe {
            let instructions = &(*self.function).instructions;
            &instructions[*prev_idx as usize]
        };
        if inst.use_count != 0 || has_side_effects(inst.cmd) {
            Some(prev_idx)
        } else {
            None
        }
    }
}