diff options
Diffstat (limited to 'test/MC/ARM/thumb-load-store-multiple.s')
-rw-r--r-- | test/MC/ARM/thumb-load-store-multiple.s | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/test/MC/ARM/thumb-load-store-multiple.s b/test/MC/ARM/thumb-load-store-multiple.s new file mode 100644 index 0000000..6958450 --- /dev/null +++ b/test/MC/ARM/thumb-load-store-multiple.s @@ -0,0 +1,100 @@ +@ RUN: not llvm-mc -triple thumbv7-eabi -filetype asm -o - %s 2>&1 \ +@ RUN: | FileCheck %s +@ RUN: not llvm-mc -triple thumbv7a-eabi -filetype asm -o - %s 2>&1 \ +@ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7A %s +@ RUN: not llvm-mc -triple thumbv7m-eabi -filetype asm -o - %s 2>&1 \ +@ RUN: | FileCheck --check-prefix=CHECK --check-prefix=CHECK-V7M %s + + .syntax unified + .thumb + + .global ldm + .type ldm,%function +ldm: + ldm r0!, {r1, sp} +@ CHECK: error: SP may not be in the register list +@ CHECK: ldm r0!, {r1, sp} +@ CHECK: ^ + ldm r0!, {lr, pc} +@ CHECK: error: PC and LR may not be in the register list simultaneously +@ CHECK: ldm r0!, {lr, pc} +@ CHECK: ^ + itt eq + ldmeq r0!, {r1, pc} + ldmeq r0!, {r2, lr} +@ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block +@ CHECK: ldmeq r0!, {r1, pc} +@ CHECK: ^ + + .global ldmdb + .type ldmdb,%function +ldmdb: + ldmdb r0!, {r1, sp} +@ CHECK: error: SP may not be in the register list + ldmdb r0!, {lr, pc} +@ error: PC and LR may not be in the register list simultaneously + itt eq + ldmeq r0!, {r1, pc} + ldmeq r0!, {r2, lr} +@ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block +@ CHECK: ldmeq r0!, {r1, pc} +@ CHECK: ^ + + .global stm + .type stm,%function +stm: + stm r0!, {r1, sp} +@ CHECK: error: SP may not be in the register list + stm r0!, {r2, pc} +@ CHECK: error: PC may not be in the register list + stm r0!, {sp, pc} +@ CHECK: error: SP and PC may not be in the register list + + .global stmdb + .type stmdb,%function +stmdb: + stmdb r0!, {r1, sp} +@ CHECK: error: SP may not be in the register list + stmdb r0!, {r2, pc} +@ CHECK: error: PC may not be in the register list + stmdb r0!, {sp, pc} +@ CHECK: error: SP and PC may not be in the register list + + .global push + .type push,%function +push: + push {sp} +@ CHECK: error: SP may not be in the register list + push {pc} +@ CHECK: error: PC may not be in the register list + push {sp, pc} +@ CHECK: error: SP and PC may not be in the register list + + .global pop + .type pop,%function +pop: + pop {sp} +@ CHECK-V7M: error: SP may not be in the register list + pop {lr, pc} +@ CHECK: error: PC and LR may not be in the register list simultaneously +@ CHECK: pop {lr, pc} +@ CHECK: ^ + itt eq + popeq {r1, pc} + popeq {r2, lr} +@ CHECK: error: instruction must be outside of IT block or the last instruction in an IT block +@ CHECK: popeq {r1, pc} +@ CHECK: ^ + + .global valid + .type valid,%function +valid: + pop {sp} +@ CHECK-V7A: ldr sp, [sp], #4 + pop {sp, pc} +@ CHECK-V7A: pop.w {sp, pc} + push.w {r0} +@ CHECK: str r0, [sp, #-4] + pop.w {r0} +@ CHECK: ldr r0, [sp], #4 + |