| @ 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 |
| |