luaur_code_gen/methods/
ir_reg_alloc_a_64_alloc_reuse.rs1use 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}