From 108e98ec32ba61a19965611206633cd2ebb0d6ba Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Wed, 10 Oct 2018 01:09:09 +0000 Subject: [PATCH] [WebAssembly] Fix fneg lowering Summary: Subtraction from zero and floating point negation do not have the same semantics, so fix lowering. Reviewers: aheejin, dschuff Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D52948 llvm-svn: 344107 --- .../lib/Target/WebAssembly/WebAssemblyInstrSIMD.td | 41 +++++++--------------- llvm/test/CodeGen/WebAssembly/simd-arith.ll | 6 ++-- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td index 672f391..28262fb 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td @@ -400,6 +400,9 @@ multiclass SIMDBinaryInt baseInst> { defm "" : SIMDBinary; } +// Integer vector negation +def ivneg : PatFrag<(ops node:$in), (sub immAllZerosV, node:$in)>; + // Integer addition: add let isCommutable = 1 in defm ADD : SIMDBinaryInt; @@ -411,29 +414,18 @@ defm SUB : SIMDBinaryInt; defm MUL : SIMDBinaryIntNoI64x2; // Integer negation: neg -multiclass SIMDNeg simdop> { - defm NEG_#vec_t : SIMD_I<(outs V128:$dst), (ins V128:$vec), - (outs), (ins), - [(set - (vec_t V128:$dst), - (vec_t (node - (vec_t (splat_pat lane)), - (vec_t V128:$vec) - )) +multiclass SIMDNeg simdop> { + defm NEG_#vec_t : SIMD_I<(outs V128:$dst), (ins V128:$vec), (outs), (ins), + [(set (vec_t V128:$dst), + (vec_t (neg (vec_t V128:$vec))) )], vec#".neg\t$dst, $vec", vec#".neg", simdop>; } -multiclass SIMDNegInt simdop> { - defm "" : SIMDNeg; -} - -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; +defm "" : SIMDNeg; +defm "" : SIMDNeg; +defm "" : SIMDNeg; +defm "" : SIMDNeg; //===----------------------------------------------------------------------===// // Saturating integer arithmetic @@ -718,15 +710,8 @@ def : StorePatExternSymOffOnly("STORE_"#vec_t)>; //===----------------------------------------------------------------------===// // Negation: neg -def fpimm0 : FPImmLeaf; -multiclass SIMDNegFP simdop> { - defm "" : SIMDNeg; -} - -defm "" : SIMDNegFP; -defm "" : SIMDNegFP; +defm "" : SIMDNeg; +defm "" : SIMDNeg; // Absolute value: abs multiclass SIMDAbs simdop> { diff --git a/llvm/test/CodeGen/WebAssembly/simd-arith.ll b/llvm/test/CodeGen/WebAssembly/simd-arith.ll index 0bda334..f3e7015 100644 --- a/llvm/test/CodeGen/WebAssembly/simd-arith.ll +++ b/llvm/test/CodeGen/WebAssembly/simd-arith.ll @@ -748,7 +748,8 @@ define <2 x i64> @bitselect_v2i64(<2 x i64> %c, <2 x i64> %v1, <2 x i64> %v2) { ; SIMD128-NEXT: f32x4.neg $push[[R:[0-9]+]]=, $0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} define <4 x float> @neg_v4f32(<4 x float> %x) { - %a = fsub <4 x float> , %x + ; nsz makes this semantically equivalent to flipping sign bit + %a = fsub nsz <4 x float> , %x ret <4 x float> %a } @@ -830,7 +831,8 @@ define <4 x float> @sqrt_v4f32(<4 x float> %x) { ; SIMD128-NEXT: f64x2.neg $push[[R:[0-9]+]]=, $0{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} define <2 x double> @neg_v2f64(<2 x double> %x) { - %a = fsub <2 x double> , %x + ; nsz makes this semantically equivalent to flipping sign bit + %a = fsub nsz <2 x double> , %x ret <2 x double> %a } -- 2.7.4