From: Cherry Zhang Date: Mon, 4 Nov 2019 23:11:57 +0000 (-0500) Subject: cmd/internal/obj/ppc64: handle MOVDU for SP delta X-Git-Tag: go1.14beta1~340 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3c47eada3f628cbd8a0f47563e6c9287d91d4765;p=gostls13.git cmd/internal/obj/ppc64: handle MOVDU for SP delta 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 TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 266c982549..4b6910d5ca 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -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 */