diff --git a/src/triples.rs b/src/triples.rs index d601736..6e3b352 100644 --- a/src/triples.rs +++ b/src/triples.rs @@ -655,7 +655,6 @@ impl RegisterStore { } fn force_take(&mut self, reg: Registers) { self.registers[reg as usize] = None; - self.used.insert(reg); } fn free(&mut self, reg: Registers) { self.registers[reg as usize] = Some(reg); @@ -709,7 +708,7 @@ impl Function { fn write(&self, w: &mut W) -> core::fmt::Result { writeln!(w, "{}:", self.name)?; - for reg in self.used_registers.iter().filter(|r| r != &&Registers::A) { + for reg in self.used_registers.iter() { writeln!(w, "push {}", reg.display(Width::QWord))?; } @@ -732,12 +731,7 @@ impl Function { writeln!(w, "mov %rbp, %rsp")?; writeln!(w, "pop %rbp")?; - for reg in self - .used_registers - .iter() - .rev() - .filter(|r| r != &&Registers::A) - { + for reg in self.used_registers.iter().rev() { writeln!(w, "pop {}", reg.display(Width::QWord))?; } @@ -796,6 +790,8 @@ impl<'a> Assembler<'a> { let mut allocas = HashMap::::new(); let mut register_store = RegisterStore::new(); + // rax as scratch register + register_store.force_take(Registers::A); let mut registers = BTreeMap::::new(); let mut stack_offset = 0; let mut func = Function::default(); @@ -940,6 +936,9 @@ impl<'a> Assembler<'a> { let param_reg = Registers::sysv_param_idx(param_count).unwrap(); param_count += 1; register_store.force_take(param_reg); + writeln!(&mut func.entry, "push {}", param_reg.display(Width::QWord))?; + stack_offset += 8; + allocas.insert(node, stack_offset); registers.insert(param_reg, node); } Inst::Add(ty) => {