Skip to main content

luaur_code_gen/methods/
ir_reg_alloc_a_64_alloc_reuse.rs

1use crate::enums::ir_op_kind::IrOpKind;
2use crate::enums::kind_a_64::KindA64;
3use crate::macros::codegen_assert::CODEGEN_ASSERT;
4use crate::records::ir_op::IrOp;
5use crate::records::ir_reg_alloc_a_64::IrRegAllocA64;
6use crate::records::register_a_64::RegisterA64;
7
8impl IrRegAllocA64 {
9    pub fn alloc_reuse(&mut self, kind: KindA64, index: u32, oprefs: &[IrOp]) -> RegisterA64 {
10        for &op in oprefs {
11            if op.kind() != IrOpKind::Inst {
12                continue;
13            }
14
15            let function = unsafe { &mut *self.function };
16            let source = &mut function.instructions[op.index() as usize];
17
18            if source.last_use == index
19                && !source.reused_reg
20                && source.reg_a64.register_a_64_operator_ne(RegisterA64::noreg)
21            {
22                CODEGEN_ASSERT!(true);
23                CODEGEN_ASSERT!(true);
24
25                let set = self.get_set(kind);
26                CODEGEN_ASSERT!(true);
27
28                set.defs[source.reg_a64.index() as usize] = index;
29
30                source.reused_reg = true;
31                return source.reg_a64;
32            }
33        }
34
35        self.alloc_reg(kind, index)
36    }
37}