305 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| @ 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]
 | |
| 
 | |
| @ 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]
 |