[dev.ssa] cmd/compile: truncate auxint when constructing Prog
The upper bits of 8/16/32 bit constants are undefined. We need to
truncate in order to prevent x86.oclass misidentifying the size of the
constant.
Fixes #14389
Change-Id: I3e5ff79cd904376572a93f489ba7e152a5cb6e60
Reviewed-on: https://go-review.googlesource.com/19740
Reviewed-by: Keith Randall <khr@golang.org>
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 3f8fdce..19fda37 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -3990,7 +3990,7 @@
r := regnum(v)
a := regnum(v.Args[0])
if r == a {
- if v.AuxInt == 1 {
+ if v.AuxInt2Int64() == 1 {
var asm int
switch v.Op {
// Software optimization manual recommends add $1,reg.
@@ -4009,7 +4009,7 @@
p.To.Type = obj.TYPE_REG
p.To.Reg = r
return
- } else if v.AuxInt == -1 {
+ } else if v.AuxInt2Int64() == -1 {
var asm int
switch v.Op {
case ssa.OpAMD64ADDQconst:
@@ -4026,7 +4026,7 @@
} else {
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
return
@@ -4044,7 +4044,7 @@
p := Prog(asm)
p.From.Type = obj.TYPE_MEM
p.From.Reg = a
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
case ssa.OpAMD64MULQconst, ssa.OpAMD64MULLconst, ssa.OpAMD64MULWconst, ssa.OpAMD64MULBconst:
@@ -4059,7 +4059,7 @@
}
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
// TODO: Teach doasm to compile the three-address multiply imul $c, r1, r2
@@ -4074,7 +4074,7 @@
// a = b + (- const), saves us 1 instruction. We can't fit
// - (-1 << 31) into 4 bytes offset in lea.
// We handle 2-address just fine below.
- if v.AuxInt == -1<<31 || x == r {
+ if v.AuxInt2Int64() == -1<<31 || x == r {
if x != r {
// This code compensates for the fact that the register allocator
// doesn't understand 2-address instructions yet. TODO: fix that.
@@ -4086,10 +4086,10 @@
}
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
- } else if x == r && v.AuxInt == -1 {
+ } else if x == r && v.AuxInt2Int64() == -1 {
var asm int
// x = x - (-1) is the same as x++
// See OpAMD64ADDQconst comments about inc vs add $1,reg
@@ -4104,7 +4104,7 @@
p := Prog(asm)
p.To.Type = obj.TYPE_REG
p.To.Reg = r
- } else if x == r && v.AuxInt == 1 {
+ } else if x == r && v.AuxInt2Int64() == 1 {
var asm int
switch v.Op {
case ssa.OpAMD64SUBQconst:
@@ -4130,7 +4130,7 @@
p := Prog(asm)
p.From.Type = obj.TYPE_MEM
p.From.Reg = x
- p.From.Offset = -v.AuxInt
+ p.From.Offset = -v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
}
@@ -4157,7 +4157,7 @@
}
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = r
case ssa.OpAMD64SBBQcarrymask, ssa.OpAMD64SBBLcarrymask:
@@ -4204,29 +4204,18 @@
p.From.Type = obj.TYPE_REG
p.From.Reg = regnum(v.Args[0])
p.To.Type = obj.TYPE_CONST
- p.To.Offset = v.AuxInt
+ p.To.Offset = v.AuxInt2Int64()
case ssa.OpAMD64TESTQconst, ssa.OpAMD64TESTLconst, ssa.OpAMD64TESTWconst, ssa.OpAMD64TESTBconst:
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- p.From.Offset = v.AuxInt
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = regnum(v.Args[0])
case ssa.OpAMD64MOVBconst, ssa.OpAMD64MOVWconst, ssa.OpAMD64MOVLconst, ssa.OpAMD64MOVQconst:
x := regnum(v)
p := Prog(v.Op.Asm())
p.From.Type = obj.TYPE_CONST
- var i int64
- switch v.Op {
- case ssa.OpAMD64MOVBconst:
- i = int64(v.AuxInt8())
- case ssa.OpAMD64MOVWconst:
- i = int64(v.AuxInt16())
- case ssa.OpAMD64MOVLconst:
- i = int64(v.AuxInt32())
- case ssa.OpAMD64MOVQconst:
- i = v.AuxInt
- }
- p.From.Offset = i
+ p.From.Offset = v.AuxInt2Int64()
p.To.Type = obj.TYPE_REG
p.To.Reg = x
// If flags are live at this instruction, suppress the