reserve rax for scratch
This commit is contained in:
parent
f7ec585057
commit
c8d51e8bcf
|
@ -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) => {
|
||||
|
|
Loading…
Reference in a new issue