Home | History | Annotate | Download | only in ARM
      1 @ RUN: not llvm-mc -triple=armv7-apple-darwin < %s 2> %t
      2 @ RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
      3 
      4 @ Check for various assembly diagnostic messages on invalid input.
      5 
      6 @ 's' bit on an instruction that can't accept it.
      7         mlss r1, r2, r3, r4
      8 @ CHECK-ERRORS: error: instruction 'mls' can not set flags,
      9 @ CHECK-ERRORS: but 's' suffix specified
     10 
     11 
     12         @ Out of range shift immediate values.
     13         adc r1, r2, r3, lsl #invalid
     14         adc r4, r5, r6, lsl #-1
     15         adc r4, r5, r6, lsl #32
     16         adc r4, r5, r6, lsr #-1
     17         adc r4, r5, r6, lsr #33
     18         adc r4, r5, r6, asr #-1
     19         adc r4, r5, r6, asr #33
     20         adc r4, r5, r6, ror #-1
     21         adc r4, r5, r6, ror #32
     22 
     23 @ CHECK-ERRORS: error: invalid immediate shift value
     24 @ CHECK-ERRORS:         adc r1, r2, r3, lsl #invalid
     25 @ CHECK-ERRORS:                              ^
     26 @ CHECK-ERRORS: error: immediate shift value out of range
     27 @ CHECK-ERRORS:         adc r4, r5, r6, lsl #-1
     28 @ CHECK-ERRORS:                              ^
     29 @ CHECK-ERRORS: error: immediate shift value out of range
     30 @ CHECK-ERRORS:         adc r4, r5, r6, lsl #32
     31 @ CHECK-ERRORS:                              ^
     32 @ CHECK-ERRORS: error: immediate shift value out of range
     33 @ CHECK-ERRORS:         adc r4, r5, r6, lsr #-1
     34 @ CHECK-ERRORS:                              ^
     35 @ CHECK-ERRORS: error: immediate shift value out of range
     36 @ CHECK-ERRORS:         adc r4, r5, r6, lsr #33
     37 @ CHECK-ERRORS:                              ^
     38 @ CHECK-ERRORS: error: immediate shift value out of range
     39 @ CHECK-ERRORS:         adc r4, r5, r6, asr #-1
     40 @ CHECK-ERRORS:                              ^
     41 @ CHECK-ERRORS: error: immediate shift value out of range
     42 @ CHECK-ERRORS:         adc r4, r5, r6, asr #33
     43 @ CHECK-ERRORS:                              ^
     44 @ CHECK-ERRORS: error: immediate shift value out of range
     45 @ CHECK-ERRORS:         adc r4, r5, r6, ror #-1
     46 @ CHECK-ERRORS:                              ^
     47 @ CHECK-ERRORS: error: immediate shift value out of range
     48 @ CHECK-ERRORS:         adc r4, r5, r6, ror #32
     49 
     50         @ Out of range shift immediate values for load/store.
     51         str r1, [r2, r3, lsl #invalid]
     52         ldr r4, [r5], r6, lsl #-1
     53         pld r4, [r5, r6, lsl #32]
     54         str r4, [r5], r6, lsr #-1
     55         ldr r4, [r5, r6, lsr #33]
     56         pld r4, [r5, r6, asr #-1]
     57         str r4, [r5, r6, asr #33]
     58         ldr r4, [r5, r6, ror #-1]
     59         pld r4, [r5, r6, ror #32]
     60         pld r4, [r5, r6, rrx #0]
     61 
     62 @ CHECK-ERRORS: error: shift amount must be an immediate
     63 @ CHECK-ERRORS:         str r1, [r2, r3, lsl #invalid]
     64 @ CHECK-ERRORS:                              ^
     65 @ CHECK-ERRORS: error: immediate shift value out of range
     66 @ CHECK-ERRORS:         ldr r4, [r5], r6, lsl #-1
     67 @ CHECK-ERRORS:                              ^
     68 @ CHECK-ERRORS: error: immediate shift value out of range
     69 @ CHECK-ERRORS:         pld r4, [r5, r6, lsl #32]
     70 @ CHECK-ERRORS:                              ^
     71 @ CHECK-ERRORS: error: immediate shift value out of range
     72 @ CHECK-ERRORS:         str r4, [r5], r6, lsr #-1
     73 @ CHECK-ERRORS:                              ^
     74 @ CHECK-ERRORS: error: immediate shift value out of range
     75 @ CHECK-ERRORS:         ldr r4, [r5, r6, lsr #33]
     76 @ CHECK-ERRORS:                              ^
     77 @ CHECK-ERRORS: error: immediate shift value out of range
     78 @ CHECK-ERRORS:         pld r4, [r5, r6, asr #-1]
     79 @ CHECK-ERRORS:                              ^
     80 @ CHECK-ERRORS: error: immediate shift value out of range
     81 @ CHECK-ERRORS:         str r4, [r5, r6, asr #33]
     82 @ CHECK-ERRORS:                              ^
     83 @ CHECK-ERRORS: error: immediate shift value out of range
     84 @ CHECK-ERRORS:         ldr r4, [r5, r6, ror #-1]
     85 @ CHECK-ERRORS:                              ^
     86 @ CHECK-ERRORS: error: immediate shift value out of range
     87 @ CHECK-ERRORS:         pld r4, [r5, r6, ror #32]
     88 @ CHECK-ERRORS: error: ']' expected
     89 @ CHECK-ERRORS:         pld r4, [r5, r6, rrx #0]
     90 
     91         @ Out of range 16-bit immediate on BKPT
     92         bkpt #65536
     93 
     94 @ CHECK-ERRORS: error: invalid operand for instruction
     95 
     96         @ Out of range 4 and 3 bit immediates on CDP[2]
     97 
     98         @ Out of range immediates for CDP/CDP2
     99         cdp  p7, #2, c1, c1, c1, #8
    100         cdp  p7, #1, c1, c1, c1, #8
    101         cdp2  p7, #2, c1, c1, c1, #8
    102         cdp2  p7, #1, c1, c1, c1, #8
    103 
    104 @ CHECK-ERRORS: error: invalid operand for instruction
    105 @ CHECK-ERRORS: error: invalid operand for instruction
    106 @ CHECK-ERRORS: error: invalid operand for instruction
    107 @ CHECK-ERRORS: error: invalid operand for instruction
    108 
    109         @ Out of range immediates for DBG
    110         dbg #-1
    111         dbg #16
    112 
    113 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    114 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    115 @  Double-check that we're synced up with the right diagnostics.
    116 @ CHECK-ERRORS: dbg #16
    117 
    118         @ Out of range immediate for MCR/MCR2/MCRR/MCRR2
    119         mcr  p7, #8, r5, c1, c1, #4
    120         mcr  p7, #2, r5, c1, c1, #8
    121         mcr2  p7, #8, r5, c1, c1, #4
    122         mcr2  p7, #1, r5, c1, c1, #8
    123         mcrr  p7, #16, r5, r4, c1
    124         mcrr2  p7, #16, r5, r4, c1
    125 @ CHECK-ERRORS: error: invalid operand for instruction
    126 @ CHECK-ERRORS: error: invalid operand for instruction
    127 @ CHECK-ERRORS: error: invalid operand for instruction
    128 @ CHECK-ERRORS: error: invalid operand for instruction
    129 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    130 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    131 
    132 
    133         @ Out of range immediate for MOV
    134         movw r9, 0x10000
    135 @ CHECK-ERRORS: error: invalid operand for instruction
    136 
    137         @ Invalid 's' bit usage for MOVW
    138         movs r6, #0xffff
    139         movwseq r9, #0xffff
    140 @ CHECK-ERRORS: error: invalid operand for instruction
    141 @ CHECK-ERRORS: error: instruction 'movw' can not set flags, but 's' suffix specified
    142 
    143         @ Out of range immediate for MOVT
    144         movt r9, 0x10000
    145 @ CHECK-ERRORS: error: invalid operand for instruction
    146 
    147         @ Out of range immediates for MRC/MRC2/MRRC/MRRC2
    148         mrc  p14, #8, r1, c1, c2, #4
    149         mrc  p14, #1, r1, c1, c2, #8
    150         mrc2  p14, #8, r1, c1, c2, #4
    151         mrc2  p14, #0, r1, c1, c2, #9
    152         mrrc  p7, #16, r5, r4, c1
    153         mrrc2  p7, #17, r5, r4, c1
    154 @ CHECK-ERRORS: error: invalid operand for instruction
    155 @ CHECK-ERRORS: error: invalid operand for instruction
    156 @ CHECK-ERRORS: error: invalid operand for instruction
    157 @ CHECK-ERRORS: error: invalid operand for instruction
    158 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    159 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
    160 
    161         @ Shifter operand validation for PKH instructions.
    162         pkhbt r2, r2, r3, lsl #-1
    163         pkhbt r2, r2, r3, lsl #32
    164         pkhtb r2, r2, r3, asr #0
    165         pkhtb r2, r2, r3, asr #33
    166         pkhbt r2, r2, r3, asr #3
    167         pkhtb r2, r2, r3, lsl #3
    168 
    169 @ CHECK-ERRORS: error: immediate value out of range
    170 @ CHECK-ERRORS:         pkhbt r2, r2, r3, lsl #-1
    171 @ CHECK-ERRORS:                                ^
    172 @ CHECK-ERRORS: error: immediate value out of range
    173 @ CHECK-ERRORS:         pkhbt r2, r2, r3, lsl #32
    174 @ CHECK-ERRORS:                                ^
    175 @ CHECK-ERRORS: error: immediate value out of range
    176 @ CHECK-ERRORS:         pkhtb r2, r2, r3, asr #0
    177 @ CHECK-ERRORS:                                ^
    178 @ CHECK-ERRORS: error: immediate value out of range
    179 @ CHECK-ERRORS:         pkhtb r2, r2, r3, asr #33
    180 @ CHECK-ERRORS:                                ^
    181 @ CHECK-ERRORS: error: lsl operand expected.
    182 @ CHECK-ERRORS:         pkhbt r2, r2, r3, asr #3
    183 @ CHECK-ERRORS:                           ^
    184 @ CHECK-ERRORS: error: asr operand expected.
    185 @ CHECK-ERRORS:         pkhtb r2, r2, r3, lsl #3
    186 @ CHECK-ERRORS:                           ^
    187 
    188 
    189         @ bad values for SETEND
    190         setendne be
    191         setend me
    192         setend 1
    193 
    194 @ CHECK-ERRORS: error: instruction 'setend' is not predicable, but condition code specified
    195 @ CHECK-ERRORS:         setendne be
    196 @ CHECK-ERRORS:         ^
    197 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
    198 @ CHECK-ERRORS:         setend me
    199 @ CHECK-ERRORS:                  ^
    200 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
    201 @ CHECK-ERRORS:         setend 1
    202 @ CHECK-ERRORS:                ^
    203 
    204 
    205         @ Out of range immediates and bad shift types for SSAT
    206 	ssat	r8, #0, r10, lsl #8
    207 	ssat	r8, #33, r10, lsl #8
    208 	ssat	r8, #1, r10, lsl #-1
    209 	ssat	r8, #1, r10, lsl #32
    210 	ssat	r8, #1, r10, asr #0
    211 	ssat	r8, #1, r10, asr #33
    212         ssat    r8, #1, r10, lsr #5
    213         ssat    r8, #1, r10, lsl fred
    214         ssat    r8, #1, r10, lsl #fred
    215 
    216 @ CHECK-ERRORS: error: invalid operand for instruction
    217 @ CHECK-ERRORS: 	ssat	r8, #0, r10, lsl #8
    218 @ CHECK-ERRORS: 	    	    ^
    219 @ CHECK-ERRORS: error: invalid operand for instruction
    220 @ CHECK-ERRORS: 	ssat	r8, #33, r10, lsl #8
    221 @ CHECK-ERRORS: 	    	    ^
    222 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
    223 @ CHECK-ERRORS: 	ssat	r8, #1, r10, lsl #-1
    224 @ CHECK-ERRORS: 	    	                  ^
    225 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
    226 @ CHECK-ERRORS: 	ssat	r8, #1, r10, lsl #32
    227 @ CHECK-ERRORS: 	    	                  ^
    228 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
    229 @ CHECK-ERRORS: 	ssat	r8, #1, r10, asr #0
    230 @ CHECK-ERRORS: 	    	                  ^
    231 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
    232 @ CHECK-ERRORS: 	ssat	r8, #1, r10, asr #33
    233 @ CHECK-ERRORS: 	    	                  ^
    234 @ CHECK-ERRORS: error: shift operator 'asr' or 'lsl' expected
    235 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsr #5
    236 @ CHECK-ERRORS:                              ^
    237 @ CHECK-ERRORS: error: '#' expected
    238 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl fred
    239 @ CHECK-ERRORS:                                  ^
    240 @ CHECK-ERRORS: error: shift amount must be an immediate
    241 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl #fred
    242 @ CHECK-ERRORS:                                   ^
    243 
    244         @ Out of range immediates for SSAT16
    245 	ssat16	r2, #0, r7
    246 	ssat16	r3, #17, r5
    247 
    248 @ CHECK-ERRORS: error: invalid operand for instruction
    249 @ CHECK-ERRORS: 	ssat16	r2, #0, r7
    250 @ CHECK-ERRORS: 	      	    ^
    251 @ CHECK-ERRORS: error: invalid operand for instruction
    252 @ CHECK-ERRORS: 	ssat16	r3, #17, r5
    253 @ CHECK-ERRORS: 	      	    ^
    254 
    255 
    256         @ Out of order STM registers
    257         stmda sp!, {r5, r2}
    258 
    259 @ CHECK-ERRORS: warning: register list not in ascending order
    260 @ CHECK-ERRORS:         stmda     sp!, {r5, r2}
    261 @ CHECK-ERRORS:                            ^
    262 
    263 
    264         @ Out of range immediate on SVC
    265         svc #0x1000000
    266 @ CHECK-ERRORS: error: invalid operand for instruction
    267 @ CHECK-ERRORS:   svc #0x1000000
    268 @ CHECK-ERRORS:       ^
    269 
    270 
    271         @ Out of order Rt/Rt2 operands for ldrexd/strexd
    272         ldrexd  r4, r3, [r8]
    273         strexd  r6, r5, r3, [r8]
    274 
    275 @ CHECK-ERRORS: error: destination operands must be sequential
    276 @ CHECK-ERRORS:         ldrexd  r4, r3, [r8]
    277 @ CHECK-ERRORS:                     ^
    278 @ CHECK-ERRORS: error: source operands must be sequential
    279 @ CHECK-ERRORS:         strexd  r6, r5, r3, [r8]
    280 @ CHECK-ERRORS:                         ^
    281 
    282         @ Illegal rotate operators for extend instructions
    283         sxtb r8, r3, #8
    284         sxtb r8, r3, ror 24
    285         sxtb r8, r3, ror #8 -
    286         sxtab r3, r8, r3, ror #(fred - wilma)
    287         sxtab r7, r8, r3, ror #25
    288         sxtah r9, r3, r3, ror #-8
    289         sxtb16ge r2, r3, lsr #24
    290 
    291 @ CHECK-ERRORS: error: invalid operand for instruction
    292 @ CHECK-ERRORS:         sxtb r8, r3, #8
    293 @ CHECK-ERRORS:                      ^
    294 @ CHECK-ERRORS: error: '#' expected
    295 @ CHECK-ERRORS:         sxtb r8, r3, ror 24
    296 @ CHECK-ERRORS:                          ^
    297 @ CHECK-ERRORS: error: unknown token in expression
    298 @ CHECK-ERRORS:         sxtb r8, r3, ror #8 -
    299 @ CHECK-ERRORS:                              ^
    300 @ CHECK-ERRORS: error: malformed rotate expression
    301 @ CHECK-ERRORS:         sxtb r8, r3, ror #8 -
    302 @ CHECK-ERRORS:                           ^
    303 @ CHECK-ERRORS: error: rotate amount must be an immediate
    304 @ CHECK-ERRORS:         sxtab r3, r8, r3, ror #(fred - wilma)
    305 @ CHECK-ERRORS:                                ^
    306 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
    307 @ CHECK-ERRORS:         sxtab r7, r8, r3, ror #25
    308 @ CHECK-ERRORS:                                ^
    309 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
    310 @ CHECK-ERRORS:         sxtah r9, r3, r3, ror #-8
    311 @ CHECK-ERRORS:                                ^
    312 @ CHECK-ERRORS: error: invalid operand for instruction
    313 @ CHECK-ERRORS:         sxtb16ge r2, r3, lsr #24
    314 @ CHECK-ERRORS:                          ^
    315 
    316         @ Out of range width for SBFX/UBFX
    317         sbfx r4, r5, #31, #2
    318         ubfxgt r4, r5, #16, #17
    319 
    320 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
    321 @ CHECK-ERRORS:         sbfx r4, r5, #31, #2
    322 @ CHECK-ERRORS:                           ^
    323 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
    324 @ CHECK-ERRORS:         ubfxgt r4, r5, #16, #17
    325 @ CHECK-ERRORS:                             ^
    326 
    327         @ Out of order Rt/Rt2 operands for ldrd
    328         ldrd  r4, r3, [r8]
    329         ldrd  r4, r3, [r8, #8]!
    330         ldrd  r4, r3, [r8], #8
    331 @ CHECK-ERRORS: error: destination operands must be sequential
    332 @ CHECK-ERRORS:         ldrd  r4, r3, [r8]
    333 @ CHECK-ERRORS:                   ^
    334 @ CHECK-ERRORS: error: destination operands must be sequential
    335 @ CHECK-ERRORS:         ldrd  r4, r3, [r8, #8]!
    336 @ CHECK-ERRORS:                   ^
    337 @ CHECK-ERRORS: error: destination operands must be sequential
    338 @ CHECK-ERRORS:         ldrd  r4, r3, [r8], #8
    339 @ CHECK-ERRORS:                   ^
    340 
    341 
    342         @ Bad register lists for VFP.
    343         vpush {s0, s3}
    344 @ CHECK-ERRORS: error: non-contiguous register range
    345 @ CHECK-ERRORS:         vpush {s0, s3}
    346 @ CHECK-ERRORS:                    ^
    347 
    348         @ Out of range coprocessor option immediate.
    349         ldc2 p2, c8, [r1], { 256 }
    350         ldc2 p2, c8, [r1], { -1 }
    351 
    352 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
    353 @ CHECK-ERRORS:         ldc2 p2, c8, [r1], { 256 }
    354 @ CHECK-ERRORS:                              ^
    355 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
    356 @ CHECK-ERRORS:         ldc2 p2, c8, [r1], { -1 }
    357 @ CHECK-ERRORS:                              ^
    358 
    359         @ Bad CPS instruction format.
    360         cps f,#1
    361 @ CHECK-ERRORS: error: invalid operand for instruction
    362 @ CHECK-ERRORS:         cps f,#1
    363 @ CHECK-ERRORS:               ^
    364 
    365         @ Bad operands for msr
    366         msr #0, #0
    367         msr foo, #0
    368 @ CHECK-ERRORS: error: invalid operand for instruction
    369 @ CHECK-ERRORS:         msr #0, #0
    370 @ CHECK-ERRORS:             ^
    371 @ CHECK-ERRORS: error: invalid operand for instruction
    372 @ CHECK-ERRORS:         msr foo, #0
    373 @ CHECK-ERRORS:             ^
    374