[ARM] In ARMAsmParser, MatchCoprocessorOperandName() permitted p10 and p11 as operand...
[oota-llvm.git] / test / MC / ARM / diagnostics.s
1 @ RUN: not llvm-mc -triple=armv7-apple-darwin < %s 2> %t
2 @ RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
3 @ RUN: not llvm-mc -triple=armv8 < %s 2> %t
4 @ RUN: FileCheck --check-prefix=CHECK-ERRORS-V8 < %t %s
5
6 @ Check for various assembly diagnostic messages on invalid input.
7
8 @ 's' bit on an instruction that can't accept it.
9         mlss r1, r2, r3, r4
10 @ CHECK-ERRORS: error: instruction 'mls' can not set flags,
11 @ CHECK-ERRORS: but 's' suffix specified
12
13
14         @ Out of range shift immediate values.
15         adc r1, r2, r3, lsl #invalid
16         adc r4, r5, r6, lsl #-1
17         adc r4, r5, r6, lsl #32
18         adc r4, r5, r6, lsr #-1
19         adc r4, r5, r6, lsr #33
20         adc r4, r5, r6, asr #-1
21         adc r4, r5, r6, asr #33
22         adc r4, r5, r6, ror #-1
23         adc r4, r5, r6, ror #32
24
25 @ CHECK-ERRORS: error: invalid immediate shift value
26 @ CHECK-ERRORS:         adc r1, r2, r3, lsl #invalid
27 @ CHECK-ERRORS:                              ^
28 @ CHECK-ERRORS: error: immediate shift value out of range
29 @ CHECK-ERRORS:         adc r4, r5, r6, lsl #-1
30 @ CHECK-ERRORS:                              ^
31 @ CHECK-ERRORS: error: immediate shift value out of range
32 @ CHECK-ERRORS:         adc r4, r5, r6, lsl #32
33 @ CHECK-ERRORS:                              ^
34 @ CHECK-ERRORS: error: immediate shift value out of range
35 @ CHECK-ERRORS:         adc r4, r5, r6, lsr #-1
36 @ CHECK-ERRORS:                              ^
37 @ CHECK-ERRORS: error: immediate shift value out of range
38 @ CHECK-ERRORS:         adc r4, r5, r6, lsr #33
39 @ CHECK-ERRORS:                              ^
40 @ CHECK-ERRORS: error: immediate shift value out of range
41 @ CHECK-ERRORS:         adc r4, r5, r6, asr #-1
42 @ CHECK-ERRORS:                              ^
43 @ CHECK-ERRORS: error: immediate shift value out of range
44 @ CHECK-ERRORS:         adc r4, r5, r6, asr #33
45 @ CHECK-ERRORS:                              ^
46 @ CHECK-ERRORS: error: immediate shift value out of range
47 @ CHECK-ERRORS:         adc r4, r5, r6, ror #-1
48 @ CHECK-ERRORS:                              ^
49 @ CHECK-ERRORS: error: immediate shift value out of range
50 @ CHECK-ERRORS:         adc r4, r5, r6, ror #32
51
52         @ Out of range shift immediate values for load/store.
53         str r1, [r2, r3, lsl #invalid]
54         ldr r4, [r5], r6, lsl #-1
55         pld r4, [r5, r6, lsl #32]
56         str r4, [r5], r6, lsr #-1
57         ldr r4, [r5, r6, lsr #33]
58         pld r4, [r5, r6, asr #-1]
59         str r4, [r5, r6, asr #33]
60         ldr r4, [r5, r6, ror #-1]
61         pld r4, [r5, r6, ror #32]
62         pld r4, [r5, r6, rrx #0]
63
64 @ CHECK-ERRORS: error: shift amount must be an immediate
65 @ CHECK-ERRORS:         str r1, [r2, r3, lsl #invalid]
66 @ CHECK-ERRORS:                              ^
67 @ CHECK-ERRORS: error: immediate shift value out of range
68 @ CHECK-ERRORS:         ldr r4, [r5], r6, lsl #-1
69 @ CHECK-ERRORS:                              ^
70 @ CHECK-ERRORS: error: immediate shift value out of range
71 @ CHECK-ERRORS:         pld r4, [r5, r6, lsl #32]
72 @ CHECK-ERRORS:                              ^
73 @ CHECK-ERRORS: error: immediate shift value out of range
74 @ CHECK-ERRORS:         str r4, [r5], r6, lsr #-1
75 @ CHECK-ERRORS:                              ^
76 @ CHECK-ERRORS: error: immediate shift value out of range
77 @ CHECK-ERRORS:         ldr r4, [r5, r6, lsr #33]
78 @ CHECK-ERRORS:                              ^
79 @ CHECK-ERRORS: error: immediate shift value out of range
80 @ CHECK-ERRORS:         pld r4, [r5, r6, asr #-1]
81 @ CHECK-ERRORS:                              ^
82 @ CHECK-ERRORS: error: immediate shift value out of range
83 @ CHECK-ERRORS:         str r4, [r5, r6, asr #33]
84 @ CHECK-ERRORS:                              ^
85 @ CHECK-ERRORS: error: immediate shift value out of range
86 @ CHECK-ERRORS:         ldr r4, [r5, r6, ror #-1]
87 @ CHECK-ERRORS:                              ^
88 @ CHECK-ERRORS: error: immediate shift value out of range
89 @ CHECK-ERRORS:         pld r4, [r5, r6, ror #32]
90 @ CHECK-ERRORS: error: ']' expected
91 @ CHECK-ERRORS:         pld r4, [r5, r6, rrx #0]
92         
93         @ Out of range 16-bit immediate on BKPT
94         bkpt #65536
95
96 @ CHECK-ERRORS: error: invalid operand for instruction
97
98         @ Out of range immediates for v8 HLT instruction.
99         hlt #65536
100         hlt #-1
101 @CHECK-ERRORS-V8: error: invalid operand for instruction
102 @CHECK-ERRORS-V8:         hlt #65536
103 @CHECK-ERRORS-V8:              ^
104 @CHECK-ERRORS-V8: error: invalid operand for instruction
105 @CHECK-ERRORS-V8:         hlt #-1
106 @CHECK-ERRORS-V8:              ^
107
108         @ Illegal condition code for v8 HLT instruction.
109         hlteq #2
110         hltlt #23
111 @CHECK-ERRORS-V8: error: instruction 'hlt' is not predicable, but condition code specified
112 @CHECK-ERRORS-V8:        hlteq #2
113 @CHECK-ERRORS-V8:        ^
114 @CHECK-ERRORS-V8: error: instruction 'hlt' is not predicable, but condition code specified
115 @CHECK-ERRORS-V8:        hltlt #23
116 @CHECK-ERRORS-V8:        ^
117
118         @ Out of range 4 and 3 bit immediates on CDP[2]
119
120         @ Out of range immediates for CDP/CDP2
121         cdp  p7, #2, c1, c1, c1, #8
122         cdp  p7, #1, c1, c1, c1, #8
123         cdp2  p7, #2, c1, c1, c1, #8
124         cdp2  p7, #1, c1, c1, c1, #8
125
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: invalid operand for instruction
130
131         @ Out of range immediates for DBG
132         dbg #-1
133         dbg #16
134
135 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
136 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
137 @  Double-check that we're synced up with the right diagnostics.
138 @ CHECK-ERRORS: dbg #16
139
140         @ Out of range immediate for MCR/MCR2/MCRR/MCRR2
141         mcr  p7, #8, r5, c1, c1, #4
142         mcr  p7, #2, r5, c1, c1, #8
143         mcr2  p7, #8, r5, c1, c1, #4
144         mcr2  p7, #1, r5, c1, c1, #8
145         mcrr  p7, #16, r5, r4, c1
146         mcrr2  p7, #16, r5, r4, c1
147 @ CHECK-ERRORS: error: invalid operand for instruction
148 @ CHECK-ERRORS: error: invalid operand for instruction
149 @ CHECK-ERRORS: error: invalid operand for instruction
150 @ CHECK-ERRORS: error: invalid operand for instruction
151 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
152 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
153
154         @ p10 and p11 are reserved for NEON
155         mcr p10, #2, r5, c1, c1, #4
156         mcrr p11, #8, r5, r4, c1
157 @ CHECK-ERRORS: error: invalid operand for instruction
158 @ CHECK-ERRORS: error: invalid operand for instruction
159
160         @ Out of range immediate for MOV
161         movw r9, 0x10000
162 @ CHECK-ERRORS: error: invalid operand for instruction
163
164         @ Invalid 's' bit usage for MOVW
165         movs r6, #0xffff
166         movwseq r9, #0xffff
167 @ CHECK-ERRORS: error: invalid operand for instruction
168 @ CHECK-ERRORS: error: instruction 'movw' can not set flags, but 's' suffix specified
169
170         @ Out of range immediate for MOVT
171         movt r9, 0x10000
172 @ CHECK-ERRORS: error: invalid operand for instruction
173
174         @ Out of range immediates for MRC/MRC2/MRRC/MRRC2
175         mrc  p14, #8, r1, c1, c2, #4
176         mrc  p14, #1, r1, c1, c2, #8
177         mrc2  p14, #8, r1, c1, c2, #4
178         mrc2  p14, #0, r1, c1, c2, #9
179         mrrc  p7, #16, r5, r4, c1
180         mrrc2  p7, #17, r5, r4, c1
181 @ CHECK-ERRORS: error: invalid operand for instruction
182 @ CHECK-ERRORS: error: invalid operand for instruction
183 @ CHECK-ERRORS: error: invalid operand for instruction
184 @ CHECK-ERRORS: error: invalid operand for instruction
185 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
186 @ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
187
188         @ Shifter operand validation for PKH instructions.
189         pkhbt r2, r2, r3, lsl #-1
190         pkhbt r2, r2, r3, lsl #32
191         pkhtb r2, r2, r3, asr #0
192         pkhtb r2, r2, r3, asr #33
193         pkhbt r2, r2, r3, asr #3
194         pkhtb r2, r2, r3, lsl #3
195
196 @ CHECK-ERRORS: error: immediate value out of range
197 @ CHECK-ERRORS:         pkhbt r2, r2, r3, lsl #-1
198 @ CHECK-ERRORS:                                ^
199 @ CHECK-ERRORS: error: immediate value out of range
200 @ CHECK-ERRORS:         pkhbt r2, r2, r3, lsl #32
201 @ CHECK-ERRORS:                                ^
202 @ CHECK-ERRORS: error: immediate value out of range
203 @ CHECK-ERRORS:         pkhtb r2, r2, r3, asr #0
204 @ CHECK-ERRORS:                                ^
205 @ CHECK-ERRORS: error: immediate value out of range
206 @ CHECK-ERRORS:         pkhtb r2, r2, r3, asr #33
207 @ CHECK-ERRORS:                                ^
208 @ CHECK-ERRORS: error: lsl operand expected.
209 @ CHECK-ERRORS:         pkhbt r2, r2, r3, asr #3
210 @ CHECK-ERRORS:                           ^
211 @ CHECK-ERRORS: error: asr operand expected.
212 @ CHECK-ERRORS:         pkhtb r2, r2, r3, lsl #3
213 @ CHECK-ERRORS:                           ^
214
215
216         @ bad values for SETEND
217         setendne be
218         setend me
219         setend 1
220
221 @ CHECK-ERRORS: error: instruction 'setend' is not predicable, but condition code specified
222 @ CHECK-ERRORS:         setendne be
223 @ CHECK-ERRORS:         ^
224 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
225 @ CHECK-ERRORS:         setend me
226 @ CHECK-ERRORS:                  ^
227 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
228 @ CHECK-ERRORS:         setend 1
229 @ CHECK-ERRORS:                ^
230
231
232         @ Out of range immediates and bad shift types for SSAT
233         ssat    r8, #0, r10, lsl #8
234         ssat    r8, #33, r10, lsl #8
235         ssat    r8, #1, r10, lsl #-1
236         ssat    r8, #1, r10, lsl #32
237         ssat    r8, #1, r10, asr #0
238         ssat    r8, #1, r10, asr #33
239         ssat    r8, #1, r10, lsr #5
240         ssat    r8, #1, r10, lsl fred
241         ssat    r8, #1, r10, lsl #fred
242
243 @ CHECK-ERRORS: error: invalid operand for instruction
244 @ CHECK-ERRORS:         ssat    r8, #0, r10, lsl #8
245 @ CHECK-ERRORS:                     ^
246 @ CHECK-ERRORS: error: invalid operand for instruction
247 @ CHECK-ERRORS:         ssat    r8, #33, r10, lsl #8
248 @ CHECK-ERRORS:                     ^
249 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
250 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl #-1
251 @ CHECK-ERRORS:                                   ^
252 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
253 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl #32
254 @ CHECK-ERRORS:                                   ^
255 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
256 @ CHECK-ERRORS:         ssat    r8, #1, r10, asr #0
257 @ CHECK-ERRORS:                                   ^
258 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
259 @ CHECK-ERRORS:         ssat    r8, #1, r10, asr #33
260 @ CHECK-ERRORS:                                   ^
261 @ CHECK-ERRORS: error: shift operator 'asr' or 'lsl' expected
262 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsr #5
263 @ CHECK-ERRORS:                              ^
264 @ CHECK-ERRORS: error: '#' expected
265 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl fred
266 @ CHECK-ERRORS:                                  ^
267 @ CHECK-ERRORS: error: shift amount must be an immediate
268 @ CHECK-ERRORS:         ssat    r8, #1, r10, lsl #fred
269 @ CHECK-ERRORS:                                   ^
270
271         @ Out of range immediates for SSAT16
272         ssat16  r2, #0, r7
273         ssat16  r3, #17, r5
274
275 @ CHECK-ERRORS: error: invalid operand for instruction
276 @ CHECK-ERRORS:         ssat16  r2, #0, r7
277 @ CHECK-ERRORS:                     ^
278 @ CHECK-ERRORS: error: invalid operand for instruction
279 @ CHECK-ERRORS:         ssat16  r3, #17, r5
280 @ CHECK-ERRORS:                     ^
281
282
283         @ Out of order STM registers
284         stmda sp!, {r5, r2}
285
286 @ CHECK-ERRORS: warning: register list not in ascending order
287 @ CHECK-ERRORS:         stmda     sp!, {r5, r2}
288 @ CHECK-ERRORS:                            ^
289
290
291         @ Out of range immediate on SVC
292         svc #0x1000000
293 @ CHECK-ERRORS: error: invalid operand for instruction
294 @ CHECK-ERRORS:   svc #0x1000000
295 @ CHECK-ERRORS:       ^
296
297
298         @ Out of order Rt/Rt2 operands for ldrexd/strexd
299         ldrexd  r4, r3, [r8]
300         strexd  r6, r5, r3, [r8]
301
302 @ CHECK-ERRORS: error: destination operands must be sequential
303 @ CHECK-ERRORS:         ldrexd  r4, r3, [r8]
304 @ CHECK-ERRORS:                     ^
305 @ CHECK-ERRORS: error: source operands must be sequential
306 @ CHECK-ERRORS:         strexd  r6, r5, r3, [r8]
307 @ CHECK-ERRORS:                         ^
308
309         @ Illegal rotate operators for extend instructions
310         sxtb r8, r3, #8
311         sxtb r8, r3, ror 24
312         sxtb r8, r3, ror #8 -
313         sxtab r3, r8, r3, ror #(fred - wilma)
314         sxtab r7, r8, r3, ror #25
315         sxtah r9, r3, r3, ror #-8
316         sxtb16ge r2, r3, lsr #24
317
318 @ CHECK-ERRORS: error: invalid operand for instruction
319 @ CHECK-ERRORS:         sxtb r8, r3, #8
320 @ CHECK-ERRORS:                      ^
321 @ CHECK-ERRORS: error: '#' expected
322 @ CHECK-ERRORS:         sxtb r8, r3, ror 24
323 @ CHECK-ERRORS:                          ^
324 @ CHECK-ERRORS: error: unknown token in expression
325 @ CHECK-ERRORS:         sxtb r8, r3, ror #8 -
326 @ CHECK-ERRORS:                              ^
327 @ CHECK-ERRORS: error: malformed rotate expression
328 @ CHECK-ERRORS:         sxtb r8, r3, ror #8 -
329 @ CHECK-ERRORS:                           ^
330 @ CHECK-ERRORS: error: rotate amount must be an immediate
331 @ CHECK-ERRORS:         sxtab r3, r8, r3, ror #(fred - wilma)
332 @ CHECK-ERRORS:                                ^
333 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
334 @ CHECK-ERRORS:         sxtab r7, r8, r3, ror #25
335 @ CHECK-ERRORS:                                ^
336 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
337 @ CHECK-ERRORS:         sxtah r9, r3, r3, ror #-8
338 @ CHECK-ERRORS:                                ^
339 @ CHECK-ERRORS: error: invalid operand for instruction
340 @ CHECK-ERRORS:         sxtb16ge r2, r3, lsr #24
341 @ CHECK-ERRORS:                          ^
342
343         @ Out of range width for SBFX/UBFX
344         sbfx r4, r5, #31, #2
345         ubfxgt r4, r5, #16, #17
346
347 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
348 @ CHECK-ERRORS:         sbfx r4, r5, #31, #2
349 @ CHECK-ERRORS:                           ^
350 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
351 @ CHECK-ERRORS:         ubfxgt r4, r5, #16, #17
352 @ CHECK-ERRORS:                             ^
353
354         @ Out of order Rt/Rt2 operands for ldrd
355         ldrd  r4, r3, [r8]
356         ldrd  r4, r3, [r8, #8]!
357         ldrd  r4, r3, [r8], #8
358 @ CHECK-ERRORS: error: destination operands must be sequential
359 @ CHECK-ERRORS:         ldrd  r4, r3, [r8]
360 @ CHECK-ERRORS:                   ^
361 @ CHECK-ERRORS: error: destination operands must be sequential
362 @ CHECK-ERRORS:         ldrd  r4, r3, [r8, #8]!
363 @ CHECK-ERRORS:                   ^
364 @ CHECK-ERRORS: error: destination operands must be sequential
365 @ CHECK-ERRORS:         ldrd  r4, r3, [r8], #8
366 @ CHECK-ERRORS:                   ^
367
368
369         @ Bad register lists for VFP.
370         vpush {s0, s3}
371 @ CHECK-ERRORS: error: non-contiguous register range
372 @ CHECK-ERRORS:         vpush {s0, s3}
373 @ CHECK-ERRORS:                    ^
374
375         @ Out of range coprocessor option immediate.
376         ldc2 p2, c8, [r1], { 256 }
377         ldc2 p2, c8, [r1], { -1 }
378
379 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
380 @ CHECK-ERRORS:         ldc2 p2, c8, [r1], { 256 }
381 @ CHECK-ERRORS:                              ^
382 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
383 @ CHECK-ERRORS:         ldc2 p2, c8, [r1], { -1 }
384 @ CHECK-ERRORS:                              ^
385
386         @ Bad CPS instruction format.
387         cps f,#1
388 @ CHECK-ERRORS: error: invalid operand for instruction
389 @ CHECK-ERRORS:         cps f,#1
390 @ CHECK-ERRORS:               ^
391
392         @ Bad operands for msr
393         msr #0, #0
394         msr foo, #0
395 @ CHECK-ERRORS: error: invalid operand for instruction
396 @ CHECK-ERRORS:         msr #0, #0
397 @ CHECK-ERRORS:             ^
398 @ CHECK-ERRORS: error: invalid operand for instruction
399 @ CHECK-ERRORS:         msr foo, #0
400 @ CHECK-ERRORS:             ^
401
402         isb #-1
403         isb #16
404 @ CHECK-ERRORS: error: immediate value out of range
405 @ CHECK-ERRORS: error: immediate value out of range
406
407         nop.n
408 @ CHECK-ERRORS: error: instruction with .n (narrow) qualifier not allowed in arm mode
409
410         dmbeq #5
411         dsble #15
412         isblo #7
413 @ CHECK-ERRORS: error: instruction 'dmb' is not predicable, but condition code specified
414 @ CHECK-ERRORS: error: instruction 'dsb' is not predicable, but condition code specified
415 @ CHECK-ERRORS: error: instruction 'isb' is not predicable, but condition code specified
416
417         dmblt
418         dsbne
419         isbeq
420 @ CHECK-ERRORS: error: instruction 'dmb' is not predicable, but condition code specified
421 @ CHECK-ERRORS: error: instruction 'dsb' is not predicable, but condition code specified
422 @ CHECK-ERRORS: error: instruction 'isb' is not predicable, but condition code specified
423
424         mcr2le  p7, #1, r5, c1, c1, #4
425         mcrr2ne p7, #15, r5, r4, c1
426         mrc2lo  p14, #0, r1, c1, c2, #4
427         mrrc2lo  p7, #1, r5, r4, c1
428         cdp2hi   p10, #0, c6, c12, c0, #7
429 @ CHECK-ERRORS: error: instruction 'mcr2' is not predicable, but condition code specified
430 @ CHECK-ERRORS: error: instruction 'mcrr2' is not predicable, but condition code specified
431 @ CHECK-ERRORS: error: instruction 'mrc2' is not predicable, but condition code specified
432 @ CHECK-ERRORS: error: instruction 'mrrc2' is not predicable, but condition code specified
433 @ CHECK-ERRORS: error: instruction 'cdp2' is not predicable, but condition code specified
434
435         bkpteq #7
436 @ CHECK-ERRORS: error: instruction 'bkpt' is not predicable, but condition code specified
437
438         ldm r2!, {r2, r3}
439         ldmdb r2!, {r2, r3}
440         ldmda r2!, {r2, r3}
441         popeq {sp}
442 @ CHECK-ERRORS: error: writeback register not allowed in register list
443 @ CHECK-ERRORS: error: writeback register not allowed in register list
444 @ CHECK-ERRORS: error: writeback register not allowed in register list
445 @ CHECK-ERRORS: error: writeback register not allowed in register list
446
447         vrintz.f32.f32 s0, s1
448         vrintr.f32 s0, s1
449         vrintx.f64.f64 d2, d5
450         vrintz.f64 d10, d9
451         vrinta.f32.f32 s6, s7
452         vrintn.f32 s8, s9
453         vrintp.f64.f64 d10, d11
454         vrintm.f64 d12, d13
455 @ CHECK-ERRORS: error: instruction requires: FPARMv8
456 @ CHECK-ERRORS: error: instruction requires: FPARMv8
457 @ CHECK-ERRORS: error: instruction requires: FPARMv8
458 @ CHECK-ERRORS: error: instruction requires: FPARMv8
459 @ CHECK-ERRORS: error: instruction requires: FPARMv8
460 @ CHECK-ERRORS: error: instruction requires: FPARMv8
461 @ CHECK-ERRORS: error: instruction requires: FPARMv8
462 @ CHECK-ERRORS: error: instruction requires: FPARMv8