From df8c196bb9c823078f3a341c525a471b45304267 Mon Sep 17 00:00:00 2001 From: Sofia Date: Mon, 16 Mar 2026 17:57:57 +0200 Subject: [PATCH] Improve register reuse --- src/compile.rs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/compile.rs b/src/compile.rs index e713840..0b356d9 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -41,6 +41,30 @@ impl LocalCounter { } } + pub fn consecutive(&mut self, amount: usize) -> Vec { + '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() {