aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/arm64/obj7.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/obj/arm64/obj7.go')
-rw-r--r--src/cmd/internal/obj/arm64/obj7.go19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go
index f963f62dcd..f7cca30717 100644
--- a/src/cmd/internal/obj/arm64/obj7.go
+++ b/src/cmd/internal/obj/arm64/obj7.go
@@ -826,21 +826,24 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
p.To = obj.Addr{}
if c.cursym.Func().Text.Mark&LEAF != 0 {
if c.autosize != 0 {
+ // Restore frame pointer.
+ // ADD $framesize-8, RSP, R29
p.As = AADD
p.From.Type = obj.TYPE_CONST
- p.From.Offset = int64(c.autosize)
+ p.From.Offset = int64(c.autosize) - 8
+ p.Reg = REGSP
p.To.Type = obj.TYPE_REG
- p.To.Reg = REGSP
- p.Spadj = -c.autosize
+ p.To.Reg = REGFP
- // Frame pointer.
+ // Pop stack frame.
+ // ADD $framesize, RSP, RSP
p = obj.Appendp(p, c.newprog)
- p.As = ASUB
+ p.As = AADD
p.From.Type = obj.TYPE_CONST
- p.From.Offset = 8
- p.Reg = REGSP
+ p.From.Offset = int64(c.autosize)
p.To.Type = obj.TYPE_REG
- p.To.Reg = REGFP
+ p.To.Reg = REGSP
+ p.Spadj = -c.autosize
}
} else {
aoffset := c.autosize