Do-not-use-SP-as-index-reg
authorGo Compiler Team <pkg-golang-devel@lists.alioth.debian.org>
Mon, 30 Oct 2017 23:16:17 +0000 (23:16 +0000)
committerMichael Hudson-Doyle <mwhudson@debian.org>
Mon, 30 Oct 2017 23:16:17 +0000 (23:16 +0000)
Gbp-Pq: Name 0003-Do-not-use-SP-as-index-reg.patch

src/cmd/compile/internal/x86/387.go
test/fixedbugs/issue22429.go [new file with mode: 0644]

index cdac000648dcec3df77bd9e8e94f0dd937d4e925..7a3622405ce8dcd7ea223728f83c26f315a91441 100644 (file)
@@ -46,6 +46,9 @@ func ssaGenValue387(s *gc.SSAGenState, v *ssa.Value) {
                case ssa.Op386MOVSSloadidx1, ssa.Op386MOVSDloadidx1:
                        p.From.Scale = 1
                        p.From.Index = v.Args[1].Reg()
+                       if p.From.Index == x86.REG_SP {
+                               p.From.Reg, p.From.Index = p.From.Index, p.From.Reg
+                       }
                case ssa.Op386MOVSSloadidx4:
                        p.From.Scale = 4
                        p.From.Index = v.Args[1].Reg()
@@ -95,6 +98,9 @@ func ssaGenValue387(s *gc.SSAGenState, v *ssa.Value) {
                case ssa.Op386MOVSSstoreidx1, ssa.Op386MOVSDstoreidx1:
                        p.To.Scale = 1
                        p.To.Index = v.Args[1].Reg()
+                       if p.To.Index == x86.REG_SP {
+                               p.To.Reg, p.To.Index = p.To.Index, p.To.Reg
+                       }
                case ssa.Op386MOVSSstoreidx4:
                        p.To.Scale = 4
                        p.To.Index = v.Args[1].Reg()
diff --git a/test/fixedbugs/issue22429.go b/test/fixedbugs/issue22429.go
new file mode 100644 (file)
index 0000000..289b434
--- /dev/null
@@ -0,0 +1,18 @@
+// compile
+
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Make sure SSA->assembly pass can handle SP as an index register.
+
+package p
+
+type T struct {
+       a,b,c,d float32
+}
+
+func f(a *[8]T, i,j,k int) float32 {
+       b := *a
+       return b[i].a + b[j].b + b[k].c
+}