Package: golang-1.9 / 1.9.2-4

0003-Do-not-use-SP-as-index-reg.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Author: Keith Randall <khr@golang.org>
Date: Wed Oct 25 13:46:38 2017 -0700
Description: cmd/compile: make sure not to use SP as an index register
 ...because that's an illegal addressing mode.
Reviewed-on: https://go-review.googlesource.com/73551
Bug-Upstream: https://github.com/golang/go/issues/22429

diff --git a/src/cmd/compile/internal/x86/387.go b/src/cmd/compile/internal/x86/387.go
index cdac000..7a36224 100644
--- a/src/cmd/compile/internal/x86/387.go
+++ b/src/cmd/compile/internal/x86/387.go
@@ -46,6 +46,9 @@
 		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 @@
 		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
index 0000000..289b434
--- /dev/null
+++ b/test/fixedbugs/issue22429.go
@@ -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
+}