llvm/llvm/test/MC/AArch64/arm64-branch-encoding.s

; RUN: llvm-mc -triple arm64-apple-darwin -show-encoding < %s | FileCheck %s

foo:

;-----------------------------------------------------------------------------
; Unconditional branch (register) instructions.
;-----------------------------------------------------------------------------

  ret
; CHECK: encoding: [0xc0,0x03,0x5f,0xd6]
  ret x1
; CHECK: encoding: [0x20,0x00,0x5f,0xd6]
  drps
; CHECK: encoding: [0xe0,0x03,0xbf,0xd6]
  eret
; CHECK: encoding: [0xe0,0x03,0x9f,0xd6]
  br  x5
; CHECK: encoding: [0xa0,0x00,0x1f,0xd6]
  blr x9
; CHECK: encoding: [0x20,0x01,0x3f,0xd6]
  bl  L1
; CHECK: bl L1   ; encoding: [A,A,A,0b100101AA]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_call26

;-----------------------------------------------------------------------------
; Contitional branch instructions.
;-----------------------------------------------------------------------------

  b     L1
; CHECK: b L1      ; encoding: [A,A,A,0b000101AA]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch26
  b.eq  L1
; CHECK: b.eq L1   ; encoding: [0bAAA00000,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.ne  L1
; CHECK: b.ne L1   ; encoding: [0bAAA00001,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.cs  L1
; CHECK: b.hs L1   ; encoding: [0bAAA00010,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.cc  L1
; CHECK: b.lo L1   ; encoding: [0bAAA00011,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.mi  L1
; CHECK: b.mi L1   ; encoding: [0bAAA00100,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.pl  L1
; CHECK: b.pl L1   ; encoding: [0bAAA00101,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.vs  L1
; CHECK: b.vs L1   ; encoding: [0bAAA00110,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.vc  L1
; CHECK: b.vc L1   ; encoding: [0bAAA00111,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.hi  L1
; CHECK: b.hi L1   ; encoding: [0bAAA01000,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.ls  L1
; CHECK: b.ls L1   ; encoding: [0bAAA01001,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.ge  L1
; CHECK: b.ge L1   ; encoding: [0bAAA01010,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.lt  L1
; CHECK: b.lt L1   ; encoding: [0bAAA01011,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.gt  L1
; CHECK: b.gt L1   ; encoding: [0bAAA01100,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.le  L1
; CHECK: b.le L1   ; encoding: [0bAAA01101,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
  b.al  L1
; CHECK: b.al L1      ; encoding: [0bAAA01110,A,A,0x54]
; CHECK: fixup A - offset: 0, value: L1, kind: fixup_aarch64_pcrel_branch19
L1:
  b #28
; CHECK: b #28
  b.lt #28
; CHECK: b.lt #28
  b.cc #1048572
; CHECK: b.lo	#1048572                ; encoding: [0xe3,0xff,0x7f,0x54]
  b #134217724
; CHECK: b	#134217724              ; encoding: [0xff,0xff,0xff,0x15]
  b #-134217728
; CHECK: b	#-134217728             ; encoding: [0x00,0x00,0x00,0x16]

;-----------------------------------------------------------------------------
; Compare-and-branch instructions.
;-----------------------------------------------------------------------------

  cbz w1, foo
; CHECK: encoding: [0bAAA00001,A,A,0x34]
  cbz x1, foo
; CHECK: encoding: [0bAAA00001,A,A,0xb4]
  cbnz w2, foo
; CHECK: encoding: [0bAAA00010,A,A,0x35]
  cbnz x2, foo
; CHECK: encoding: [0bAAA00010,A,A,0xb5]
  cbz w1, #28
; CHECK: cbz w1, #28
  cbz     w20, #1048572
; CHECK: cbz	w20, #1048572           ; encoding: [0xf4,0xff,0x7f,0x34]
  cbnz x2, #-1048576
; CHECK: cbnz	x2, #-1048576           ; encoding: [0x02,0x00,0x80,0xb5]


;-----------------------------------------------------------------------------
; Bit-test-and-branch instructions.
;-----------------------------------------------------------------------------

  tbz x1, #3, foo
; CHECK: encoding: [0bAAA00001,A,0b00011AAA,0x36]
  tbnz x1, #63, foo
; CHECK: encoding: [0bAAA00001,A,0b11111AAA,0xb7]

  tbz w1, #3, foo
; CHECK: encoding: [0bAAA00001,A,0b00011AAA,0x36]
  tbnz w1, #31, foo
; CHECK: encoding: [0bAAA00001,A,0b11111AAA,0x37]

  tbz w1, #3, #28
; CHECK: tbz w1, #3, #28
  tbz w3, #5, #32764
; CHECK: tbz	w3, #5, #32764          ; encoding: [0xe3,0xff,0x2b,0x36]
  tbnz x3, #8, #-32768
; CHECK: tbnz	w3, #8, #-32768         ; encoding: [0x03,0x00,0x44,0x37]

;-----------------------------------------------------------------------------
; Exception generation instructions.
;-----------------------------------------------------------------------------

  brk   #1
; CHECK: encoding: [0x20,0x00,0x20,0xd4]
  dcps1 #2
; CHECK: encoding: [0x41,0x00,0xa0,0xd4]
  dcps2 #3
; CHECK: encoding: [0x62,0x00,0xa0,0xd4]
  dcps3 #4
; CHECK: encoding: [0x83,0x00,0xa0,0xd4]
  hlt   #5
; CHECK: encoding: [0xa0,0x00,0x40,0xd4]
  hvc   #6
; CHECK: encoding: [0xc2,0x00,0x00,0xd4]
  smc   #7
; CHECK: encoding: [0xe3,0x00,0x00,0xd4]
  svc   #8
; CHECK: encoding: [0x01,0x01,0x00,0xd4]

; The immediate defaults to zero for DCPSn
  dcps1
  dcps2
  dcps3

; CHECK: dcps1                     ; encoding: [0x01,0x00,0xa0,0xd4]
; CHECK: dcps2                     ; encoding: [0x02,0x00,0xa0,0xd4]
; CHECK: dcps3                     ; encoding: [0x03,0x00,0xa0,0xd4]

;; Test "bad" names
  bl lsl
  b.eq lsr
  b.ne uxth
; CHECK:      bl lsl     ; encoding: [A,A,A,0b100101AA]
; CHECK-NEXT:   fixup A - offset: 0, value: lsl, kind: fixup_aarch64_pcrel_call26
; CHECK-NEXT: b.eq lsr   ; encoding: [0bAAA00000,A,A,0x54]
; CHECK-NEXT:   fixup A - offset: 0, value: lsr, kind: fixup_aarch64_pcrel_branch19
; CHECK-NEXT: b.ne uxth  ; encoding: [0bAAA00001,A,A,0x54]
; CHECK-NEXT:   fixup A - offset: 0, value: uxth, kind: fixup_aarch64_pcrel_branch19