aboutsummaryrefslogtreecommitdiff
path: root/test/codegen
diff options
context:
space:
mode:
authorArchana R <aravind5@in.ibm.com>2022-11-11 06:10:59 -0600
committerLynn Boger <laboger@linux.vnet.ibm.com>2023-02-06 12:49:53 +0000
commita432d89137ae09c76717695064d8b1b13344b32b (patch)
tree3ed444efe65aab9376641c7e6fc0390de75b74f5 /test/codegen
parentdef0be5e34d6657c84407c8afe4ace05d10d1848 (diff)
downloadgo-a432d89137ae09c76717695064d8b1b13344b32b.tar.xz
cmd/compile: add rules to emit SETBC/R instructions on power10
This CL adds rules that replaces instances of ISEL that produce a boolean result based on a condition register by SETBC/SETBCR operations. On Power10 these are convereted to SETBC/SETBCR instructions that use one register instead of 3 registers conventionally used by ISEL and hence reduces register pressure. On loops written specifically to exercise such instances of ISEL extensively, a performance improvement of 2.5% is seen on Power10. Also added verification tests to verify correct generation of SETBC/SETBCR instructions on Power10. Change-Id: Ib719897f09d893de40324440a43052dca026e8fa Reviewed-on: https://go-review.googlesource.com/c/go/+/449795 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Run-TryBot: Archana Ravindar <aravind5@in.ibm.com> Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'test/codegen')
-rw-r--r--test/codegen/bool.go156
1 files changed, 156 insertions, 0 deletions
diff --git a/test/codegen/bool.go b/test/codegen/bool.go
index 286440d704..faf7033a2a 100644
--- a/test/codegen/bool.go
+++ b/test/codegen/bool.go
@@ -55,3 +55,159 @@ func convertEqBool64(x uint64) bool {
// ppc64x:"ANDCC","XOR",-"CMP",-"ISEL"
return x&1 == 0
}
+
+func TestSetEq64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0EQ"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0EQ"
+ b := x == y
+ return b
+}
+func TestSetNeq64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0EQ"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0EQ"
+ b := x != y
+ return b
+}
+func TestSetLt64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0GT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0GT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0GT"
+ b := x < y
+ return b
+}
+func TestSetLe64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0LT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0LT"
+ b := x <= y
+ return b
+}
+func TestSetGt64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0LT"
+ b := x > y
+ return b
+}
+func TestSetGe64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0GT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0GT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0GT"
+ b := x >= y
+ return b
+}
+func TestSetLtFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+ b := x < y
+ return b
+}
+func TestSetLeFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT","SETBC\tCR0EQ","OR",-"ISEL",-"ISEL"
+ // ppc64x/power9:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+ // ppc64x/power8:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+ b := x <= y
+ return b
+}
+func TestSetGtFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+ b := x > y
+ return b
+}
+func TestSetGeFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT","SETBC\tCR0EQ","OR",-"ISEL",-"ISEL"
+ // ppc64x/power9:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+ // ppc64x/power8:"ISEL","ISEL",-"SETBC\tCR0LT",-"SETBC\tCR0EQ","OR"
+ b := x >= y
+ return b
+}
+func TestSetInvEq64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0EQ"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0EQ"
+ b := !(x == y)
+ return b
+}
+func TestSetInvNeq64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0EQ"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0EQ"
+ b := !(x != y)
+ return b
+}
+func TestSetInvLt64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0GT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0GT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0GT"
+ b := !(x < y)
+ return b
+}
+func TestSetInvLe64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0LT"
+ b := !(x <= y)
+ return b
+}
+func TestSetInvGt64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBCR\tCR0LT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBCR\tCR0LT"
+ b := !(x > y)
+ return b
+}
+func TestSetInvGe64(x uint64, y uint64) bool {
+ // ppc64x/power10:"SETBC\tCR0GT",-"ISEL"
+ // ppc64x/power9:"CMP","ISEL",-"SETBC\tCR0GT"
+ // ppc64x/power8:"CMP","ISEL",-"SETBC\tCR0GT"
+ b := !(x >= y)
+ return b
+}
+
+func TestSetInvEqFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBCR\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0EQ"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0EQ"
+ b := !(x == y)
+ return b
+}
+func TestSetInvNeqFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0EQ",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0EQ"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0EQ"
+ b := !(x != y)
+ return b
+}
+func TestSetInvLtFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0LT"
+ b := !(x < y)
+ return b
+}
+func TestSetInvLeFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+ b := !(x <= y)
+ return b
+}
+func TestSetInvGtFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBCR\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBCR\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBCR\tCR0LT"
+ b := !(x > y)
+ return b
+}
+func TestSetInvGeFp64(x float64, y float64) bool {
+ // ppc64x/power10:"SETBC\tCR0LT",-"ISEL"
+ // ppc64x/power9:"FCMP","ISEL",-"SETBC\tCR0LT"
+ // ppc64x/power8:"FCMP","ISEL",-"SETBC\tCR0LT"
+ b := !(x >= y)
+ return b
+}