luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::alignment_data_x_64::AlignmentDataX64;
use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
use crate::records::emit_common_x_64::K_FUNCTION_ALIGNMENT;
use crate::records::ir_function::IrFunction;
use crate::records::ir_inst::IrInst;
use crate::records::ir_lowering_x_64::IrLoweringX64;
use crate::records::ir_reg_alloc_x_64::IrRegAllocX64;
use crate::records::ir_value_location_tracking::IrValueLocationTracking;
use crate::records::lowering_stats::LoweringStats;
use crate::records::module_helpers::ModuleHelpers;
use crate::records::operand_x_64::OperandX64;
use crate::records::register_x_64::RegisterX64;
use core::ffi::c_void;

impl IrLoweringX64 {
    pub fn ir_lowering_x_64_ir_lowering_x_64(
        build: &mut AssemblyBuilderX64,
        helpers: &mut ModuleHelpers,
        function: &mut IrFunction,
        stats: *mut LoweringStats,
    ) -> Self {
        let regs = IrRegAllocX64::ir_reg_alloc_x_64_ir_reg_alloc_x_64(build, function, stats);
        let value_tracker = IrValueLocationTracking::new(function);
        let exit_handler_map = luaur_common::records::dense_hash_map::DenseHashMap::new(!0u32);

        let mut self_ = Self {
            build: build as *mut AssemblyBuilderX64,
            helpers: helpers as *mut ModuleHelpers,
            function: function as *mut IrFunction,
            stats,
            regs,
            value_tracker,
            interrupt_handlers: alloc::vec::Vec::new(),
            exit_handlers: alloc::vec::Vec::new(),
            exit_handler_map,
            vector_and_mask: OperandX64::reg(RegisterX64::noreg),
            vector_or_mask: OperandX64::reg(RegisterX64::noreg),
            exit_sync_alloc_token: 0,
            exit_sync_inst_idx: 0,
        };

        build.align(K_FUNCTION_ALIGNMENT, AlignmentDataX64::Ud2);

        self_
    }

    pub fn reset_restore_callback(&mut self) {
        let regs_ptr = &mut self.regs as *mut IrRegAllocX64 as *mut c_void;
        self.value_tracker
            .set_restore_callback(regs_ptr, Some(Self::restore_callback_shim));
    }

    unsafe extern "C" fn restore_callback_shim(context: *mut c_void, inst: *mut IrInst) {
        let regs = &mut *(context as *mut IrRegAllocX64);
        regs.restore(&mut *inst, false);
    }
}