luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::size_x_64::SizeX64;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::ir_data::k_invalid_inst_idx;
use crate::records::ir_function::IrFunction;
use crate::records::ir_inst::IrInst;
use crate::records::ir_reg_alloc_x_64::IrRegAllocX64;
use crate::records::register_x_64::RegisterX64;

impl IrRegAllocX64 {
    pub fn take_reg(&mut self, reg: RegisterX64, inst_idx: u32) -> RegisterX64 {
        if reg.size() == SizeX64::xmmword {
            if !self.free_xmm_map[reg.index() as usize] {
                CODEGEN_ASSERT!(self.xmm_inst_users[reg.index() as usize] != k_invalid_inst_idx);
                let inst_ptr = unsafe {
                    let instructions = &mut (*self.function).instructions;
                    &mut instructions[self.xmm_inst_users[reg.index() as usize] as usize]
                };
                self.preserve(inst_ptr);
            }

            CODEGEN_ASSERT!(self.free_xmm_map[reg.index() as usize]);
            self.free_xmm_map[reg.index() as usize] = false;
            self.xmm_inst_users[reg.index() as usize] = inst_idx;
        } else {
            if !self.free_gpr_map[reg.index() as usize] {
                CODEGEN_ASSERT!(self.gpr_inst_users[reg.index() as usize] != k_invalid_inst_idx);
                let inst_ptr = unsafe {
                    let instructions = &mut (*self.function).instructions;
                    &mut instructions[self.gpr_inst_users[reg.index() as usize] as usize]
                };
                self.preserve(inst_ptr);
            }

            CODEGEN_ASSERT!(self.free_gpr_map[reg.index() as usize]);
            self.free_gpr_map[reg.index() as usize] = false;
            self.gpr_inst_users[reg.index() as usize] = inst_idx;
        }

        reg
    }
}