]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal: add spill support for loong64 regABI
authorGuoqi Chen <chenguoqi@loongson.cn>
Tue, 15 Aug 2023 12:10:33 +0000 (20:10 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 21 Nov 2023 19:04:16 +0000 (19:04 +0000)
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>

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

index 99ab7bdfb5f346d11deb8d283b2948f9005bf7d3..a613165054429f995b569f049880fd5618611a09 100644 (file)
@@ -20,4 +20,6 @@ func Init(arch *ssagen.ArchInfo) {
        arch.SSAMarkMoves = func(s *ssagen.State, b *ssa.Block) {}
        arch.SSAGenValue = ssaGenValue
        arch.SSAGenBlock = ssaGenBlock
+       arch.LoadRegResult = loadRegResult
+       arch.SpillArgReg = spillArgReg
 }
index 06490a7ba5c408ab52d58109736cebebc04110af..e7298bdb9fa57011a837b3bbf4e815c184563e6b 100644 (file)
@@ -10,6 +10,7 @@ import (
        "cmd/compile/internal/base"
        "cmd/compile/internal/ir"
        "cmd/compile/internal/logopt"
+       "cmd/compile/internal/objw"
        "cmd/compile/internal/ssa"
        "cmd/compile/internal/ssagen"
        "cmd/compile/internal/types"
@@ -145,6 +146,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
                p.From.Reg = r
                ssagen.AddrAuto(&p.To, v)
        case ssa.OpArgIntReg, ssa.OpArgFloatReg:
+               // 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, loong64.REGSP, base.Ctxt.Arch.FixedFrameSize)
+                       s.FuncInfo().AddSpill(
+                               obj.RegSpill{Reg: a.Reg, Addr: addr, Unspill: loadByType(a.Type, a.Reg), Spill: storeByType(a.Type, a.Reg)})
+               }
+               v.Block.Func.RegArgs = nil
                ssagen.CheckArgReg(v)
        case ssa.OpLOONG64ADDV,
                ssa.OpLOONG64SUBV,
@@ -370,7 +381,6 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
                p.To.Name = obj.NAME_EXTERN
                p.To.Sym = ir.Syms.Duffzero
                p.To.Offset = v.AuxInt
-
        case ssa.OpLOONG64LoweredZero:
                // MOVx R0, (Rarg0)
                // ADDV $sz, Rarg0
@@ -799,3 +809,22 @@ func ssaGenBlock(s *ssagen.State, b, next *ssa.Block) {
                b.Fatalf("branch not implemented: %s", b.LongString())
        }
 }
+
+func loadRegResult(s *ssagen.State, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog {
+       p := s.Prog(loadByType(t, reg))
+       p.From.Type = obj.TYPE_MEM
+       p.From.Name = obj.NAME_AUTO
+       p.From.Sym = n.Linksym()
+       p.From.Offset = n.FrameOffset() + off
+       p.To.Type = obj.TYPE_REG
+       p.To.Reg = reg
+       return p
+}
+
+func spillArgReg(pp *objw.Progs, p *obj.Prog, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog {
+       p = pp.Append(p, storeByType(t, reg), obj.TYPE_REG, reg, 0, obj.TYPE_MEM, 0, n.FrameOffset()+off)
+       p.To.Name = obj.NAME_PARAM
+       p.To.Sym = n.Linksym()
+       p.Pos = p.Pos.WithNotStmt()
+       return p
+}