]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] cmd/internal/obj/arm64: fix branch-too-far with TBZ like...
authorCherry Zhang <cherryyz@google.com>
Sat, 17 Feb 2018 15:31:39 +0000 (10:31 -0500)
committerDmitri Shuralyov <dmitshur@golang.org>
Fri, 2 Nov 2018 17:45:38 +0000 (17:45 +0000)
The compiler now emits TBZ like instructions, but the assembler's
too-far-branch patch code didn't include that case. Add it.

Updates #23889
Fixes #25794

Change-Id: Ib75f9250c660b9fb652835fbc83263a5d5073dc5
Reviewed-on: https://go-review.googlesource.com/94902
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
(cherry picked from commit 911839c1f462260db0f001f8e017f10f688d2270)
Reviewed-on: https://go-review.googlesource.com/c/147057
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Dmitri Shuralyov <dmitshur@golang.org>

src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/arm64/asm_test.go

index ca81238c93e93fe81f154bfb1011253a5184d771..b1ee5524897550bcc76a2408d0efc735b58fd24b 100644 (file)
@@ -696,9 +696,16 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        o = c.oplook(p)
 
                        /* very large branches */
-                       if (o.type_ == 7 || o.type_ == 39) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like
+                       if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like
                                otxt := p.Pcond.Pc - pc
-                               if otxt <= -(1<<18)+10 || otxt >= (1<<18)-10 {
+                               var toofar bool
+                               switch o.type_ {
+                               case 7, 39: // branch instruction encodes 19 bits
+                                       toofar = otxt <= -(1<<20)+10 || otxt >= (1<<20)-10
+                               case 40: // branch instruction encodes 14 bits
+                                       toofar = otxt <= -(1<<15)+10 || otxt >= (1<<15)-10
+                               }
+                               if toofar {
                                        q := c.newprog()
                                        q.Link = p.Link
                                        p.Link = q
index 369c48f510b42912f538a1e8e7e2233f4331cd3c..3e0c9c13a6957e73f7e9b64af9bbb7abd47468a4 100644 (file)
@@ -52,6 +52,7 @@ func TestLarge(t *testing.T) {
 // gen generates a very large program, with a very far conditional branch.
 func gen(buf *bytes.Buffer) {
        fmt.Fprintln(buf, "TEXT f(SB),0,$0-0")
+       fmt.Fprintln(buf, "TBZ $5, R0, label")
        fmt.Fprintln(buf, "CBZ R0, label")
        fmt.Fprintln(buf, "BEQ label")
        for i := 0; i < 1<<19; i++ {