]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/ssa: fix ppc64 merging of (CLRLSLDI (SRD ...))
authorPaul E. Murphy <murp@ibm.com>
Mon, 20 May 2024 19:44:21 +0000 (14:44 -0500)
committerPaul Murphy <murp@ibm.com>
Tue, 21 May 2024 18:53:43 +0000 (18:53 +0000)
The rotate value was not correctly converted from a 64 bit to 32
bit rotate. This caused a miscompile of
golang.org/x/text/unicode/runenames.Names.

Fixes #67526

Change-Id: Ief56fbab27ccc71cd4c01117909bfee7f60a2ea1
Reviewed-on: https://go-review.googlesource.com/c/go/+/586915
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
src/cmd/compile/internal/ssa/rewrite.go
test/codegen/shift.go

index f9566368c03ca6cb914e42a070aee2ba66c61d5c..c3007781d63bc1277796380bc3cc7315ecd6fa26 100644 (file)
@@ -1631,7 +1631,7 @@ func mergePPC64ClrlsldiSrd(sld, srd int64) int64 {
        if v1&mask_3 != 0 {
                return 0
        }
-       return encodePPC64RotateMask(int64(r_3-32), int64(mask_3), 32)
+       return encodePPC64RotateMask(int64(r_3&31), int64(mask_3), 32)
 }
 
 // Test if a RLWINM feeding into a CLRLSLDI can be merged into RLWINM.  Return
index dd91a1db987b77b0b984ee48f03d0c37ef2aa940..6a2a6c40cdaed4a3c76f38c9ff855eab854614f4 100644 (file)
@@ -453,7 +453,7 @@ func checkMergedShifts32(a [256]uint32, b [256]uint64, u uint32, v uint32) {
        b[2] = b[v>>25]
 }
 
-func checkMergedShifts64(a [256]uint32, b [256]uint64, v uint64) {
+func checkMergedShifts64(a [256]uint32, b [256]uint64, c [256]byte, v uint64) {
        // ppc64x: -"CLRLSLDI", "RLWNM\t[$]10, R[0-9]+, [$]22, [$]29, R[0-9]+"
        a[0] = a[uint8(v>>24)]
        // ppc64x: "SRD", "CLRLSLDI", -"RLWNM"
@@ -474,6 +474,10 @@ func checkMergedShifts64(a [256]uint32, b [256]uint64, v uint64) {
        b[1] = b[(v>>20)&0xFF]
        // ppc64x: "RLWNM", -"SLD"
        b[2] = b[((uint64((uint32(v) >> 21)) & 0x3f) << 4)]
+       // ppc64x: "RLWNM\t[$]11, R[0-9]+, [$]10, [$]15"
+       c[0] = c[((v>>5)&0x3F)<<16]
+       // ppc64x: "RLWNM\t[$]0, R[0-9]+, [$]19, [$]24"
+       c[1] = c[((v>>7)&0x3F)<<7]
 }
 
 func checkShiftMask(a uint32, b uint64, z []uint32, y []uint64) {