Skip to content

Commit bd224fa

Browse files
abner-chencsophie-zhao
authored andcommitted
cmd/compile/internal: add spill support for loong64 regABI
Update #40724 Co-authored-by: Xiaolin Zhao <zhaoxiaolin@loongson.cn> Change-Id: Ic01d59bd81420b89c6d4b90c5975bf069d08e7cc Reviewed-on: https://go-review.googlesource.com/c/go/+/521780 Reviewed-by: David Chase <drchase@google.com> Auto-Submit: David Chase <drchase@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: David Chase <drchase@google.com>
1 parent ebca52e commit bd224fa

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/cmd/compile/internal/loong64/galign.go

+2
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ func Init(arch *ssagen.ArchInfo) {
2020
arch.SSAMarkMoves = func(s *ssagen.State, b *ssa.Block) {}
2121
arch.SSAGenValue = ssaGenValue
2222
arch.SSAGenBlock = ssaGenBlock
23+
arch.LoadRegResult = loadRegResult
24+
arch.SpillArgReg = spillArgReg
2325
}

src/cmd/compile/internal/loong64/ssa.go

+30-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"cmd/compile/internal/base"
1111
"cmd/compile/internal/ir"
1212
"cmd/compile/internal/logopt"
13+
"cmd/compile/internal/objw"
1314
"cmd/compile/internal/ssa"
1415
"cmd/compile/internal/ssagen"
1516
"cmd/compile/internal/types"
@@ -145,6 +146,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
145146
p.From.Reg = r
146147
ssagen.AddrAuto(&p.To, v)
147148
case ssa.OpArgIntReg, ssa.OpArgFloatReg:
149+
// The assembler needs to wrap the entry safepoint/stack growth code with spill/unspill
150+
// The loop only runs once.
151+
for _, a := range v.Block.Func.RegArgs {
152+
// Pass the spill/unspill information along to the assembler, offset by size of
153+
// the saved LR slot.
154+
addr := ssagen.SpillSlotAddr(a, loong64.REGSP, base.Ctxt.Arch.FixedFrameSize)
155+
s.FuncInfo().AddSpill(
156+
obj.RegSpill{Reg: a.Reg, Addr: addr, Unspill: loadByType(a.Type, a.Reg), Spill: storeByType(a.Type, a.Reg)})
157+
}
158+
v.Block.Func.RegArgs = nil
148159
ssagen.CheckArgReg(v)
149160
case ssa.OpLOONG64ADDV,
150161
ssa.OpLOONG64SUBV,
@@ -370,7 +381,6 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
370381
p.To.Name = obj.NAME_EXTERN
371382
p.To.Sym = ir.Syms.Duffzero
372383
p.To.Offset = v.AuxInt
373-
374384
case ssa.OpLOONG64LoweredZero:
375385
// MOVx R0, (Rarg0)
376386
// ADDV $sz, Rarg0
@@ -799,3 +809,22 @@ func ssaGenBlock(s *ssagen.State, b, next *ssa.Block) {
799809
b.Fatalf("branch not implemented: %s", b.LongString())
800810
}
801811
}
812+
813+
func loadRegResult(s *ssagen.State, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog {
814+
p := s.Prog(loadByType(t, reg))
815+
p.From.Type = obj.TYPE_MEM
816+
p.From.Name = obj.NAME_AUTO
817+
p.From.Sym = n.Linksym()
818+
p.From.Offset = n.FrameOffset() + off
819+
p.To.Type = obj.TYPE_REG
820+
p.To.Reg = reg
821+
return p
822+
}
823+
824+
func spillArgReg(pp *objw.Progs, p *obj.Prog, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog {
825+
p = pp.Append(p, storeByType(t, reg), obj.TYPE_REG, reg, 0, obj.TYPE_MEM, 0, n.FrameOffset()+off)
826+
p.To.Name = obj.NAME_PARAM
827+
p.To.Sym = n.Linksym()
828+
p.Pos = p.Pos.WithNotStmt()
829+
return p
830+
}

0 commit comments

Comments
 (0)