]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.9] cmd/compile: fix large load/store offsets on 386
authorKeith Randall <khr@google.com>
Thu, 7 Dec 2017 22:11:19 +0000 (14:11 -0800)
committerAndrew Bonventre <andybons@golang.org>
Mon, 22 Jan 2018 20:25:06 +0000 (20:25 +0000)
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>
src/cmd/compile/internal/ssa/gen/386.rules
src/cmd/compile/internal/ssa/rewrite386.go
test/fixedbugs/issue21655.go

index 49fcd365302354f2966ef6d620796179b1c1f3ff..047052d21fef9bbcb4d6ab305c7da3cdd4189e81 100644 (file)
 (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)
index f9cddd0f708a8a0cbcad9cf66a65f40e3552866f..468be07d3e66a2e6575722a910f45175414561cb 100644 (file)
@@ -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)
index 4060c8ddbb3c47c8a31385f2d04da13916efdf7c..66d4e3a7f5ab51357f44452c56880c1ebde8d02d 100644 (file)
@@ -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 ""
+}