]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: fix FMA negative commutativity of riscv64
authorMeng Zhuo <mzh@golangcn.org>
Tue, 27 Jun 2023 15:22:04 +0000 (23:22 +0800)
committerKeith Randall <khr@golang.org>
Wed, 5 Jul 2023 22:05:44 +0000 (22:05 +0000)
According to RISCV manual 11.6:

FMADD x,y,z computes x*y+z and
FNMADD x,y,z => -x*y-z
FMSUB x,y,z => x*y-z
FNMSUB x,y,z => -x*y+z respectively

However our implement of SSA convert FMADD -x,y,z to FNMADD x,y,z which
is wrong and should be convert to FNMSUB according to manual.

Change-Id: Ib297bc83824e121fd7dda171ed56ea9694a4e575
Reviewed-on: https://go-review.googlesource.com/c/go/+/506575
Run-TryBot: M Zhuo <mzh@golangcn.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Joedian Reid <joedian@golang.org>
Reviewed-by: Michael Munday <mike.munday@lowrisc.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/compile/internal/ssa/_gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go
test/codegen/math.go

index eb1f10de9606485b0e8aef2e63cf605a48c8b1ab..9a6fcebdc5151151995d1190451410d25c72e7ef 100644 (file)
 //
 // Key:
 //
-//   [+ -](x * y) [+ -] z.
-//    _ N          A S
-//                 D U
-//                 D B
+//   [+ -](x * y [+ -] z).
+//    _ N         A S
+//                D U
+//                D B
 //
 // Note: multiplication commutativity handled by rule generator.
-(F(MADD|NMADD|MSUB|NMSUB)D neg:(FNEGD x) y z) && neg.Uses == 1 => (F(NMADD|MADD|NMSUB|MSUB)D x y z)
+(F(MADD|NMADD|MSUB|NMSUB)D neg:(FNEGD x) y z) && neg.Uses == 1 => (F(NMSUB|MSUB|NMADD|MADD)D x y z)
 (F(MADD|NMADD|MSUB|NMSUB)D x y neg:(FNEGD z)) && neg.Uses == 1 => (F(MSUB|NMSUB|MADD|NMADD)D x y z)
index f1debe0c212c5c9ce4aa2cf9acec7a57ee0f58ef..ffbeb1df47618fc7c6bc5b789676624da8ccd5e2 100644 (file)
@@ -3322,7 +3322,7 @@ func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
        v_0 := v.Args[0]
        // match: (FMADDD neg:(FNEGD x) y z)
        // cond: neg.Uses == 1
-       // result: (FNMADDD x y z)
+       // result: (FNMSUBD x y z)
        for {
                for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
                        neg := v_0
@@ -3335,7 +3335,7 @@ func rewriteValueRISCV64_OpRISCV64FMADDD(v *Value) bool {
                        if !(neg.Uses == 1) {
                                continue
                        }
-                       v.reset(OpRISCV64FNMADDD)
+                       v.reset(OpRISCV64FNMSUBD)
                        v.AddArg3(x, y, z)
                        return true
                }
@@ -3367,7 +3367,7 @@ func rewriteValueRISCV64_OpRISCV64FMSUBD(v *Value) bool {
        v_0 := v.Args[0]
        // match: (FMSUBD neg:(FNEGD x) y z)
        // cond: neg.Uses == 1
-       // result: (FNMSUBD x y z)
+       // result: (FNMADDD x y z)
        for {
                for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
                        neg := v_0
@@ -3380,7 +3380,7 @@ func rewriteValueRISCV64_OpRISCV64FMSUBD(v *Value) bool {
                        if !(neg.Uses == 1) {
                                continue
                        }
-                       v.reset(OpRISCV64FNMSUBD)
+                       v.reset(OpRISCV64FNMADDD)
                        v.AddArg3(x, y, z)
                        return true
                }
@@ -3412,7 +3412,7 @@ func rewriteValueRISCV64_OpRISCV64FNMADDD(v *Value) bool {
        v_0 := v.Args[0]
        // match: (FNMADDD neg:(FNEGD x) y z)
        // cond: neg.Uses == 1
-       // result: (FMADDD x y z)
+       // result: (FMSUBD x y z)
        for {
                for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
                        neg := v_0
@@ -3425,7 +3425,7 @@ func rewriteValueRISCV64_OpRISCV64FNMADDD(v *Value) bool {
                        if !(neg.Uses == 1) {
                                continue
                        }
-                       v.reset(OpRISCV64FMADDD)
+                       v.reset(OpRISCV64FMSUBD)
                        v.AddArg3(x, y, z)
                        return true
                }
@@ -3457,7 +3457,7 @@ func rewriteValueRISCV64_OpRISCV64FNMSUBD(v *Value) bool {
        v_0 := v.Args[0]
        // match: (FNMSUBD neg:(FNEGD x) y z)
        // cond: neg.Uses == 1
-       // result: (FMSUBD x y z)
+       // result: (FMADDD x y z)
        for {
                for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 {
                        neg := v_0
@@ -3470,7 +3470,7 @@ func rewriteValueRISCV64_OpRISCV64FNMSUBD(v *Value) bool {
                        if !(neg.Uses == 1) {
                                continue
                        }
-                       v.reset(OpRISCV64FMSUBD)
+                       v.reset(OpRISCV64FMADDD)
                        v.AddArg3(x, y, z)
                        return true
                }
index 6a7d304afdc676afdcc501f3816079b3c3ad624a..331ebbe6094bb18a5a567d485fb6da707eede1da 100644 (file)
@@ -143,13 +143,13 @@ func fms(x, y, z float64) float64 {
        return math.FMA(x, y, -z)
 }
 
-func fnma(x, y, z float64) float64 {
-       // riscv64:"FNMADDD"
+func fnms(x, y, z float64) float64 {
+       // riscv64:"FNMSUBD",-"FNMADDD"
        return math.FMA(-x, y, z)
 }
 
-func fnms(x, y, z float64) float64 {
-       // riscv64:"FNMSUBD"
+func fnma(x, y, z float64) float64 {
+       // riscv64:"FNMADDD",-"FNMSUBD"
        return math.FMA(x, -y, -z)
 }