Improve register reuse
This commit is contained in:
parent
ac880cc16a
commit
df8c196bb9
@ -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() {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user