aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@google.com>2017-12-07 14:11:19 -0800
committerAndrew Bonventre <andybons@golang.org>2018-01-22 20:25:06 +0000
commita94581d0215a140419c12df97bb582035b43a90d (patch)
treeba3dbbce109dabe74e302d997fc93ace1e9b912a
parentf548fb287bdd415d6278d9bb9cc726e754c93c8a (diff)
downloadgo-a94581d0215a140419c12df97bb582035b43a90d.tar.gz
go-a94581d0215a140419c12df97bb582035b43a90d.zip
[release-branch.go1.9] cmd/compile: fix large load/store offsets on 386
Pointer arithemetic is done mod 2^32 on 386, so we can just drop the high bits of any large constant offsets. The bounds check will make sure wraparounds are never observed. Fixes #21655 Change-Id: I68ae5bbea9f02c73968ea2b21ca017e5ecb89223 Reviewed-on: https://go-review.googlesource.com/82675 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Reviewed-on: https://go-review.googlesource.com/88324 Run-TryBot: Andrew Bonventre <andybons@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
-rw-r--r--src/cmd/compile/internal/ssa/gen/386.rules78
-rw-r--r--src/cmd/compile/internal/ssa/rewrite386.go192
-rw-r--r--test/fixedbugs/issue21655.go22
3 files changed, 157 insertions, 135 deletions
diff --git a/src/cmd/compile/internal/ssa/gen/386.rules b/src/cmd/compile/internal/ssa/gen/386.rules
index 49fcd36530..047052d21f 100644
--- a/src/cmd/compile/internal/ssa/gen/386.rules
+++ b/src/cmd/compile/internal/ssa/gen/386.rules
@@ -798,45 +798,45 @@
(MOVLstoreconstidx1 [c] {sym} ptr (SHLLconst [2] idx) mem) -> (MOVLstoreconstidx4 [c] {sym} ptr idx mem)
// combine ADDL into indexed loads and stores
-(MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVBloadidx1 [c+d] {sym} ptr idx mem)
-(MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVWloadidx1 [c+d] {sym} ptr idx mem)
-(MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVWloadidx2 [c+d] {sym} ptr idx mem)
-(MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVLloadidx1 [c+d] {sym} ptr idx mem)
-(MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVLloadidx4 [c+d] {sym} ptr idx mem)
-(MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSSloadidx1 [c+d] {sym} ptr idx mem)
-(MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSSloadidx4 [c+d] {sym} ptr idx mem)
-(MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSDloadidx1 [c+d] {sym} ptr idx mem)
-(MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSDloadidx8 [c+d] {sym} ptr idx mem)
-
-(MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVWstoreidx2 [c+d] {sym} ptr idx val mem)
-(MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVLstoreidx4 [c+d] {sym} ptr idx val mem)
-(MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSSstoreidx4 [c+d] {sym} ptr idx val mem)
-(MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSDstoreidx8 [c+d] {sym} ptr idx val mem)
-
-(MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVBloadidx1 [c+d] {sym} ptr idx mem)
-(MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVWloadidx1 [c+d] {sym} ptr idx mem)
-(MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVWloadidx2 [c+2*d] {sym} ptr idx mem)
-(MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVLloadidx1 [c+d] {sym} ptr idx mem)
-(MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVLloadidx4 [c+4*d] {sym} ptr idx mem)
-(MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSSloadidx1 [c+d] {sym} ptr idx mem)
-(MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSSloadidx4 [c+4*d] {sym} ptr idx mem)
-(MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSDloadidx1 [c+d] {sym} ptr idx mem)
-(MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSDloadidx8 [c+8*d] {sym} ptr idx mem)
-
-(MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVWstoreidx2 [c+2*d] {sym} ptr idx val mem)
-(MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVLstoreidx4 [c+4*d] {sym} ptr idx val mem)
-(MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSSstoreidx4 [c+4*d] {sym} ptr idx val mem)
-(MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem)
-(MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSDstoreidx8 [c+8*d] {sym} ptr idx val mem)
+(MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem) -> (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem)
+
+(MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem) -> (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem)
+
+(MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem)
+(MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem)
+(MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem)
+(MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
+(MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem) -> (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem)
+
+(MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem)
+(MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem)
+(MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem)
+(MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
+(MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem) -> (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem)
(MOVBstoreconstidx1 [x] {sym} (ADDLconst [c] ptr) idx mem) ->
(MOVBstoreconstidx1 [ValAndOff(x).add(c)] {sym} ptr idx mem)
diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go
index f9cddd0f70..468be07d3e 100644
--- a/src/cmd/compile/internal/ssa/rewrite386.go
+++ b/src/cmd/compile/internal/ssa/rewrite386.go
@@ -3148,7 +3148,7 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool {
func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
// match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3162,7 +3162,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVBloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3171,7 +3171,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
}
// match: (MOVBloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem)
// cond:
- // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3185,7 +3185,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
ptr := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVBloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3194,7 +3194,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
}
// match: (MOVBloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3208,7 +3208,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVBloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3217,7 +3217,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
}
// match: (MOVBloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem)
// cond:
- // result: (MOVBloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVBloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3231,7 +3231,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool {
ptr := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVBloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3747,7 +3747,7 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
// match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3762,7 +3762,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVBstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3772,7 +3772,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
}
// match: (MOVBstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem)
// cond:
- // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3787,7 +3787,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVBstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3797,7 +3797,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
}
// match: (MOVBstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3812,7 +3812,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVBstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -3822,7 +3822,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
}
// match: (MOVBstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem)
// cond:
- // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVBstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -3837,7 +3837,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVBstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4486,7 +4486,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
}
// match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4500,7 +4500,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVLloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4509,7 +4509,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
}
// match: (MOVLloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem)
// cond:
- // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4523,7 +4523,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
ptr := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVLloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4532,7 +4532,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
}
// match: (MOVLloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4546,7 +4546,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVLloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4555,7 +4555,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
}
// match: (MOVLloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem)
// cond:
- // result: (MOVLloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVLloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4569,7 +4569,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
ptr := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVLloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4581,7 +4581,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool {
// match: (MOVLloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVLloadidx4 [c+d] {sym} ptr idx mem)
+ // result: (MOVLloadidx4 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4595,7 +4595,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVLloadidx4)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -4604,7 +4604,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool {
}
// match: (MOVLloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVLloadidx4 [c+4*d] {sym} ptr idx mem)
+ // result: (MOVLloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -4618,7 +4618,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVLloadidx4)
- v.AuxInt = c + 4*d
+ v.AuxInt = int64(int32(c + 4*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5114,7 +5114,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
}
// match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5129,7 +5129,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5139,7 +5139,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
}
// match: (MOVLstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem)
// cond:
- // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5154,7 +5154,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5164,7 +5164,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
}
// match: (MOVLstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5179,7 +5179,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5189,7 +5189,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
}
// match: (MOVLstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem)
// cond:
- // result: (MOVLstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5204,7 +5204,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5217,7 +5217,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool {
// match: (MOVLstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVLstoreidx4 [c+d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5232,7 +5232,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx4)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5242,7 +5242,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool {
}
// match: (MOVLstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVLstoreidx4 [c+4*d] {sym} ptr idx val mem)
+ // result: (MOVLstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5257,7 +5257,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVLstoreidx4)
- v.AuxInt = c + 4*d
+ v.AuxInt = int64(int32(c + 4*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5431,7 +5431,7 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool {
func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool {
// match: (MOVSDloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5445,7 +5445,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVSDloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5454,7 +5454,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool {
}
// match: (MOVSDloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVSDloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVSDloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5468,7 +5468,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVSDloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5480,7 +5480,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool {
// match: (MOVSDloadidx8 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVSDloadidx8 [c+d] {sym} ptr idx mem)
+ // result: (MOVSDloadidx8 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5494,7 +5494,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVSDloadidx8)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5503,7 +5503,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool {
}
// match: (MOVSDloadidx8 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVSDloadidx8 [c+8*d] {sym} ptr idx mem)
+ // result: (MOVSDloadidx8 [int64(int32(c+8*d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5517,7 +5517,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVSDloadidx8)
- v.AuxInt = c + 8*d
+ v.AuxInt = int64(int32(c + 8*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5677,7 +5677,7 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool {
func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool {
// match: (MOVSDstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5692,7 +5692,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSDstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5702,7 +5702,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool {
}
// match: (MOVSDstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVSDstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSDstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5717,7 +5717,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSDstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5730,7 +5730,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool {
// match: (MOVSDstoreidx8 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVSDstoreidx8 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSDstoreidx8 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5745,7 +5745,7 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSDstoreidx8)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5755,7 +5755,7 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool {
}
// match: (MOVSDstoreidx8 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVSDstoreidx8 [c+8*d] {sym} ptr idx val mem)
+ // result: (MOVSDstoreidx8 [int64(int32(c+8*d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5770,7 +5770,7 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSDstoreidx8)
- v.AuxInt = c + 8*d
+ v.AuxInt = int64(int32(c + 8*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5944,7 +5944,7 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool {
func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool {
// match: (MOVSSloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5958,7 +5958,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVSSloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5967,7 +5967,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool {
}
// match: (MOVSSloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVSSloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVSSloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -5981,7 +5981,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVSSloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -5993,7 +5993,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool {
// match: (MOVSSloadidx4 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVSSloadidx4 [c+d] {sym} ptr idx mem)
+ // result: (MOVSSloadidx4 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6007,7 +6007,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVSSloadidx4)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6016,7 +6016,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool {
}
// match: (MOVSSloadidx4 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVSSloadidx4 [c+4*d] {sym} ptr idx mem)
+ // result: (MOVSSloadidx4 [int64(int32(c+4*d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6030,7 +6030,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVSSloadidx4)
- v.AuxInt = c + 4*d
+ v.AuxInt = int64(int32(c + 4*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6190,7 +6190,7 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool {
func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool {
// match: (MOVSSstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6205,7 +6205,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSSstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6215,7 +6215,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool {
}
// match: (MOVSSstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVSSstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSSstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6230,7 +6230,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSSstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6243,7 +6243,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool {
// match: (MOVSSstoreidx4 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVSSstoreidx4 [c+d] {sym} ptr idx val mem)
+ // result: (MOVSSstoreidx4 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6258,7 +6258,7 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSSstoreidx4)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6268,7 +6268,7 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool {
}
// match: (MOVSSstoreidx4 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVSSstoreidx4 [c+4*d] {sym} ptr idx val mem)
+ // result: (MOVSSstoreidx4 [int64(int32(c+4*d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6283,7 +6283,7 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVSSstoreidx4)
- v.AuxInt = c + 4*d
+ v.AuxInt = int64(int32(c + 4*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6715,7 +6715,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
}
// match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6729,7 +6729,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVWloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6738,7 +6738,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
}
// match: (MOVWloadidx1 [c] {sym} idx (ADDLconst [d] ptr) mem)
// cond:
- // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6752,7 +6752,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
ptr := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVWloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6761,7 +6761,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
}
// match: (MOVWloadidx1 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6775,7 +6775,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVWloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6784,7 +6784,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
}
// match: (MOVWloadidx1 [c] {sym} (ADDLconst [d] idx) ptr mem)
// cond:
- // result: (MOVWloadidx1 [c+d] {sym} ptr idx mem)
+ // result: (MOVWloadidx1 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6798,7 +6798,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
ptr := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVWloadidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6810,7 +6810,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool {
func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool {
// match: (MOVWloadidx2 [c] {sym} (ADDLconst [d] ptr) idx mem)
// cond:
- // result: (MOVWloadidx2 [c+d] {sym} ptr idx mem)
+ // result: (MOVWloadidx2 [int64(int32(c+d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6824,7 +6824,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool {
idx := v.Args[1]
mem := v.Args[2]
v.reset(Op386MOVWloadidx2)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -6833,7 +6833,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool {
}
// match: (MOVWloadidx2 [c] {sym} ptr (ADDLconst [d] idx) mem)
// cond:
- // result: (MOVWloadidx2 [c+2*d] {sym} ptr idx mem)
+ // result: (MOVWloadidx2 [int64(int32(c+2*d))] {sym} ptr idx mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -6847,7 +6847,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool {
idx := v_1.Args[0]
mem := v.Args[2]
v.reset(Op386MOVWloadidx2)
- v.AuxInt = c + 2*d
+ v.AuxInt = int64(int32(c + 2*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -7590,7 +7590,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
}
// match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -7605,7 +7605,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -7615,7 +7615,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
}
// match: (MOVWstoreidx1 [c] {sym} idx (ADDLconst [d] ptr) val mem)
// cond:
- // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -7630,7 +7630,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -7640,7 +7640,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
}
// match: (MOVWstoreidx1 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -7655,7 +7655,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -7665,7 +7665,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
}
// match: (MOVWstoreidx1 [c] {sym} (ADDLconst [d] idx) ptr val mem)
// cond:
- // result: (MOVWstoreidx1 [c+d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx1 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -7680,7 +7680,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx1)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -8118,7 +8118,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool {
_ = b
// match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem)
// cond:
- // result: (MOVWstoreidx2 [c+d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -8133,7 +8133,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx2)
- v.AuxInt = c + d
+ v.AuxInt = int64(int32(c + d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
@@ -8143,7 +8143,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool {
}
// match: (MOVWstoreidx2 [c] {sym} ptr (ADDLconst [d] idx) val mem)
// cond:
- // result: (MOVWstoreidx2 [c+2*d] {sym} ptr idx val mem)
+ // result: (MOVWstoreidx2 [int64(int32(c+2*d))] {sym} ptr idx val mem)
for {
c := v.AuxInt
sym := v.Aux
@@ -8158,7 +8158,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool {
val := v.Args[2]
mem := v.Args[3]
v.reset(Op386MOVWstoreidx2)
- v.AuxInt = c + 2*d
+ v.AuxInt = int64(int32(c + 2*d))
v.Aux = sym
v.AddArg(ptr)
v.AddArg(idx)
diff --git a/test/fixedbugs/issue21655.go b/test/fixedbugs/issue21655.go
index 4060c8ddbb..66d4e3a7f5 100644
--- a/test/fixedbugs/issue21655.go
+++ b/test/fixedbugs/issue21655.go
@@ -38,3 +38,25 @@ func f6(a []float32, i int64) float32 {
// like 0x80000000 and silently using them as
// signed 32 bit offsets.)
// f4 was ok, but testing it can't hurt.
+
+func f7(ss []*string, i int) string {
+ const offset = 3 << 29 // 3<<29 * 4 = 3<<31 = 1<<31 mod 1<<32.
+ if i > offset {
+ return *ss[i-offset]
+ }
+ return ""
+}
+func f8(ss []*string, i int) string {
+ const offset = 3<<29 + 10
+ if i > offset {
+ return *ss[i-offset]
+ }
+ return ""
+}
+func f9(ss []*string, i int) string {
+ const offset = 3<<29 - 10
+ if i > offset {
+ return *ss[i-offset]
+ }
+ return ""
+}