mirror of
https://github.com/golang/go
synced 2025-05-30 15:30:51 +00:00
cmd/compile: make sure not to use SP as an index register
...because that's an illegal addressing mode. I double-checked handling of this code, and 387 is the only place where this check is missing. Fixes #22429 Change-Id: I2284fe729ea86251c6af2f04076ddf7a5e66367c Reviewed-on: https://go-review.googlesource.com/73551 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
@ -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()
|
||||
|
18
test/fixedbugs/issue22429.go
Normal file
18
test/fixedbugs/issue22429.go
Normal file
@ -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
|
||||
}
|
Reference in New Issue
Block a user