]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.16] cmd/compile: fix ANDI/SRWI merge on ppc64
authorPaul E. Murphy <murp@ibm.com>
Thu, 15 Apr 2021 18:41:01 +0000 (13:41 -0500)
committerCarlos Amedee <carlos@golang.org>
Tue, 4 May 2021 15:18:16 +0000 (15:18 +0000)
The shift amount should be masked to avoid rotation values
beyond the numer of bits. In this case, if the shift amount
is 0, it should rotate 0, not 32.

Fixes #45636

Change-Id: I1e764497a39d0ec128e29af42352b70c70b2ecc5
Reviewed-on: https://go-review.googlesource.com/c/go/+/310569
Run-TryBot: Paul Murphy <murp@ibm.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Carlos Eduardo Seo <carlos.seo@linaro.org>
Trust: Carlos Eduardo Seo <carlos.seo@linaro.org>
(cherry picked from commit c8fb0ec5a005289e9dd890b746e543b38bbd9528)
Reviewed-on: https://go-review.googlesource.com/c/go/+/311378
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
Trust: Lynn Boger <laboger@linux.vnet.ibm.com>

src/cmd/compile/internal/ssa/rewrite.go
src/cmd/compile/internal/ssa/rewrite_test.go

index f5d1a7889fb19f6fb4bdbe64f1df4d337bf2f079..9e5ef68b1e9551664405154f268561aa2343ae37 100644 (file)
@@ -1469,7 +1469,7 @@ func mergePPC64AndSrwi(m, s int64) int64 {
        if !isPPC64WordRotateMask(mask) {
                return 0
        }
-       return encodePPC64RotateMask(32-s, mask, 32)
+       return encodePPC64RotateMask((32-s)&31, mask, 32)
 }
 
 // Test if a shift right feeding into a CLRLSLDI can be merged into RLWINM.
index 6fe429e85a67f3c509f1cdc5dafdbfdb55027882..64d128b8a4d7cd36e1a0ce93412b85b89fe43f5d 100644 (file)
@@ -205,6 +205,7 @@ func TestMergePPC64AndSrwi(t *testing.T) {
                {0x00000000, 4, false, 0, 0},
                {0xF0000000, 4, false, 0, 0},
                {0xF0000000, 32, false, 0, 0},
+               {0xFFFFFFFF, 0, true, 0, 0xFFFFFFFF},
        }
        for i, v := range tests {
                result := mergePPC64AndSrwi(v.and, v.srw)