src/cmd/internal/obj/arm64/obj7.go | 19 +++++++++++-------- diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index f963f62dcd1d2406755179ddc7b1dddeb5374d9c..f7cca307173dba020eaed899d4787d65b7b1151e 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -826,21 +826,24 @@ retjmp = p.To.Sym 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