llvm/llvm/test/MC/ARM/thumb2-branches.s

@ RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s

@------------------------------------------------------------------------------
@ unconditional branches accept narrow suffix and encode to short encodings
@------------------------------------------------------------------------------

         b.n    #-2048
         b.n    #2046

@ CHECK: b	#-2048                  @ encoding: [0x00,0xe4]
@ CHECK: b	#2046                   @ encoding: [0xff,0xe3]

@------------------------------------------------------------------------------
@ unconditional branches accept wide suffix and encode to wide encodings
@------------------------------------------------------------------------------

         b.w    #-2048
         b.w    #2046
         b.w    #-1677216
         b.w    #1677214

@ CHECK: b.w	#-2048                  @ encoding: [0xff,0xf7,0x00,0xbc]
@ CHECK: b.w	#2046                   @ encoding: [0x00,0xf0,0xff,0xbb]
@ CHECK: b.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: b.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ unconditional branches without width suffix encode depending of offset size
@------------------------------------------------------------------------------

         b      #-2048
         b      #2046
         b      #-2050
         b      #2048
         b      #-1677216
         b      #1677214

@ CHECK: b	#-2048                  @ encoding: [0x00,0xe4]
@ CHECK: b	#2046                   @ encoding: [0xff,0xe3]
@ CHECK: b.w	#-2050                  @ encoding: [0xff,0xf7,0xff,0xbb]
@ CHECK: b.w	#2048                   @ encoding: [0x00,0xf0,0x00,0xbc]
@ CHECK: b.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: b.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ unconditional branches with width narrow suffix in IT block 
@------------------------------------------------------------------------------

         it     eq
         beq.n  #-2048
         it     ne
         bne.n  #-2046

@ CHECK: it	eq                      @ encoding: [0x08,0xbf]
@ CHECK: beq	#-2048                  @ encoding: [0x00,0xe4] 
@ CHECK: it	ne                      @ encoding: [0x18,0xbf] 
@ CHECK: bne	#-2046                  @ encoding: [0x01,0xe4]

@------------------------------------------------------------------------------
@ unconditional branches with wide suffix in IT block
@------------------------------------------------------------------------------

         it     gt
         bgt.w  #-2048
         it     le
         ble.w  #2046
         it     ge
         bge.w  #-1677216
         it     lt
         blt.w  #1677214

@ CHECK: it	gt                      @ encoding: [0xc8,0xbf]
@ CHECK: bgt.w	#-2048                  @ encoding: [0xff,0xf7,0x00,0xbc]
@ CHECK: it	le                      @ encoding: [0xd8,0xbf]
@ CHECK: ble.w	#2046                   @ encoding: [0x00,0xf0,0xff,0xbb]
@ CHECK: it	ge                      @ encoding: [0xa8,0xbf]
@ CHECK: bge.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: it	lt                      @ encoding: [0xb8,0xbf]
@ CHECK: blt.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ conditional branches accept narrow suffix and encode to short encodings
@------------------------------------------------------------------------------

         beq.n    #-256
         bne.n    #254

@ CHECK: beq	#-256                   @ encoding: [0x80,0xd0]
@ CHECK: bne	#254                    @ encoding: [0x7f,0xd1]

@------------------------------------------------------------------------------
@ unconditional branches accept wide suffix and encode to wide encodings
@------------------------------------------------------------------------------

         bl.w     #256
         it ne
         blne.w   #256
         bmi.w    #-256
         bne.w    #254
         blt.w    #-1048576
         bge.w    #1048574

@ CHECK: bl	#256                    @ encoding: [0x00,0xf0,0x80,0xf8]
@ CHECK: it	ne                      @ encoding: [0x18,0xbf]
@ CHECK: blne	#256                    @ encoding: [0x00,0xf0,0x80,0xf8]
@ CHECK: bmi.w	#-256                   @ encoding: [0x3f,0xf5,0x80,0xaf]
@ CHECK: bne.w	#254                    @ encoding: [0x40,0xf0,0x7f,0x80]
@ CHECK: blt.w	#-1048576               @ encoding: [0xc0,0xf6,0x00,0x80]
@ CHECK: bge.w	#1048574                @ encoding: [0xbf,0xf2,0xff,0xaf]

@------------------------------------------------------------------------------
@ unconditional branches without width suffix encode depending of offset size
@------------------------------------------------------------------------------

         bne     #-256
         bgt     #254
         bne     #-258
         bgt     #256
         bne     #-1048576
         bgt     #1048574

@ CHECK: bne	#-256                   @ encoding: [0x80,0xd1]
@ CHECK: bgt	#254                    @ encoding: [0x7f,0xdc]
@ CHECK: bne.w	#-258                   @ encoding: [0x7f,0xf4,0x7f,0xaf]
@ CHECK: bgt.w	#256                    @ encoding: [0x00,0xf3,0x80,0x80]
@ CHECK: bne.w	#-1048576               @ encoding: [0x40,0xf4,0x00,0x80]
@ CHECK: bgt.w	#1048574                @ encoding: [0x3f,0xf3,0xff,0xaf]

@------------------------------------------------------------------------------
@ same branch insturction encoding to conditional or unconditional depending
@ on whether it is in an IT block or not
@------------------------------------------------------------------------------

         it     eq
         addeq  r0, r1
         bne    #128

@ CHECK: it	eq                      @ encoding: [0x08,0xbf]
@ CHECK: addeq	r0, r1                  @ encoding: [0x08,0x44]
@ CHECK: bne	#128                    @ encoding: [0x40,0xd1]

         ite    eq
         addeq  r0, r1
         bne    #128

@ CHECK: ite	eq                      @ encoding: [0x0c,0xbf]
@ CHECK: addeq	r0, r1                  @ encoding: [0x08,0x44]
@ CHECK: bne	#128                    @ encoding: [0x40,0xe0]

@ RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s

@------------------------------------------------------------------------------
@ unconditional branches accept narrow suffix and encode to short encodings
@------------------------------------------------------------------------------

         b.n    #-2048
         b.n    #2046

@ CHECK: b	#-2048                  @ encoding: [0x00,0xe4]
@ CHECK: b	#2046                   @ encoding: [0xff,0xe3]

@------------------------------------------------------------------------------
@ unconditional branches accept wide suffix and encode to wide encodings
@------------------------------------------------------------------------------

         b.w    #-2048
         b.w    #2046
         b.w    #-1677216
         b.w    #1677214

@ CHECK: b.w	#-2048                  @ encoding: [0xff,0xf7,0x00,0xbc]
@ CHECK: b.w	#2046                   @ encoding: [0x00,0xf0,0xff,0xbb]
@ CHECK: b.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: b.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ unconditional branches without width suffix encode depending of offset size
@------------------------------------------------------------------------------

         b      #-2048
         b      #2046
         b      #-2050
         b      #2048
         b      #-1677216
         b      #1677214

@ CHECK: b	#-2048                  @ encoding: [0x00,0xe4]
@ CHECK: b	#2046                   @ encoding: [0xff,0xe3]
@ CHECK: b.w	#-2050                  @ encoding: [0xff,0xf7,0xff,0xbb]
@ CHECK: b.w	#2048                   @ encoding: [0x00,0xf0,0x00,0xbc]
@ CHECK: b.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: b.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ unconditional branches with width narrow suffix in IT block 
@------------------------------------------------------------------------------

         it     eq
         beq.n  #-2048
         it     ne
         bne.n  #-2046

@ CHECK: it	eq                      @ encoding: [0x08,0xbf]
@ CHECK: beq	#-2048                  @ encoding: [0x00,0xe4] 
@ CHECK: it	ne                      @ encoding: [0x18,0xbf] 
@ CHECK: bne	#-2046                  @ encoding: [0x01,0xe4]

@------------------------------------------------------------------------------
@ unconditional branches with wide suffix in IT block
@------------------------------------------------------------------------------

         it     gt
         bgt.w  #-2048
         it     le
         ble.w  #2046
         it     ge
         bge.w  #-1677216
         it     lt
         blt.w  #1677214

@ CHECK: it	gt                      @ encoding: [0xc8,0xbf]
@ CHECK: bgt.w	#-2048                  @ encoding: [0xff,0xf7,0x00,0xbc]
@ CHECK: it	le                      @ encoding: [0xd8,0xbf]
@ CHECK: ble.w	#2046                   @ encoding: [0x00,0xf0,0xff,0xbb]
@ CHECK: it	ge                      @ encoding: [0xa8,0xbf]
@ CHECK: bge.w	#-1677216               @ encoding: [0x66,0xf6,0x30,0xbc]
@ CHECK: it	lt                      @ encoding: [0xb8,0xbf]
@ CHECK: blt.w	#1677214                @ encoding: [0x99,0xf1,0xcf,0xbb]

@------------------------------------------------------------------------------
@ conditional branches accept narrow suffix and encode to short encodings
@------------------------------------------------------------------------------

         beq.n    #-256
         bne.n    #254

@ CHECK: beq	#-256                   @ encoding: [0x80,0xd0]
@ CHECK: bne	#254                    @ encoding: [0x7f,0xd1]

@------------------------------------------------------------------------------
@ unconditional branches accept wide suffix and encode to wide encodings
@------------------------------------------------------------------------------

         bmi.w    #-256
         bne.w    #254
         blt.w    #-1048576
         bge.w    #1048574

@ CHECK: bmi.w	#-256                   @ encoding: [0x3f,0xf5,0x80,0xaf]
@ CHECK: bne.w	#254                    @ encoding: [0x40,0xf0,0x7f,0x80]
@ CHECK: blt.w	#-1048576               @ encoding: [0xc0,0xf6,0x00,0x80]
@ CHECK: bge.w	#1048574                @ encoding: [0xbf,0xf2,0xff,0xaf]

@------------------------------------------------------------------------------
@ unconditional branches without width suffix encode depending of offset size
@------------------------------------------------------------------------------

         bne     #-256
         bgt     #254
         bne     #-258
         bgt     #256
         bne     #-1048576
         bgt     #1048574

@ CHECK: bne	#-256                   @ encoding: [0x80,0xd1]
@ CHECK: bgt	#254                    @ encoding: [0x7f,0xdc]
@ CHECK: bne.w	#-258                   @ encoding: [0x7f,0xf4,0x7f,0xaf]
@ CHECK: bgt.w	#256                    @ encoding: [0x00,0xf3,0x80,0x80]
@ CHECK: bne.w	#-1048576               @ encoding: [0x40,0xf4,0x00,0x80]
@ CHECK: bgt.w	#1048574                @ encoding: [0x3f,0xf3,0xff,0xaf]

@------------------------------------------------------------------------------
@ same branch insturction encoding to conditional or unconditional depending
@ on whether it is in an IT block or not
@------------------------------------------------------------------------------

         it     eq
         addeq  r0, r1
         bne    #128

@ CHECK: it	eq                      @ encoding: [0x08,0xbf]
@ CHECK: addeq	r0, r1                  @ encoding: [0x08,0x44]
@ CHECK: bne	#128                    @ encoding: [0x40,0xd1]

         ite    eq
         addeq  r0, r1
         bne    #128

@ CHECK: ite	eq                      @ encoding: [0x0c,0xbf]
@ CHECK: addeq	r0, r1                  @ encoding: [0x08,0x44]
@ CHECK: bne	#128                    @ encoding: [0x40,0xe0]


@------------------------------------------------------------------------------
@ Branch targets destined for ARM mode must == 0 (mod 4), otherwise (mod 2).
@------------------------------------------------------------------------------

        b #2
        bl #2
        beq #2
        cbz r0, #2
        @ N.b. destination is "align(PC, 4) + imm" so imm is still 4-byte
        @ aligned even though current PC may not and destination must be.
        blx #4

@ CHECK: b	#2                      @ encoding: [0x01,0xe0]
@ CHECK: bl	#2                      @ encoding: [0x00,0xf0,0x01,0xf8]
@ CHECK: beq	#2                      @ encoding: [0x01,0xd0]
@ CHECK: cbz	r0, #2                  @ encoding: [0x08,0xb1]
@ CHECK: blx	#4                      @ encoding: [0x00,0xf0,0x02,0xe8]