Improve register reuse

This commit is contained in:
Sofia 2026-03-16 17:57:57 +02:00
parent ac880cc16a
commit df8c196bb9

View File

@ -41,6 +41,30 @@ impl LocalCounter {
}
}
pub fn consecutive(&mut self, amount: usize) -> Vec<u16> {
'outer: for free_num in self.1.clone() {
let mut potentials = vec![free_num];
let mut curr = free_num;
for _ in 0..amount {
if let Some(next) = self.1.iter().find(|v| **v == curr + 1) {
potentials.push(*next);
curr = *next;
} else {
continue 'outer;
}
}
self.1
.retain_mut(|v| potentials.iter().find(|p| v != *p).is_none());
return potentials;
}
let mut returned = Vec::new();
for _ in 0..amount {
returned.push(self.new());
}
returned
}
pub fn new(&mut self) -> u16 {
let temp = self.0;
self.0 += 1;
@ -453,10 +477,14 @@ impl Expression {
original_param_regs.extend(registers);
}
let function_reg = scope.register_counter.new();
let mut registers = scope
.register_counter
.consecutive(original_param_regs.len() + 1)
.into_iter();
let function_reg = registers.next().unwrap();
let mut param_regs = Vec::new();
for _ in &original_param_regs {
param_regs.push(scope.register_counter.new());
param_regs.push(registers.next().unwrap());
}
for (i, param_reg) in original_param_regs.iter().enumerate().rev() {