Skip to content

Commit

Permalink
x64: fix assert when calling a function
Browse files Browse the repository at this point in the history
  • Loading branch information
nagisa committed Jan 24, 2022
1 parent 367460b commit 4998196
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions lib/compiler-singlepass/src/machine_x64.rs
Expand Up @@ -1807,16 +1807,22 @@ impl Machine for MachineX86_64 {
fn push_location_for_native(&mut self, loc: Location) {
match loc {
Location::Imm64(_) => {
// Push R9 value slot to be exchange with `mov`.
// x86_64 does not support `mov imm64, mem`. We must first place the immdiate value
// into a register and then write the register to the memory. Now the problem is
// that there might not be any registers available to clobber. In order to make
// this work out we spill a register thus retaining both the original value of the
// register and producing the required data at the top of the stack.
//
// FIXME(#2723): figure out how to not require spilling a register here. It should
// definitely be possible to `pick_gpr`/`pick_temp_gpr` to grab an otherwise unused
// register and just clobber its value here.
self.assembler.emit_push(Size::S64, Location::GPR(GPR::R9));
self.reserve_unused_temp_gpr(GPR::R9);
self.move_location(Size::S64, loc, Location::GPR(GPR::R9));
self.assembler.emit_xchg(
Size::S64,
Location::GPR(GPR::R9),
Location::Memory(GPR::RSP, 0),
);
self.release_gpr(GPR::R9);
}
Location::SIMD(_) => {
// Dummy value slot to be filled with `mov`.
Expand Down

0 comments on commit 4998196

Please sign in to comment.