reserve rax for scratch

This commit is contained in:
Janis 2024-08-19 16:28:58 +02:00
parent f7ec585057
commit c8d51e8bcf

View file

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