mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.ssa] cmd/compile: fix phi floats
The code previously always used AX causing errors. For now, just switch off the type in order to at least generate valid code. Change-Id: Iaf13120a24b62456b9b33c04ab31f2d5104b381b Reviewed-on: https://go-review.googlesource.com/13943 Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
752fe4dcb5
commit
7cadf23afb
2 changed files with 62 additions and 4 deletions
|
|
@ -550,6 +550,16 @@ func (s *regAllocState) setState(state []regState) {
|
|||
}
|
||||
}
|
||||
|
||||
// compatReg returns a register compatible with the a value and is used when
|
||||
// spilling/loading.
|
||||
// TODO: choose a better default register (set of reg by type?).
|
||||
func compatReg(v *Value) regMask {
|
||||
if v.Type.IsFloat() {
|
||||
return 1 << 16 // X0
|
||||
}
|
||||
return 1 << 0 // AX
|
||||
}
|
||||
|
||||
func (s *regAllocState) regalloc(f *Func) {
|
||||
liveset := newSparseSet(f.NumValues())
|
||||
argset := newSparseSet(f.NumValues())
|
||||
|
|
@ -836,10 +846,11 @@ func (s *regAllocState) regalloc(f *Func) {
|
|||
if !argset.contains(v.ID) {
|
||||
continue
|
||||
}
|
||||
|
||||
// This stack-based phi is the argument of some other
|
||||
// phi in this block. We must make a copy of its
|
||||
// value so that we don't clobber it prematurely.
|
||||
c := s.allocValToReg(v, s.values[v.ID].regs|1<<0, false)
|
||||
c := s.allocValToReg(v, s.values[v.ID].regs|compatReg(v), false)
|
||||
d := p.NewValue1(v.Line, OpStoreReg, v.Type, c)
|
||||
s.values[v.ID].spill2 = d
|
||||
}
|
||||
|
|
@ -848,9 +859,10 @@ func (s *regAllocState) regalloc(f *Func) {
|
|||
// we might need a register to do the assignment.
|
||||
for _, v := range stackPhis {
|
||||
// Load phi arg into a register, then store it with a StoreReg.
|
||||
// If already in a register, use that. If not, use register 0.
|
||||
// TODO: choose a better default register (set of reg by type?).
|
||||
c := s.allocValToReg(v.Args[i], s.values[v.Args[i].ID].regs|1<<0, false)
|
||||
// If already in a register, use that. If not, pick a compatible
|
||||
// register.
|
||||
w := v.Args[i]
|
||||
c := s.allocValToReg(w, s.values[w.ID].regs|compatReg(w), false)
|
||||
v.Args[i] = p.NewValue1(v.Line, OpStoreReg, v.Type, c)
|
||||
}
|
||||
// Figure out what value goes in each register.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue