]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/ppc64: handle MOVDU for SP delta
authorCherry Zhang <cherryyz@google.com>
Mon, 4 Nov 2019 23:11:57 +0000 (18:11 -0500)
committerCherry Zhang <cherryyz@google.com>
Thu, 7 Nov 2019 19:20:57 +0000 (19:20 +0000)
If a MOVDU instruction is used with an offset of SP, the
instruction changes SP therefore needs an SP delta, which is used
for generating the PC-SP table for stack unwinding. MOVDU is
frequently used for allocating the frame and saving the LR in the
same instruction, so this is particularly useful.

Change-Id: Icb63eb55aa01c3dc350ac4e4cff6371f4c3c5867
Reviewed-on: https://go-review.googlesource.com/c/go/+/205279
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/internal/obj/ppc64/obj9.go

index 266c982549d0cddca2386b709ea97a10df6db8a1..4b6910d5ca3aea79dfc3871cdc831fa88292aaf3 100644 (file)
@@ -961,6 +961,13 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.From.Type == obj.TYPE_CONST {
                                p.Spadj = int32(-p.From.Offset)
                        }
+               case AMOVDU:
+                       if p.To.Type == obj.TYPE_MEM && p.To.Reg == REGSP {
+                               p.Spadj = int32(-p.To.Offset)
+                       }
+                       if p.From.Type == obj.TYPE_MEM && p.From.Reg == REGSP {
+                               p.Spadj = int32(-p.From.Offset)
+                       }
                case obj.AGETCALLERPC:
                        if cursym.Leaf() {
                                /* MOVD LR, Rd */