diff --git a/cranelift/filetests/wasm/f32-arith.cton b/cranelift/filetests/wasm/f32-arith.cton index 2e7281398d..ddb05138e9 100644 --- a/cranelift/filetests/wasm/f32-arith.cton +++ b/cranelift/filetests/wasm/f32-arith.cton @@ -87,4 +87,9 @@ ebb0(v0: f32, v1: f32): ; function %f32_min(f32, f32) -> f32 ; function %f32_max(f32, f32) -> f32 -; function %f32_copysign(f32, f32) -> f32 + +function %f32_copysign(f32, f32) -> f32 { +ebb0(v0: f32, v1: f32): + v2 = fcopysign v0, v1 + return v2 +} diff --git a/cranelift/filetests/wasm/f64-arith.cton b/cranelift/filetests/wasm/f64-arith.cton index cfed4f95a5..d67066e615 100644 --- a/cranelift/filetests/wasm/f64-arith.cton +++ b/cranelift/filetests/wasm/f64-arith.cton @@ -84,4 +84,9 @@ ebb0(v0: f64, v1: f64): ; function %f64_min(f64, f64) -> f64 ; function %f64_max(f64, f64) -> f64 -; function %f64_copysign(f64, f64) -> f64 + +function %f64_copysign(f64, f64) -> f64 { +ebb0(v0: f64, v1: f64): + v2 = fcopysign v0, v1 + return v2 +} diff --git a/lib/cretonne/meta/base/legalize.py b/lib/cretonne/meta/base/legalize.py index e535f62114..8608feb392 100644 --- a/lib/cretonne/meta/base/legalize.py +++ b/lib/cretonne/meta/base/legalize.py @@ -226,3 +226,11 @@ for ty, minus_zero in [ b << minus_zero, a << bxor(x, b), )) + expand.legalize( + a << insts.fcopysign.bind(ty)(x, y), + Rtl( + b << minus_zero, + a1 << band_not(x, b), + a2 << band(y, b), + a << bor(a1, a2) + ))