]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: add arg/result register load/spill code on ARM64
authorCherry Mui <cherryyz@google.com>
Tue, 25 May 2021 22:05:02 +0000 (18:05 -0400)
committerCherry Mui <cherryyz@google.com>
Thu, 27 May 2021 16:37:50 +0000 (16:37 +0000)
Add code that loads results into registers (used in defer return
code path) and spills argument registers (used for partially lived
in-register args).

Move some code from the amd64 package to a common place.

Change-Id: I8d59b68693048fdba86e10769c4ac58de5fcfb64
Reviewed-on: https://go-review.googlesource.com/c/go/+/322851
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>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/amd64/galign.go
src/cmd/compile/internal/amd64/ssa.go
src/cmd/compile/internal/arm64/galign.go
src/cmd/compile/internal/arm64/ssa.go
src/cmd/compile/internal/ssagen/arch.go
src/cmd/compile/internal/ssagen/ssa.go

index 2785aa03368b782c3d5d9b5c8f983d0dac19b1d6..3b13e123a74feade86830808e11460a1bcc91425 100644 (file)
@@ -23,6 +23,6 @@ func Init(arch *ssagen.ArchInfo) {
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
        arch.SSAGenBlock = ssaGenBlock
-       arch.LoadRegResults = loadRegResults
+       arch.LoadRegResult = loadRegResult
        arch.SpillArgReg = spillArgReg
 }
index 7e2dc41928f84df1bd0d81f7e23e7f99ddd427cf..c27a5fe5b5a26c1d6640dc26259f4d57f39ec335 100644 (file)
@@ -1354,20 +1354,15 @@ func ssaGenBlock(s *ssagen.State, b, next *ssa.Block) {
        }
 }
 
-func loadRegResults(s *ssagen.State, f *ssa.Func) {
-       for _, o := range f.OwnAux.ABIInfo().OutParams() {
-               n := o.Name.(*ir.Name)
-               rts, offs := o.RegisterTypesAndOffsets()
-               for i := range o.Registers {
-                       p := s.Prog(loadByType(rts[i]))
-                       p.From.Type = obj.TYPE_MEM
-                       p.From.Name = obj.NAME_AUTO
-                       p.From.Sym = n.Linksym()
-                       p.From.Offset = n.FrameOffset() + offs[i]
-                       p.To.Type = obj.TYPE_REG
-                       p.To.Reg = ssa.ObjRegForAbiReg(o.Registers[i], f.Config)
-               }
-       }
+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))
+       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 {
index d3db37e16f43bcbbb261d75078df6c8d126b4a72..2a61b9dd9973b5bda2ade4c9354f1920f2205884 100644 (file)
@@ -23,4 +23,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 d82788218d9aae0c6df40e3261c55c109a355afc..74308a18f60f311e999e7427388d177986801589 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"
@@ -1278,3 +1279,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))
+       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), 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
+}
index 7215f42c059a147272500b7916df51287e7bdd7b..957fb3e84a92dc7a6f52852bd3624fcefd3df145 100644 (file)
@@ -42,10 +42,10 @@ type ArchInfo struct {
        // for all values in the block before SSAGenBlock.
        SSAGenBlock func(s *State, b, next *ssa.Block)
 
-       // LoadRegResults emits instructions that loads register-assigned results
-       // into registers. They are already in memory (PPARAMOUT nodes).
-       // Used in open-coded defer return path.
-       LoadRegResults func(s *State, f *ssa.Func)
+       // LoadRegResult emits instructions that loads register-assigned result
+       // at n+off (n is PPARAMOUT) to register reg. The result is already in
+       // memory. Used in open-coded defer return path.
+       LoadRegResult func(s *State, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog
 
        // SpillArgReg emits instructions that spill reg to n+off.
        SpillArgReg func(pp *objw.Progs, p *obj.Prog, f *ssa.Func, t *types.Type, reg int16, n *ir.Name, off int64) *obj.Prog
index 91b0c79cd3e8cbe779aeed8f984f9deb5a93ee75..f59220ab8e4f07ae5a9f5529541473b008cb15c1 100644 (file)
@@ -6930,8 +6930,12 @@ func genssa(f *ssa.Func, pp *objw.Progs) {
                // recovers a panic, it will return to caller with right results.
                // The results are already in memory, because they are not SSA'd
                // when the function has defers (see canSSAName).
-               if f.OwnAux.ABIInfo().OutRegistersUsed() != 0 {
-                       Arch.LoadRegResults(&s, f)
+               for _, o := range f.OwnAux.ABIInfo().OutParams() {
+                       n := o.Name.(*ir.Name)
+                       rts, offs := o.RegisterTypesAndOffsets()
+                       for i := range o.Registers {
+                               Arch.LoadRegResult(&s, f, rts[i], ssa.ObjRegForAbiReg(o.Registers[i], f.Config), n, offs[i])
+                       }
                }
 
                pp.Prog(obj.ARET)