diff options
| author | Archana R <aravind5@in.ibm.com> | 2022-11-11 06:10:59 -0600 |
|---|---|---|
| committer | Lynn Boger <laboger@linux.vnet.ibm.com> | 2023-02-06 12:49:53 +0000 |
| commit | a432d89137ae09c76717695064d8b1b13344b32b (patch) | |
| tree | 3ed444efe65aab9376641c7e6fc0390de75b74f5 /test/codegen | |
| parent | def0be5e34d6657c84407c8afe4ace05d10d1848 (diff) | |
| download | go-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.go | 156 |
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 +} |
