From d039d01fe9786a35ba4f6beea79ff2e964990c97 Mon Sep 17 00:00:00 2001 From: wei xiao Date: Mon, 28 Nov 2016 10:35:12 +0800 Subject: [PATCH] cmd/asm: fix TBZ/TBNZ instructions on arm64 Fixes #18069 Also added a test in: cmd/asm/internal/asm/testdata/arm64.s Change-Id: Iee400bda4f30503ea3c1dc5bb8301568f19c92d1 Signed-off-by: Wei Xiao Reviewed-on: https://go-review.googlesource.com/33594 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/arch/arm64.go | 2 ++ src/cmd/asm/internal/asm/asm.go | 12 ++++++++++++ src/cmd/asm/internal/asm/testdata/arm64.s | 2 ++ 3 files changed, 16 insertions(+) diff --git a/src/cmd/asm/internal/arch/arm64.go b/src/cmd/asm/internal/arch/arm64.go index ab64a05f2b3ee..dd04719451e75 100644 --- a/src/cmd/asm/internal/arch/arm64.go +++ b/src/cmd/asm/internal/arch/arm64.go @@ -43,6 +43,8 @@ var arm64Jump = map[string]bool{ "CBNZ": true, "CBNZW": true, "JMP": true, + "TBNZ": true, + "TBZ": true, } func jumpArm64(word string) bool { diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index 350314d824764..e83cd7286d216 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -390,6 +390,18 @@ func (p *Parser) asmJump(op obj.As, cond string, a []obj.Addr) { } break } + if p.arch.Family == sys.ARM64 { + // Special 3-operand jumps. + // a[0] must be immediate constant; a[1] is a register. + if a[0].Type != obj.TYPE_CONST { + p.errorf("%s: expected immediate constant; found %s", op, obj.Dconv(prog, &a[0])) + return + } + prog.From = a[0] + prog.Reg = p.getRegister(prog, op, &a[1]) + target = &a[2] + break + } fallthrough default: diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index 8d501965e928e..39859d980a14f 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -257,6 +257,8 @@ again: B foo(SB) // JMP foo(SB) BL foo(SB) // CALL foo(SB) BEQ 2(PC) + TBZ $1, R1, 2(PC) + TBNZ $2, R2, 2(PC) JMP foo(SB) CALL foo(SB)