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 {
|
pub fn new(&mut self) -> u16 {
|
||||||
let temp = self.0;
|
let temp = self.0;
|
||||||
self.0 += 1;
|
self.0 += 1;
|
||||||
@ -453,10 +477,14 @@ impl Expression {
|
|||||||
original_param_regs.extend(registers);
|
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();
|
let mut param_regs = Vec::new();
|
||||||
for _ in &original_param_regs {
|
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() {
|
for (i, param_reg) in original_param_regs.iter().enumerate().rev() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user