@@ -10,6 +10,7 @@ import (
10
10
"cmd/compile/internal/base"
11
11
"cmd/compile/internal/ir"
12
12
"cmd/compile/internal/logopt"
13
+ "cmd/compile/internal/objw"
13
14
"cmd/compile/internal/ssa"
14
15
"cmd/compile/internal/ssagen"
15
16
"cmd/compile/internal/types"
@@ -145,6 +146,16 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
145
146
p .From .Reg = r
146
147
ssagen .AddrAuto (& p .To , v )
147
148
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
148
159
ssagen .CheckArgReg (v )
149
160
case ssa .OpLOONG64ADDV ,
150
161
ssa .OpLOONG64SUBV ,
@@ -370,7 +381,6 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
370
381
p .To .Name = obj .NAME_EXTERN
371
382
p .To .Sym = ir .Syms .Duffzero
372
383
p .To .Offset = v .AuxInt
373
-
374
384
case ssa .OpLOONG64LoweredZero :
375
385
// MOVx R0, (Rarg0)
376
386
// ADDV $sz, Rarg0
@@ -799,3 +809,22 @@ func ssaGenBlock(s *ssagen.State, b, next *ssa.Block) {
799
809
b .Fatalf ("branch not implemented: %s" , b .LongString ())
800
810
}
801
811
}
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