diff --git a/cranelift/filetests/isa/x86/legalize-libcall.cton b/cranelift/filetests/isa/x86/legalize-libcall.cton index d633bd4e46..fdad2a3cf2 100644 --- a/cranelift/filetests/isa/x86/legalize-libcall.cton +++ b/cranelift/filetests/isa/x86/legalize-libcall.cton @@ -3,6 +3,7 @@ test legalizer ; Pre-SSE 4.1, we need to use runtime library calls for floating point rounding operations. set is_64bit set is_pic +set call_conv=system_v isa x86 function %floor(f32) -> f32 { @@ -11,6 +12,6 @@ ebb0(v0: f32): return v1 } ; check: function %floor(f32 [%xmm0]) -> f32 [%xmm0] fast { -; check: sig0 = (f32) -> f32 fast +; check: sig0 = (f32 [%xmm0]) -> f32 [%xmm0] system_v ; check: fn0 = %FloorF32 sig0 ; check: v1 = call fn0(v0) diff --git a/cranelift/filetests/wasm/f32-arith.cton b/cranelift/filetests/wasm/f32-arith.cton index d21316d293..7ce8eb4142 100644 --- a/cranelift/filetests/wasm/f32-arith.cton +++ b/cranelift/filetests/wasm/f32-arith.cton @@ -4,9 +4,15 @@ test compile set is_64bit=0 isa x86 haswell +set is_64bit=0 +isa x86 baseline + set is_64bit=1 isa x86 haswell +set is_64bit=1 +isa x86 baseline + ; Constants. function %f32_const() -> f32 { diff --git a/cranelift/filetests/wasm/f64-arith.cton b/cranelift/filetests/wasm/f64-arith.cton index 7b870ab2cb..150d9a0d8e 100644 --- a/cranelift/filetests/wasm/f64-arith.cton +++ b/cranelift/filetests/wasm/f64-arith.cton @@ -4,6 +4,9 @@ test compile set is_64bit=1 isa x86 haswell +set is_64bit=1 +isa x86 baseline + ; Constants. function %f64_const() -> f64 { diff --git a/cranelift/filetests/wasm/i32-arith.cton b/cranelift/filetests/wasm/i32-arith.cton index 7fb388054f..f6ee971c69 100644 --- a/cranelift/filetests/wasm/i32-arith.cton +++ b/cranelift/filetests/wasm/i32-arith.cton @@ -4,9 +4,15 @@ test compile set is_64bit=0 isa x86 haswell +set is_64bit=0 +isa x86 baseline + set is_64bit=1 isa x86 haswell +set is_64bit=1 +isa x86 baseline + ; Constants. function %i32_const() -> i32 { diff --git a/cranelift/filetests/wasm/i64-arith.cton b/cranelift/filetests/wasm/i64-arith.cton index 6cf6f2e4a2..52016039e0 100644 --- a/cranelift/filetests/wasm/i64-arith.cton +++ b/cranelift/filetests/wasm/i64-arith.cton @@ -4,6 +4,9 @@ test compile set is_64bit=1 isa x86 haswell +set is_64bit=1 +isa x86 baseline + ; Constants. function %i64_const() -> i64 { diff --git a/lib/codegen/src/legalizer/boundary.rs b/lib/codegen/src/legalizer/boundary.rs index 3c0a198f7f..4a865f2965 100644 --- a/lib/codegen/src/legalizer/boundary.rs +++ b/lib/codegen/src/legalizer/boundary.rs @@ -33,11 +33,9 @@ use std::vec::Vec; /// change the entry block arguments, calls, or return instructions, so this can leave the function /// in a state with type discrepancies. pub fn legalize_signatures(func: &mut Function, isa: &TargetIsa) { - isa.legalize_signature(&mut func.signature, true); - func.signature.compute_argument_bytes(); + legalize_signature(&mut func.signature, true, isa); for sig_data in func.dfg.signatures.values_mut() { - isa.legalize_signature(sig_data, false); - sig_data.compute_argument_bytes(); + legalize_signature(sig_data, false, isa); } if let Some(entry) = func.layout.entry_block() { @@ -46,6 +44,20 @@ pub fn legalize_signatures(func: &mut Function, isa: &TargetIsa) { } } +/// Legalize the libcall signature, which we may generate on the fly after +/// `legalize_signatures` has been called. +pub fn legalize_libcall_signature(signature: &mut Signature, isa: &TargetIsa) { + legalize_signature(signature, false, isa); +} + +/// Legalize the given signature. +/// +/// `current` is true if this is the signature for the current function. +fn legalize_signature(signature: &mut Signature, current: bool, isa: &TargetIsa) { + isa.legalize_signature(signature, current); + signature.compute_argument_bytes(); +} + /// Legalize the entry block parameters after `func`'s signature has been legalized. /// /// The legalized signature may contain more parameters than the original signature, and the diff --git a/lib/codegen/src/legalizer/libcall.rs b/lib/codegen/src/legalizer/libcall.rs index 70982da3cb..fb1ba6e313 100644 --- a/lib/codegen/src/legalizer/libcall.rs +++ b/lib/codegen/src/legalizer/libcall.rs @@ -3,6 +3,7 @@ use ir; use ir::{get_libcall_funcref, InstBuilder}; use isa::TargetIsa; +use legalizer::boundary::legalize_libcall_signature; use std::vec::Vec; /// Try to expand `inst` as a library call, returning true is successful. @@ -21,7 +22,10 @@ pub fn expand_as_libcall(inst: ir::Inst, func: &mut ir::Function, isa: &TargetIs let funcref = get_libcall_funcref(libcall, func, inst, isa); func.dfg.replace(inst).call(funcref, &args); - // TODO: ask the ISA to legalize the signature. + // Ask the ISA to legalize the signature. + let fn_data = &func.dfg.ext_funcs[funcref]; + let sig_data = &mut func.dfg.signatures[fn_data.signature]; + legalize_libcall_signature(sig_data, isa); true }