Home | History | Annotate | Download | only in ARM
      1 @ RUN: not llvm-mc -triple=thumbv6-apple-darwin < %s 2> %t
      2 @ RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
      3 @ RUN: not llvm-mc -triple=thumbv5-apple-darwin < %s 2> %t
      4 @ RUN: FileCheck --check-prefix=CHECK-ERRORS-V5 < %t %s
      5 @ RUN: not llvm-mc -triple=thumbv8 < %s 2> %t
      6 @ RUN: FileCheck --check-prefix=CHECK-ERRORS-V8 < %t %s
      7 
      8 @ Check for various assembly diagnostic messages on invalid input.
      9 
     10 @ ADD instruction w/o 'S' suffix.
     11         add r1, r2, r3
     12 @ CHECK-ERRORS: error: invalid instruction
     13 @ CHECK-ERRORS:         add r1, r2, r3
     14 @ CHECK-ERRORS:         ^
     15 
     16 @ Instructions which require v6+ for both registers to be low regs.
     17         add r2, r3
     18         mov r2, r3
     19 @ CHECK-ERRORS: error: instruction variant requires Thumb2
     20 @ CHECK-ERRORS:         add r2, r3
     21 @ CHECK-ERRORS:         ^
     22 @ CHECK-ERRORS-V5: error: instruction variant requires ARMv6 or later
     23 @ CHECK-ERRORS-V5:         mov r2, r3
     24 @ CHECK-ERRORS-V5:         ^
     25 
     26 
     27 @ Out of range immediates for ASR instruction.
     28         asrs r2, r3, #33
     29 @ CHECK-ERRORS: error: invalid operand for instruction
     30 @ CHECK-ERRORS:         asrs r2, r3, #33
     31 @ CHECK-ERRORS:                      ^
     32 
     33 @ Out of range immediates for BKPT instruction.
     34         bkpt #256
     35         bkpt #-1
     36 error: invalid operand for instruction
     37         bkpt #256
     38              ^
     39 error: invalid operand for instruction
     40         bkpt #-1
     41              ^
     42 
     43 @ Out of range immediates for v8 HLT instruction.
     44         hlt #64
     45         hlt #-1
     46 @CHECK-ERRORS: error: instruction requires: armv8 arm-mode
     47 @CHECK-ERRORS:        hlt #64
     48 @CHECK-ERRORS:        ^
     49 @CHECK-ERRORS-V8: error: instruction requires: arm-mode
     50 @CHECK-ERRORS-V8:         hlt #64
     51 @CHECK-ERRORS-V8:              ^
     52 @CHECK-ERRORS: error: invalid operand for instruction
     53 @CHECK-ERRORS:         hlt #-1
     54 @CHECK-ERRORS:              ^
     55 
     56 @ Invalid writeback and register lists for LDM
     57         ldm r2!, {r5, r8}
     58         ldm r2, {r5, r7}
     59         ldm r2!, {r2, r3, r4}
     60         ldm r2!, {r2, r3, r4, r10}
     61         ldmdb r2!, {r2, r3, r4}
     62 @ CHECK-ERRORS: error: registers must be in range r0-r7
     63 @ CHECK-ERRORS:         ldm r2!, {r5, r8}
     64 @ CHECK-ERRORS:                  ^
     65 @ CHECK-ERRORS: error: writeback operator '!' expected
     66 @ CHECK-ERRORS:         ldm r2, {r5, r7}
     67 @ CHECK-ERRORS:             ^
     68 @ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list
     69 @ CHECK-ERRORS:         ldm r2!, {r2, r3, r4}
     70 @ CHECK-ERRORS:               ^
     71 @ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list
     72 @ CHECK-ERRORS-V8:         ldm r2!, {r2, r3, r4, r10}
     73 @ CHECK-ERRORS-V8:               ^
     74 @ CHECK-ERRORS-V8: error: writeback register not allowed in register list
     75 @ CHECK-ERRORS-V8:         ldmdb r2!, {r2, r3, r4}
     76 @ CHECK-ERRORS-V8:                 ^
     77 
     78 @ Invalid writeback and register lists for PUSH/POP
     79         pop {r1, r2, r10}
     80         push {r8, r9}
     81 @ CHECK-ERRORS: error: registers must be in range r0-r7 or pc
     82 @ CHECK-ERRORS:         pop {r1, r2, r10}
     83 @ CHECK-ERRORS:             ^
     84 @ CHECK-ERRORS: error: registers must be in range r0-r7 or lr
     85 @ CHECK-ERRORS:         push {r8, r9}
     86 @ CHECK-ERRORS:              ^
     87 
     88 
     89 @ Invalid writeback and register lists for STM
     90         stm r1, {r2, r6}
     91         stm r1!, {r2, r9}
     92         stm r2!, {r2, r9}
     93         stmdb r2!, {r0, r2}
     94 @ CHECK-ERRORS: error: instruction requires: thumb2
     95 @ CHECK-ERRORS:         stm r1, {r2, r6}
     96 @ CHECK-ERRORS:         ^
     97 @ CHECK-ERRORS: error: registers must be in range r0-r7
     98 @ CHECK-ERRORS:         stm r1!, {r2, r9}
     99 @ CHECK-ERRORS:                  ^
    100 @ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list
    101 @ CHECK-ERRORS-V8:         stm r2!, {r2, r9}
    102 @ CHECK-ERRORS-V8:                  ^
    103 @ CHECK-ERRORS-V8: error: writeback register not allowed in register list
    104 @ CHECK-ERRORS-V8:         stmdb r2!, {r0, r2}
    105 @ CHECK-ERRORS-V8:                  ^
    106 
    107 @ Out of range immediates for LSL instruction.
    108         lsls r4, r5, #-1
    109         lsls r4, r5, #32
    110 @ CHECK-ERRORS: error: invalid operand for instruction
    111 @ CHECK-ERRORS:         lsls r4, r5, #-1
    112 @ CHECK-ERRORS:                      ^
    113 @ CHECK-ERRORS: error: invalid operand for instruction
    114 @ CHECK-ERRORS:         lsls r4, r5, #32
    115 @ CHECK-ERRORS:                      ^
    116 
    117 @ Mismatched source/destination operands for MUL instruction.
    118         muls r1, r2, r3
    119 @ CHECK-ERRORS: error: destination register must match source register
    120 @ CHECK-ERRORS:         muls r1, r2, r3
    121 @ CHECK-ERRORS:              ^
    122 
    123 
    124 @ Out of range immediates for STR instruction.
    125         str r2, [r7, #-1]
    126         str r5, [r1, #3]
    127         str r3, [r7, #128]
    128 @ CHECK-ERRORS: error: instruction requires: thumb2
    129 @ CHECK-ERRORS:         str r2, [r7, #-1]
    130 @ CHECK-ERRORS:         ^
    131 @ CHECK-ERRORS: error: instruction requires: thumb2
    132 @ CHECK-ERRORS:         str r5, [r1, #3]
    133 @ CHECK-ERRORS:         ^
    134 @ CHECK-ERRORS: error: instruction requires: thumb2
    135 @ CHECK-ERRORS:         str r3, [r7, #128]
    136 @ CHECK-ERRORS:         ^
    137 
    138 @ Out of range immediate for SVC instruction.
    139         svc #-1
    140         svc #256
    141 @ CHECK-ERRORS: error: invalid operand for instruction
    142 @ CHECK-ERRORS:         svc #-1
    143 @ CHECK-ERRORS:             ^
    144 @ CHECK-ERRORS: error: instruction requires: arm-mode
    145 @ CHECK-ERRORS:         svc #256
    146 @ CHECK-ERRORS:         ^
    147 
    148 
    149 @ Out of range immediate for ADD SP instructions
    150         add sp, #-1
    151         add sp, #3
    152         add sp, sp, #512
    153         add r2, sp, #1024
    154 @ CHECK-ERRORS: error: instruction requires: thumb2
    155 @ CHECK-ERRORS:         add sp, #-1
    156 @ CHECK-ERRORS:                 ^
    157 @ CHECK-ERRORS: error: instruction requires: thumb2
    158 @ CHECK-ERRORS:         add sp, #3
    159 @ CHECK-ERRORS:                 ^
    160 @ CHECK-ERRORS: error: instruction requires: thumb2
    161 @ CHECK-ERRORS:         add sp, sp, #512
    162 @ CHECK-ERRORS:                     ^
    163 @ CHECK-ERRORS: error: instruction requires: arm-mode
    164 @ CHECK-ERRORS:         add r2, sp, #1024
    165 @ CHECK-ERRORS:         ^
    166 
    167         add r2, sp, ip
    168 @ CHECK-ERRORS: error: source register must be the same as destination
    169 @ CHECK-ERRORS:         add r2, sp, ip
    170 @ CHECK-ERRORS:                     ^
    171 
    172 
    173 @------------------------------------------------------------------------------
    174 @ B/Bcc - out of range immediates for Thumb1 branches
    175 @------------------------------------------------------------------------------
    176 
    177         beq    #-258
    178         bne    #256
    179         bgt    #13
    180         b      #-1048578
    181         b      #1048576
    182         b      #10323
    183 
    184 @ CHECK-ERRORS: error: branch target out of range
    185 @ CHECK-ERRORS: error: branch target out of range
    186 @ CHECK-ERRORS: error: branch target out of range
    187 @ CHECK-ERRORS: error: branch target out of range
    188 @ CHECK-ERRORS: error: branch target out of range
    189 @ CHECK-ERRORS: error: branch target out of range
    190 
    191 @------------------------------------------------------------------------------
    192 @ WFE/WFI/YIELD - are not supported pre v6T2
    193 @------------------------------------------------------------------------------
    194         wfe
    195         wfi
    196         yield
    197 
    198 @ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2
    199 @ CHECK-ERRORS: wfe
    200 @ CHECK-ERRORS: ^
    201 @ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2
    202 @ CHECK-ERRORS: wfi
    203 @ CHECK-ERRORS: ^
    204 @ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2
    205 @ CHECK-ERRORS: yield
    206 @ CHECK-ERRORS: ^
    207 
    208 @------------------------------------------------------------------------------
    209 @ PLDW required mp-extensions
    210 @------------------------------------------------------------------------------
    211         pldw [r0, #4]
    212 @ CHECK-ERRORS: error: instruction requires: mp-extensions
    213 
    214 @------------------------------------------------------------------------------
    215 @ LDR(lit) - invalid offsets
    216 @------------------------------------------------------------------------------
    217 
    218         ldr r4, [pc, #-12]
    219 @ CHECK-ERRORS: error: instruction requires: thumb2
    220 
    221