Skip to content

Commit 911839c

Browse files
committed
cmd/internal/obj/arm64: fix branch-too-far with TBZ like instructions
The compiler now emits TBZ like instructions, but the assembler's too-far-branch patch code didn't include that case. Add it. Fixes #23889. Change-Id: Ib75f9250c660b9fb652835fbc83263a5d5073dc5 Reviewed-on: https://go-review.googlesource.com/94902 Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: David Chase <[email protected]>
1 parent 3c16934 commit 911839c

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,9 +728,16 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
728728
o = c.oplook(p)
729729

730730
/* very large branches */
731-
if (o.type_ == 7 || o.type_ == 39) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like
731+
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
732732
otxt := p.Pcond.Pc - pc
733-
if otxt <= -(1<<18)+10 || otxt >= (1<<18)-10 {
733+
var toofar bool
734+
switch o.type_ {
735+
case 7, 39: // branch instruction encodes 19 bits
736+
toofar = otxt <= -(1<<20)+10 || otxt >= (1<<20)-10
737+
case 40: // branch instruction encodes 14 bits
738+
toofar = otxt <= -(1<<15)+10 || otxt >= (1<<15)-10
739+
}
740+
if toofar {
734741
q := c.newprog()
735742
q.Link = p.Link
736743
p.Link = q

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func TestLarge(t *testing.T) {
5252
// gen generates a very large program, with a very far conditional branch.
5353
func gen(buf *bytes.Buffer) {
5454
fmt.Fprintln(buf, "TEXT f(SB),0,$0-0")
55+
fmt.Fprintln(buf, "TBZ $5, R0, label")
5556
fmt.Fprintln(buf, "CBZ R0, label")
5657
fmt.Fprintln(buf, "BEQ label")
5758
for i := 0; i < 1<<19; i++ {

0 commit comments

Comments
 (0)