From dc0dcd01d2cb05070fd187d081a61466ec0cde8b Mon Sep 17 00:00:00 2001 From: yukang Date: Sat, 5 Jun 2021 09:23:00 +0800 Subject: [PATCH] fix singlepass issue #2347 --- lib/compiler-singlepass/src/codegen_x64.rs | 2 +- tests/compilers/imports.rs | 27 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/compiler-singlepass/src/codegen_x64.rs b/lib/compiler-singlepass/src/codegen_x64.rs index 6a7670fcdaf..953bda078dd 100644 --- a/lib/compiler-singlepass/src/codegen_x64.rs +++ b/lib/compiler-singlepass/src/codegen_x64.rs @@ -330,9 +330,9 @@ impl<'a> FuncGen<'a> { let tmp1 = self.machine.acquire_temp_xmm().unwrap(); let tmp2 = self.machine.acquire_temp_xmm().unwrap(); let tmp3 = self.machine.acquire_temp_xmm().unwrap(); - let tmpg1 = self.machine.acquire_temp_gpr().unwrap(); self.emit_relaxed_binop(Assembler::emit_mov, sz, input, Location::XMM(tmp1)); + let tmpg1 = self.machine.acquire_temp_gpr().unwrap(); match sz { Size::S32 => { diff --git a/tests/compilers/imports.rs b/tests/compilers/imports.rs index c66286b8277..b3222f4dd69 100644 --- a/tests/compilers/imports.rs +++ b/tests/compilers/imports.rs @@ -9,6 +9,9 @@ use std::sync::{ Arc, }; use wasmer::*; +#[cfg(feature = "singlepass")] +use wasmer_compiler_singlepass::Singlepass; +use wasmer_engine_universal::Universal; fn get_module(store: &Store) -> Result { let wat = r#" @@ -432,3 +435,27 @@ fn instance_local_memory_lifetime(config: crate::Config) -> Result<()> { Ok(()) } + +#[cfg(feature = "singlepass")] +#[test] +fn test_singlepass_emit_bug() -> Result<()> { + // https://github.com/wasmerio/wasmer/issues/2347 + let wat = r#"(module + (type (;0;) (func (param f64) (result i32))) + (func (;0;) (type 0) (param f64) (result i32) + unreachable) + (func (;1;) (type 0) (param f64) (result i32) + i32.const -16579585 + f64.convert_i32_s + f64.ceil + f64.ceil + local.get 0 + f64.copysign + unreachable)) + "#; + + let store = Store::new(&Universal::new(Singlepass::default()).engine()); + let module = Module::new(&store, wat)?; + + Ok(()) +}