Index: lib/Target/WebAssembly/WebAssemblyInstrSIMD.td =================================================================== --- lib/Target/WebAssembly/WebAssemblyInstrSIMD.td +++ lib/Target/WebAssembly/WebAssemblyInstrSIMD.td @@ -173,28 +173,23 @@ defm "" : SIMDBinary; defm "" : SIMDBinary; } -multiclass SIMDNeg simdop> { +multiclass SIMDNegInt 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 (sub + (vec_t immAllZerosV), (vec_t V128:$vec) )) )], vec#".neg\t$dst, $vec", vec#".neg", simdop>; } -multiclass SIMDNegInt simdop> { - defm "" : SIMDNeg; -} -def fpimm0 : FPImmLeaf; -multiclass SIMDNegFP simdop> { - defm "" : SIMDNeg; +multiclass SIMDNegFP simdop> { + defm NEG_#vec_t : SIMD_I<(outs V128:$dst), (ins V128:$vec), + (outs), (ins), + [(set (vec_t V128:$dst), (vec_t (fneg V128:$vec)))], + vec#".neg\t$dst, $vec", vec#".neg", simdop>; } multiclass SIMDNot { defm NOT_#vec_t : SIMD_I<(outs V128:$dst), (ins V128:$vec), @@ -387,12 +382,12 @@ defm SUB_SAT_U : SIMDBinarySat; defm DIV : SIMDBinaryFP; -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; -defm "" : SIMDNegInt; -defm "" : SIMDNegFP; -defm "" : SIMDNegFP; +defm "" : SIMDNegInt; +defm "" : SIMDNegInt; +defm "" : SIMDNegInt; +defm "" : SIMDNegInt; +defm "" : SIMDNegFP; +defm "" : SIMDNegFP; defm SHL : SIMDShiftInt; defm SHR_S : SIMDShiftInt; Index: test/CodeGen/WebAssembly/simd-arith.ll =================================================================== --- test/CodeGen/WebAssembly/simd-arith.ll +++ test/CodeGen/WebAssembly/simd-arith.ll @@ -744,7 +744,7 @@ ; 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 + %a = fsub fast <4 x float> , %x ret <4 x float> %a } @@ -826,7 +826,7 @@ ; 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 + %a = fsub fast <2 x double> , %x ret <2 x double> %a }