aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/rewriteS390X.go
diff options
context:
space:
mode:
authorRuixin(Peter) Bao <ruixin.bao@ibm.com>2019-11-26 15:33:37 -0500
committerMichael Munday <mike.munday@ibm.com>2020-03-25 13:10:07 +0000
commit16cfab8d89ec26a71356c73378ab92eafa6a7356 (patch)
tree791a02e574a9eb3635161cf044a1408502412ce0 /src/cmd/compile/internal/ssa/rewriteS390X.go
parent6b6414cab49fcc035e1f20bafdb723077e7d36bb (diff)
downloadgo-16cfab8d89ec26a71356c73378ab92eafa6a7356.tar.gz
go-16cfab8d89ec26a71356c73378ab92eafa6a7356.zip
cmd/compile: use load and test instructions on s390x
The load and test instructions compare the given value against zero and will produce a condition code indicating one of the following scenarios: 0: Result is zero 1: Result is less than zero 2: Result is greater than zero 3: Result is not a number (NaN) The instruction can be used to simplify floating point comparisons against zero, which can enable further optimizations. This CL also reduces the size of .text section of math.test binary by around 0.7 KB (in hexadecimal, from 1358f0 to 135620). Change-Id: I33cb714f0c6feebac7a1c46dfcc735e7daceff9c Reviewed-on: https://go-review.googlesource.com/c/go/+/209159 Reviewed-by: Michael Munday <mike.munday@ibm.com> Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/rewriteS390X.go')
-rw-r--r--src/cmd/compile/internal/ssa/rewriteS390X.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go
index 7c750574bc..7dd2e7633b 100644
--- a/src/cmd/compile/internal/ssa/rewriteS390X.go
+++ b/src/cmd/compile/internal/ssa/rewriteS390X.go
@@ -612,6 +612,10 @@ func rewriteValueS390X(v *Value) bool {
return rewriteValueS390X_OpS390XFADD(v)
case OpS390XFADDS:
return rewriteValueS390X_OpS390XFADDS(v)
+ case OpS390XFCMP:
+ return rewriteValueS390X_OpS390XFCMP(v)
+ case OpS390XFCMPS:
+ return rewriteValueS390X_OpS390XFCMPS(v)
case OpS390XFMOVDload:
return rewriteValueS390X_OpS390XFMOVDload(v)
case OpS390XFMOVDloadidx:
@@ -7230,6 +7234,86 @@ func rewriteValueS390X_OpS390XFADDS(v *Value) bool {
}
return false
}
+func rewriteValueS390X_OpS390XFCMP(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ b := v.Block
+ // match: (FCMP x (FMOVDconst [c]))
+ // cond: auxTo64F(c) == 0
+ // result: (LTDBR x)
+ for {
+ x := v_0
+ if v_1.Op != OpS390XFMOVDconst {
+ break
+ }
+ c := v_1.AuxInt
+ if !(auxTo64F(c) == 0) {
+ break
+ }
+ v.reset(OpS390XLTDBR)
+ v.AddArg(x)
+ return true
+ }
+ // match: (FCMP (FMOVDconst [c]) x)
+ // cond: auxTo64F(c) == 0
+ // result: (InvertFlags (LTDBR <v.Type> x))
+ for {
+ if v_0.Op != OpS390XFMOVDconst {
+ break
+ }
+ c := v_0.AuxInt
+ x := v_1
+ if !(auxTo64F(c) == 0) {
+ break
+ }
+ v.reset(OpS390XInvertFlags)
+ v0 := b.NewValue0(v.Pos, OpS390XLTDBR, v.Type)
+ v0.AddArg(x)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
+func rewriteValueS390X_OpS390XFCMPS(v *Value) bool {
+ v_1 := v.Args[1]
+ v_0 := v.Args[0]
+ b := v.Block
+ // match: (FCMPS x (FMOVSconst [c]))
+ // cond: auxTo32F(c) == 0
+ // result: (LTEBR x)
+ for {
+ x := v_0
+ if v_1.Op != OpS390XFMOVSconst {
+ break
+ }
+ c := v_1.AuxInt
+ if !(auxTo32F(c) == 0) {
+ break
+ }
+ v.reset(OpS390XLTEBR)
+ v.AddArg(x)
+ return true
+ }
+ // match: (FCMPS (FMOVSconst [c]) x)
+ // cond: auxTo32F(c) == 0
+ // result: (InvertFlags (LTEBR <v.Type> x))
+ for {
+ if v_0.Op != OpS390XFMOVSconst {
+ break
+ }
+ c := v_0.AuxInt
+ x := v_1
+ if !(auxTo32F(c) == 0) {
+ break
+ }
+ v.reset(OpS390XInvertFlags)
+ v0 := b.NewValue0(v.Pos, OpS390XLTEBR, v.Type)
+ v0.AddArg(x)
+ v.AddArg(v0)
+ return true
+ }
+ return false
+}
func rewriteValueS390X_OpS390XFMOVDload(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]