Skip to main content

luaur_code_gen/methods/
ir_reg_alloc_x_64_take_reg.rs

1use crate::enums::size_x_64::SizeX64;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::ir_data::k_invalid_inst_idx;
4use crate::records::ir_function::IrFunction;
5use crate::records::ir_inst::IrInst;
6use crate::records::ir_reg_alloc_x_64::IrRegAllocX64;
7use crate::records::register_x_64::RegisterX64;
8
9impl IrRegAllocX64 {
10    pub fn take_reg(&mut self, reg: RegisterX64, inst_idx: u32) -> RegisterX64 {
11        if reg.size() == SizeX64::xmmword {
12            if !self.free_xmm_map[reg.index() as usize] {
13                CODEGEN_ASSERT!(self.xmm_inst_users[reg.index() as usize] != k_invalid_inst_idx);
14                let inst_ptr = unsafe {
15                    let instructions = &mut (*self.function).instructions;
16                    &mut instructions[self.xmm_inst_users[reg.index() as usize] as usize]
17                };
18                self.preserve(inst_ptr);
19            }
20
21            CODEGEN_ASSERT!(self.free_xmm_map[reg.index() as usize]);
22            self.free_xmm_map[reg.index() as usize] = false;
23            self.xmm_inst_users[reg.index() as usize] = inst_idx;
24        } else {
25            if !self.free_gpr_map[reg.index() as usize] {
26                CODEGEN_ASSERT!(self.gpr_inst_users[reg.index() as usize] != k_invalid_inst_idx);
27                let inst_ptr = unsafe {
28                    let instructions = &mut (*self.function).instructions;
29                    &mut instructions[self.gpr_inst_users[reg.index() as usize] as usize]
30                };
31                self.preserve(inst_ptr);
32            }
33
34            CODEGEN_ASSERT!(self.free_gpr_map[reg.index() as usize]);
35            self.free_gpr_map[reg.index() as usize] = false;
36            self.gpr_inst_users[reg.index() as usize] = inst_idx;
37        }
38
39        reg
40    }
41}