Home | History | Annotate | Download | only in ARM
      1 @ RUN: not llvm-mc -triple thumbv7-eabi -filetype asm -o - %s 2>&1 \
      2 @ RUN:     | FileCheck %s
      3 @ RUN: not llvm-mc -triple thumbv7a-eabi -filetype asm -o - %s 2>&1 \
      4 @ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7A %s
      5 @ RUN: not llvm-mc -triple thumbv7m-eabi -filetype asm -o - %s 2>&1 \
      6 @ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7M %s
      7 
      8 	.syntax unified
      9 	.thumb
     10 
     11 	.global ldm
     12 	.type ldm,%function
     13 ldm:
     14 	ldm r0!, {r1, sp}
     15 @ CHECK: error: SP may not be in the register list
     16 @ CHECK: ldm r0!, {r1, sp}
     17 @ CHECK:          ^
     18 	ldm r0!, {lr, pc}
     19 @ CHECK: error: PC and LR may not be in the register list simultaneously
     20 @ CHECK: ldm r0!, {lr, pc}
     21 @ CHECK:          ^
     22 	itt eq
     23 	ldmeq r0!, {r1, pc}
     24 	ldmeq r0!, {r2, lr}
     25 @ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block
     26 @ CHECK: ldmeq r0!, {r1, pc}
     27 @ CHECK:            ^
     28 
     29 	.global ldmdb
     30 	.type ldmdb,%function
     31 ldmdb:
     32 	ldmdb r0!, {r1, sp}
     33 @ CHECK: error: SP may not be in the register list
     34 	ldmdb r0!, {lr, pc}
     35 @ error: PC and LR may not be in the register list simultaneously
     36 	itt eq
     37 	ldmeq r0!, {r1, pc}
     38 	ldmeq r0!, {r2, lr}
     39 @ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block
     40 @ CHECK: ldmeq r0!, {r1, pc}
     41 @ CHECK:            ^
     42 
     43 	.global stm
     44 	.type stm,%function
     45 stm:
     46 	stm r0!, {r1, sp}
     47 @ CHECK: error: SP may not be in the register list
     48 	stm r0!, {r2, pc}
     49 @ CHECK: error: PC may not be in the register list
     50 	stm r0!, {sp, pc}
     51 @ CHECK: error: SP and PC may not be in the register list
     52 
     53 	.global stmdb
     54 	.type stmdb,%function
     55 stmdb:
     56 	stmdb r0!, {r1, sp}
     57 @ CHECK: error: SP may not be in the register list
     58 	stmdb r0!, {r2, pc}
     59 @ CHECK: error: PC may not be in the register list
     60 	stmdb r0!, {sp, pc}
     61 @ CHECK: error: SP and PC may not be in the register list
     62 
     63 	.global push
     64 	.type push,%function
     65 push:
     66 	push {sp}
     67 @ CHECK: error: SP may not be in the register list
     68 	push {pc}
     69 @ CHECK: error: PC may not be in the register list
     70 	push {sp, pc}
     71 @ CHECK: error: SP and PC may not be in the register list
     72 
     73 	.global pop
     74 	.type pop,%function
     75 pop:
     76         pop {sp}
     77 @ CHECK-V7M: error: SP may not be in the register list
     78 	pop {lr, pc}
     79 @ CHECK: error: PC and LR may not be in the register list simultaneously
     80 @ CHECK: pop {lr, pc}
     81 @ CHECK:     ^
     82 	itt eq
     83 	popeq {r1, pc}
     84 	popeq {r2, lr}
     85 @ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block
     86 @ CHECK: popeq {r1, pc}
     87 @ CHECK:     ^
     88 
     89 	.global valid
     90 	.type valid,%function
     91 valid:
     92 	pop {sp}
     93 @ CHECK-V7A: ldr sp, [sp], #4
     94 	pop {sp, pc}
     95 @ CHECK-V7A: pop.w {sp, pc}
     96 	push.w {r0}
     97 @ CHECK: str r0, [sp, #-4]
     98 	pop.w {r0}
     99 @ CHECK: ldr r0, [sp], #4
    100 
    101