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
375        isb #-1
376        isb #16
377@ CHECK-ERRORS: error: immediate value out of range
378@ CHECK-ERRORS: error: immediate value out of range
379
380        nop.n
381@ CHECK-ERRORS: error: instruction with .n (narrow) qualifier not allowed in arm mode
382
383	dmbeq #5
384	dsble #15
385	isblo #7
386@ CHECK-ERRORS: error: instruction 'dmb' is not predicable, but condition code specified
387@ CHECK-ERRORS: error: instruction 'dsb' is not predicable, but condition code specified
388@ CHECK-ERRORS: error: instruction 'isb' is not predicable, but condition code specified
389
390	dmblt
391	dsbne
392	isbeq
393@ CHECK-ERRORS: error: instruction 'dmb' is not predicable, but condition code specified
394@ CHECK-ERRORS: error: instruction 'dsb' is not predicable, but condition code specified
395@ CHECK-ERRORS: error: instruction 'isb' is not predicable, but condition code specified
396
397        mcr2le  p7, #1, r5, c1, c1, #4
398        mcrr2ne p7, #15, r5, r4, c1
399        mrc2lo  p14, #0, r1, c1, c2, #4
400        mrrc2lo  p7, #1, r5, r4, c1
401        cdp2hi   p10, #0, c6, c12, c0, #7
402@ CHECK-ERRORS: error: instruction 'mcr2' is not predicable, but condition code specified
403@ CHECK-ERRORS: error: instruction 'mcrr2' is not predicable, but condition code specified
404@ CHECK-ERRORS: error: instruction 'mrc2' is not predicable, but condition code specified
405@ CHECK-ERRORS: error: instruction 'mrrc2' is not predicable, but condition code specified
406@ CHECK-ERRORS: error: instruction 'cdp2' is not predicable, but condition code specified
407
408        bkpteq #7
409@ CHECK-ERRORS: error: instruction 'bkpt' is not predicable, but condition code specified
410