aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/s390x
diff options
context:
space:
mode:
authorMichael Munday <mike.munday@ibm.com>2017-11-07 04:40:56 -0500
committerMichael Munday <mike.munday@ibm.com>2017-11-07 14:18:00 +0000
commit33c246ff9250ea07b5e0178e0638cb703f90fba3 (patch)
tree0a145a04afea18d28b3effa8c59239b89081cd43 /src/cmd/compile/internal/s390x
parent83a1a2ba63cd79ed65a97bead2c31ef0753f4cd2 (diff)
downloadgo-33c246ff9250ea07b5e0178e0638cb703f90fba3.tar.gz
go-33c246ff9250ea07b5e0178e0638cb703f90fba3.zip
cmd/compile: fix SSA immediate sign extension on s390x
The CMPWUconst op (32-bit unsigned comparison with immediate) takes an unsigned immediate value. In SSA this should be sign extended to 64-bits to match the Int32 type given in the op and then zero extended when producing the final assembly. Before this CL we were zero extending in SSA which caused ssacheck to fail. While we are here also ensure other 32-bit immediates are sign extended in SSA. Passes toolstash -cmp on std on s390x. Fixes #22611. Change-Id: I5c061a76a710b10ecb0650c9c42efd9fa1c123cc Reviewed-on: https://go-review.googlesource.com/76336 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/s390x')
-rw-r--r--src/cmd/compile/internal/s390x/ssa.go8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go
index 6612407d52..c9d1f52c8f 100644
--- a/src/cmd/compile/internal/s390x/ssa.go
+++ b/src/cmd/compile/internal/s390x/ssa.go
@@ -337,12 +337,18 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
opregreg(s, v.Op.Asm(), v.Args[1].Reg(), v.Args[0].Reg())
case ssa.OpS390XFCMPS, ssa.OpS390XFCMP:
opregreg(s, v.Op.Asm(), v.Args[1].Reg(), v.Args[0].Reg())
- case ssa.OpS390XCMPconst, ssa.OpS390XCMPWconst, ssa.OpS390XCMPUconst, ssa.OpS390XCMPWUconst:
+ case ssa.OpS390XCMPconst, ssa.OpS390XCMPWconst:
p := s.Prog(v.Op.Asm())
p.From.Type = obj.TYPE_REG
p.From.Reg = v.Args[0].Reg()
p.To.Type = obj.TYPE_CONST
p.To.Offset = v.AuxInt
+ case ssa.OpS390XCMPUconst, ssa.OpS390XCMPWUconst:
+ p := s.Prog(v.Op.Asm())
+ p.From.Type = obj.TYPE_REG
+ p.From.Reg = v.Args[0].Reg()
+ p.To.Type = obj.TYPE_CONST
+ p.To.Offset = int64(uint32(v.AuxInt))
case ssa.OpS390XMOVDconst:
x := v.Reg()
p := s.Prog(v.Op.Asm())