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) {
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<W: core::fmt::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::<Node, u32>::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 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) => {