mirror of
https://github.com/golang/go
synced 2024-11-18 06:34:53 -07:00
cmd/compile: make LR allocatable in non-leaf functions on ARM
The mechanism is initially introduced (and reviewed) in CL 30597 on S390X. Reduce number of "spilled value remains" by 0.4% in cmd/go. Disabled on ARMv5 because LR is clobbered almost everywhere with inserted softfloat calls. Change-Id: I2934737ce2455909647ed2118fe2bd6f0aa5ac52 Reviewed-on: https://go-review.googlesource.com/32178 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
4f1ca8b6f9
commit
f9238a76ff
@ -87,7 +87,7 @@ func init() {
|
|||||||
|
|
||||||
// Common individual register masks
|
// Common individual register masks
|
||||||
var (
|
var (
|
||||||
gp = buildReg("R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12")
|
gp = buildReg("R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14")
|
||||||
gpg = gp | buildReg("g")
|
gpg = gp | buildReg("g")
|
||||||
gpsp = gp | buildReg("SP")
|
gpsp = gp | buildReg("SP")
|
||||||
gpspg = gpg | buildReg("SP")
|
gpspg = gpg | buildReg("SP")
|
||||||
@ -148,7 +148,7 @@ func init() {
|
|||||||
reg: regInfo{
|
reg: regInfo{
|
||||||
inputs: []regMask{buildReg("R1"), buildReg("R0")},
|
inputs: []regMask{buildReg("R1"), buildReg("R0")},
|
||||||
outputs: []regMask{buildReg("R0"), buildReg("R1")},
|
outputs: []regMask{buildReg("R0"), buildReg("R1")},
|
||||||
clobbers: buildReg("R2 R3"), // also clobbers R12 on NaCl (modified in ../config.go)
|
clobbers: buildReg("R2 R3 R14"), // also clobbers R12 on NaCl (modified in ../config.go)
|
||||||
},
|
},
|
||||||
clobberFlags: true,
|
clobberFlags: true,
|
||||||
typ: "(UInt32,UInt32)",
|
typ: "(UInt32,UInt32)",
|
||||||
@ -406,7 +406,7 @@ func init() {
|
|||||||
argLength: 3,
|
argLength: 3,
|
||||||
reg: regInfo{
|
reg: regInfo{
|
||||||
inputs: []regMask{buildReg("R1"), buildReg("R0")},
|
inputs: []regMask{buildReg("R1"), buildReg("R0")},
|
||||||
clobbers: buildReg("R1"),
|
clobbers: buildReg("R1 R14"),
|
||||||
},
|
},
|
||||||
faultOnNilArg0: true,
|
faultOnNilArg0: true,
|
||||||
},
|
},
|
||||||
@ -423,7 +423,7 @@ func init() {
|
|||||||
argLength: 3,
|
argLength: 3,
|
||||||
reg: regInfo{
|
reg: regInfo{
|
||||||
inputs: []regMask{buildReg("R2"), buildReg("R1")},
|
inputs: []regMask{buildReg("R2"), buildReg("R1")},
|
||||||
clobbers: buildReg("R0 R1 R2"),
|
clobbers: buildReg("R0 R1 R2 R14"),
|
||||||
},
|
},
|
||||||
faultOnNilArg0: true,
|
faultOnNilArg0: true,
|
||||||
faultOnNilArg1: true,
|
faultOnNilArg1: true,
|
||||||
@ -526,6 +526,6 @@ func init() {
|
|||||||
gpregmask: gp,
|
gpregmask: gp,
|
||||||
fpregmask: fp,
|
fpregmask: fp,
|
||||||
framepointerreg: -1, // not used
|
framepointerreg: -1, // not used
|
||||||
linkreg: -1, // not used
|
linkreg: int8(num["R14"]),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -106,6 +106,7 @@
|
|||||||
package ssa
|
package ssa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmd/internal/obj"
|
||||||
"fmt"
|
"fmt"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
@ -527,6 +528,12 @@ func (s *regAllocState) init(f *Func) {
|
|||||||
// Leaf functions don't save/restore the link register.
|
// Leaf functions don't save/restore the link register.
|
||||||
s.allocatable &^= 1 << uint(s.f.Config.LinkReg)
|
s.allocatable &^= 1 << uint(s.f.Config.LinkReg)
|
||||||
}
|
}
|
||||||
|
if s.f.Config.arch == "arm" && obj.GOARM == 5 {
|
||||||
|
// On ARMv5 we insert softfloat calls at each FP instruction.
|
||||||
|
// This clobbers LR almost everywhere. Disable allocating LR
|
||||||
|
// on ARMv5.
|
||||||
|
s.allocatable &^= 1 << uint(s.f.Config.LinkReg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if s.f.Config.ctxt.Flag_dynlink {
|
if s.f.Config.ctxt.Flag_dynlink {
|
||||||
switch s.f.Config.arch {
|
switch s.f.Config.arch {
|
||||||
|
Loading…
Reference in New Issue
Block a user