Skip to content

Commit

Permalink
imp(feature) Fixed x64 backend of Singlepass
Browse files Browse the repository at this point in the history
  • Loading branch information
ptitSeb committed Jan 14, 2022
1 parent 0e2d809 commit c8ae8c8
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
7 changes: 6 additions & 1 deletion lib/compiler-singlepass/src/codegen.rs
Expand Up @@ -767,6 +767,10 @@ impl<'a, M: Machine> FuncGen<'a, M> {
self.state.stack_values.push(content);
}
}
// mark the GPR used for Call as used
self.machine
.reserve_unused_temp_gpr(self.machine.get_grp_for_call());

let calling_convention = self.calling_convention;

let stack_padding: usize = match calling_convention {
Expand Down Expand Up @@ -872,7 +876,8 @@ impl<'a, M: Machine> FuncGen<'a, M> {
if stack_padding > 0 {
self.machine.adjust_stack(stack_padding as u32);
}

// release the GPR used for call
self.machine.release_gpr(self.machine.get_grp_for_call());
cb(self);

// Offset needs to be after the 'call' instruction.
Expand Down
38 changes: 26 additions & 12 deletions lib/compiler-singlepass/src/machine_x64.rs
Expand Up @@ -1974,9 +1974,9 @@ impl Machine for MachineX86_64 {
self.assembler.emit_mov(size, source, dest);
}
Location::Memory(_, _) | Location::Memory2(_, _, _, _) => {
self.assembler
.emit_mov(size, source, Location::GPR(GPR::RAX));
self.assembler.emit_mov(size, Location::GPR(GPR::RAX), dest);
let tmp = self.pick_temp_gpr().unwrap();
self.assembler.emit_mov(size, source, Location::GPR(tmp));
self.assembler.emit_mov(size, Location::GPR(tmp), dest);
}
_ => unreachable!(),
},
Expand All @@ -1985,9 +1985,9 @@ impl Machine for MachineX86_64 {
self.assembler.emit_mov(size, source, dest);
}
Location::Memory(_, _) | Location::Memory2(_, _, _, _) => {
self.assembler
.emit_mov(size, source, Location::GPR(GPR::RAX));
self.assembler.emit_mov(size, Location::GPR(GPR::RAX), dest);
let tmp = self.pick_temp_gpr().unwrap();
self.assembler.emit_mov(size, source, Location::GPR(tmp));
self.assembler.emit_mov(size, Location::GPR(tmp), dest);
}
_ => unreachable!(),
},
Expand All @@ -1996,9 +1996,9 @@ impl Machine for MachineX86_64 {
self.assembler.emit_mov(size, source, dest);
}
Location::Memory(_, _) | Location::Memory2(_, _, _, _) => {
self.assembler
.emit_mov(size, source, Location::GPR(GPR::RAX));
self.assembler.emit_mov(size, Location::GPR(GPR::RAX), dest);
let tmp = self.pick_temp_gpr().unwrap();
self.assembler.emit_mov(size, source, Location::GPR(tmp));
self.assembler.emit_mov(size, Location::GPR(tmp), dest);
}
_ => unreachable!(),
},
Expand All @@ -2017,21 +2017,35 @@ impl Machine for MachineX86_64 {
size_op: Size,
dest: Location,
) {
let dst = match dest {
Location::Memory(_, _) | Location::Memory2(_, _, _, _) => {
Location::GPR(self.acquire_temp_gpr().unwrap())
}
Location::GPR(_) | Location::SIMD(_) => dest,
_ => unreachable!(),
};
match source {
Location::GPR(_) | Location::Memory(_, _) | Location::Memory2(_, _, _, _) => {
match size_val {
Size::S32 | Size::S64 => self.assembler.emit_mov(size_val, source, dest),
Size::S32 | Size::S64 => self.assembler.emit_mov(size_val, source, dst),
Size::S16 | Size::S8 => {
if signed {
self.assembler.emit_movsx(size_val, source, size_op, dest)
self.assembler.emit_movsx(size_val, source, size_op, dst)
} else {
self.assembler.emit_movzx(size_val, source, size_op, dest)
self.assembler.emit_movzx(size_val, source, size_op, dst)
}
}
}
}
_ => unreachable!(),
}
if dst != dest {
self.assembler.emit_mov(size_op, dst, dest);
match dst {
Location::GPR(x) => self.release_gpr(x),
_ => unreachable!(),
};
}
}
fn load_address(&mut self, size: Size, reg: Location, mem: Location) {
match reg {
Expand Down

0 comments on commit c8ae8c8

Please sign in to comment.