mirror of
https://github.com/golang/go
synced 2024-11-22 16:44:54 -07:00
[dev.typeparams] cmd/compile: add morestack arg spilling code on ARM64
Spill arg registers before calling morestack, and reload after. Change-Id: I09404def321b8f935d5e8836a46ccae8256d0d55 Reviewed-on: https://go-review.googlesource.com/c/go/+/322853 Trust: Cherry Mui <cherryyz@google.com> Run-TryBot: Cherry Mui <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
a4b2a04bc5
commit
4c68edd1fe
@ -162,7 +162,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
|
||||
p.From.Reg = v.Args[0].Reg()
|
||||
ssagen.AddrAuto(&p.To, v)
|
||||
case ssa.OpArgIntReg, ssa.OpArgFloatReg:
|
||||
// TODO: generate morestack spill code
|
||||
// The assembler needs to wrap the entry safepoint/stack growth code with spill/unspill
|
||||
// The loop only runs once.
|
||||
for _, a := range v.Block.Func.RegArgs {
|
||||
// Pass the spill/unspill information along to the assembler, offset by size of
|
||||
// the saved LR slot.
|
||||
addr := ssagen.SpillSlotAddr(a, arm64.REGSP, base.Ctxt.FixedFrameSize())
|
||||
s.FuncInfo().AddSpill(
|
||||
obj.RegSpill{Reg: a.Reg, Addr: addr, Unspill: loadByType(a.Type), Spill: storeByType(a.Type)})
|
||||
}
|
||||
v.Block.Func.RegArgs = nil
|
||||
ssagen.CheckArgReg(v)
|
||||
case ssa.OpARM64ADD,
|
||||
ssa.OpARM64SUB,
|
||||
|
@ -650,7 +650,6 @@ func buildssa(fn *ir.Func, worker int) *ssa.Func {
|
||||
// it mimics the behavior of the former ABI (everything stored) and because it's not 100%
|
||||
// clear if naming conventions are respected in autogenerated code.
|
||||
// TODO figure out exactly what's unused, don't spill it. Make liveness fine-grained, also.
|
||||
// TODO non-amd64 architectures have link registers etc that may require adjustment here.
|
||||
for _, p := range params.InParams() {
|
||||
typs, offs := p.RegisterTypesAndOffsets()
|
||||
for i, t := range typs {
|
||||
|
@ -161,17 +161,20 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
|
||||
pcdata := c.ctxt.EmitEntryStackMap(c.cursym, spfix, c.newprog)
|
||||
pcdata = c.ctxt.StartUnsafePoint(pcdata, c.newprog)
|
||||
|
||||
if q != nil {
|
||||
q.To.SetTarget(pcdata)
|
||||
}
|
||||
bls.To.SetTarget(pcdata)
|
||||
|
||||
spill := c.cursym.Func().SpillRegisterArgs(pcdata, c.newprog)
|
||||
|
||||
// MOV LR, R3
|
||||
movlr := obj.Appendp(pcdata, c.newprog)
|
||||
movlr := obj.Appendp(spill, c.newprog)
|
||||
movlr.As = AMOVD
|
||||
movlr.From.Type = obj.TYPE_REG
|
||||
movlr.From.Reg = REGLINK
|
||||
movlr.To.Type = obj.TYPE_REG
|
||||
movlr.To.Reg = REG_R3
|
||||
if q != nil {
|
||||
q.To.SetTarget(movlr)
|
||||
}
|
||||
bls.To.SetTarget(movlr)
|
||||
|
||||
debug := movlr
|
||||
if false {
|
||||
@ -196,7 +199,8 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog {
|
||||
}
|
||||
call.To.Sym = c.ctxt.Lookup(morestack)
|
||||
|
||||
pcdata = c.ctxt.EndUnsafePoint(call, c.newprog, -1)
|
||||
unspill := c.cursym.Func().UnspillRegisterArgs(call, c.newprog)
|
||||
pcdata = c.ctxt.EndUnsafePoint(unspill, c.newprog, -1)
|
||||
|
||||
// B start
|
||||
jmp := obj.Appendp(pcdata, c.newprog)
|
||||
|
Loading…
Reference in New Issue
Block a user