aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2024-10-21 15:36:38 -0700
committerKeith Randall <khr@google.com>2024-10-22 16:23:12 +0000
commit74163c895a7c5d7ebafeaed1f4a0891d218e2704 (patch)
treee795bf155e9ce0aee3987f79f98743e56614318b /src/cmd/internal/obj
parent4e7025860129b33f704634583d20539af19c344b (diff)
downloadgo-74163c895a7c5d7ebafeaed1f4a0891d218e2704.tar.xz
cmd/compile: use STP/LDP around morestack on arm64
The spill/restore code around morestack is almost never exectued, so we should make it as small as possible. Using 2-register loads/stores makes sense here. Also, the offsets from SP are pretty small so the offset almost always fits in the (smaller than a normal load/store) offset field of the instruction. Makes cmd/go 0.6% smaller. Change-Id: I8845283c1b269a259498153924428f6173bda293 Reviewed-on: https://go-review.googlesource.com/c/go/+/621556 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r--src/cmd/internal/obj/link.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index a3e4a0d309..462b9b2bd2 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -1100,6 +1100,7 @@ type Auto struct {
type RegSpill struct {
Addr Addr
Reg int16
+ Reg2 int16 // If not 0, a second register to spill at Addr+regSize. Only for some archs.
Spill, Unspill As
}
@@ -1192,6 +1193,10 @@ func (fi *FuncInfo) SpillRegisterArgs(last *Prog, pa ProgAlloc) *Prog {
spill.As = ra.Spill
spill.From.Type = TYPE_REG
spill.From.Reg = ra.Reg
+ if ra.Reg2 != 0 {
+ spill.From.Type = TYPE_REGREG
+ spill.From.Offset = int64(ra.Reg2)
+ }
spill.To = ra.Addr
last = spill
}
@@ -1208,6 +1213,10 @@ func (fi *FuncInfo) UnspillRegisterArgs(last *Prog, pa ProgAlloc) *Prog {
unspill.From = ra.Addr
unspill.To.Type = TYPE_REG
unspill.To.Reg = ra.Reg
+ if ra.Reg2 != 0 {
+ unspill.To.Type = TYPE_REGREG
+ unspill.To.Offset = int64(ra.Reg2)
+ }
last = unspill
}
return last