1 @ RUN: not llvm-mc -triple=armv7-apple-darwin < %s 2> %t
2 @ RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
4 @ Check for various assembly diagnostic messages on invalid input.
6 @ 's' bit on an instruction that can't accept it.
8 @ CHECK-ERRORS: error: instruction 'mls' can not set flags,
9 @ CHECK-ERRORS: but 's' suffix specified
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
23 @ CHECK-ERRORS: error: invalid immediate shift value
24 @ CHECK-ERRORS: adc r1, r2, r3, lsl #invalid
26 @ CHECK-ERRORS: error: immediate shift value out of range
27 @ CHECK-ERRORS: adc r4, r5, r6, lsl #-1
29 @ CHECK-ERRORS: error: immediate shift value out of range
30 @ CHECK-ERRORS: adc r4, r5, r6, lsl #32
32 @ CHECK-ERRORS: error: immediate shift value out of range
33 @ CHECK-ERRORS: adc r4, r5, r6, lsr #-1
35 @ CHECK-ERRORS: error: immediate shift value out of range
36 @ CHECK-ERRORS: adc r4, r5, r6, lsr #33
38 @ CHECK-ERRORS: error: immediate shift value out of range
39 @ CHECK-ERRORS: adc r4, r5, r6, asr #-1
41 @ CHECK-ERRORS: error: immediate shift value out of range
42 @ CHECK-ERRORS: adc r4, r5, r6, asr #33
44 @ CHECK-ERRORS: error: immediate shift value out of range
45 @ CHECK-ERRORS: adc r4, r5, r6, ror #-1
47 @ CHECK-ERRORS: error: immediate shift value out of range
48 @ CHECK-ERRORS: adc r4, r5, r6, ror #32
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]
62 @ CHECK-ERRORS: error: shift amount must be an immediate
63 @ CHECK-ERRORS: str r1, [r2, r3, lsl #invalid]
65 @ CHECK-ERRORS: error: immediate shift value out of range
66 @ CHECK-ERRORS: ldr r4, [r5], r6, lsl #-1
68 @ CHECK-ERRORS: error: immediate shift value out of range
69 @ CHECK-ERRORS: pld r4, [r5, r6, lsl #32]
71 @ CHECK-ERRORS: error: immediate shift value out of range
72 @ CHECK-ERRORS: str r4, [r5], r6, lsr #-1
74 @ CHECK-ERRORS: error: immediate shift value out of range
75 @ CHECK-ERRORS: ldr r4, [r5, r6, lsr #33]
77 @ CHECK-ERRORS: error: immediate shift value out of range
78 @ CHECK-ERRORS: pld r4, [r5, r6, asr #-1]
80 @ CHECK-ERRORS: error: immediate shift value out of range
81 @ CHECK-ERRORS: str r4, [r5, r6, asr #33]
83 @ CHECK-ERRORS: error: immediate shift value out of range
84 @ CHECK-ERRORS: ldr r4, [r5, r6, ror #-1]
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]
91 @ Out of range 16-bit immediate on BKPT
94 @ CHECK-ERRORS: error: invalid operand for instruction
96 @ Out of range 4 and 3 bit immediates on CDP[2]
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
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
109 @ Out of range immediates for DBG
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
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]
133 @ Out of range immediate for MOV
135 @ CHECK-ERRORS: error: invalid operand for instruction
137 @ Invalid 's' bit usage for MOVW
140 @ CHECK-ERRORS: error: invalid operand for instruction
141 @ CHECK-ERRORS: error: instruction 'movw' can not set flags, but 's' suffix specified
143 @ Out of range immediate for MOVT
145 @ CHECK-ERRORS: error: invalid operand for instruction
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]
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
169 @ CHECK-ERRORS: error: immediate value out of range
170 @ CHECK-ERRORS: pkhbt r2, r2, r3, lsl #-1
172 @ CHECK-ERRORS: error: immediate value out of range
173 @ CHECK-ERRORS: pkhbt r2, r2, r3, lsl #32
175 @ CHECK-ERRORS: error: immediate value out of range
176 @ CHECK-ERRORS: pkhtb r2, r2, r3, asr #0
178 @ CHECK-ERRORS: error: immediate value out of range
179 @ CHECK-ERRORS: pkhtb r2, r2, r3, asr #33
181 @ CHECK-ERRORS: error: lsl operand expected.
182 @ CHECK-ERRORS: pkhbt r2, r2, r3, asr #3
184 @ CHECK-ERRORS: error: asr operand expected.
185 @ CHECK-ERRORS: pkhtb r2, r2, r3, lsl #3
189 @ bad values for SETEND
194 @ CHECK-ERRORS: error: instruction 'setend' is not predicable, but condition code specified
195 @ CHECK-ERRORS: setendne be
197 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
198 @ CHECK-ERRORS: setend me
200 @ CHECK-ERRORS: error: 'be' or 'le' operand expected
201 @ CHECK-ERRORS: setend 1
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
216 @ CHECK-ERRORS: error: invalid operand for instruction
217 @ CHECK-ERRORS: ssat r8, #0, r10, lsl #8
219 @ CHECK-ERRORS: error: invalid operand for instruction
220 @ CHECK-ERRORS: ssat r8, #33, r10, lsl #8
222 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
223 @ CHECK-ERRORS: ssat r8, #1, r10, lsl #-1
225 @ CHECK-ERRORS: error: 'lsr' shift amount must be in range [0,31]
226 @ CHECK-ERRORS: ssat r8, #1, r10, lsl #32
228 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
229 @ CHECK-ERRORS: ssat r8, #1, r10, asr #0
231 @ CHECK-ERRORS: error: 'asr' shift amount must be in range [1,32]
232 @ CHECK-ERRORS: ssat r8, #1, r10, asr #33
234 @ CHECK-ERRORS: error: shift operator 'asr' or 'lsl' expected
235 @ CHECK-ERRORS: ssat r8, #1, r10, lsr #5
237 @ CHECK-ERRORS: error: '#' expected
238 @ CHECK-ERRORS: ssat r8, #1, r10, lsl fred
240 @ CHECK-ERRORS: error: shift amount must be an immediate
241 @ CHECK-ERRORS: ssat r8, #1, r10, lsl #fred
244 @ Out of range immediates for SSAT16
248 @ CHECK-ERRORS: error: invalid operand for instruction
249 @ CHECK-ERRORS: ssat16 r2, #0, r7
251 @ CHECK-ERRORS: error: invalid operand for instruction
252 @ CHECK-ERRORS: ssat16 r3, #17, r5
256 @ Out of order STM registers
259 @ CHECK-ERRORS: warning: register list not in ascending order
260 @ CHECK-ERRORS: stmda sp!, {r5, r2}
264 @ Out of range immediate on SVC
266 @ CHECK-ERRORS: error: invalid operand for instruction
267 @ CHECK-ERRORS: svc #0x1000000
271 @ Out of order Rt/Rt2 operands for ldrexd/strexd
273 strexd r6, r5, r3, [r8]
275 @ CHECK-ERRORS: error: destination operands must be sequential
276 @ CHECK-ERRORS: ldrexd r4, r3, [r8]
278 @ CHECK-ERRORS: error: source operands must be sequential
279 @ CHECK-ERRORS: strexd r6, r5, r3, [r8]
282 @ Illegal rotate operators for extend instructions
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
291 @ CHECK-ERRORS: error: invalid operand for instruction
292 @ CHECK-ERRORS: sxtb r8, r3, #8
294 @ CHECK-ERRORS: error: '#' expected
295 @ CHECK-ERRORS: sxtb r8, r3, ror 24
297 @ CHECK-ERRORS: error: unknown token in expression
298 @ CHECK-ERRORS: sxtb r8, r3, ror #8 -
300 @ CHECK-ERRORS: error: malformed rotate expression
301 @ CHECK-ERRORS: sxtb r8, r3, ror #8 -
303 @ CHECK-ERRORS: error: rotate amount must be an immediate
304 @ CHECK-ERRORS: sxtab r3, r8, r3, ror #(fred - wilma)
306 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
307 @ CHECK-ERRORS: sxtab r7, r8, r3, ror #25
309 @ CHECK-ERRORS: error: 'ror' rotate amount must be 8, 16, or 24
310 @ CHECK-ERRORS: sxtah r9, r3, r3, ror #-8
312 @ CHECK-ERRORS: error: invalid operand for instruction
313 @ CHECK-ERRORS: sxtb16ge r2, r3, lsr #24
316 @ Out of range width for SBFX/UBFX
318 ubfxgt r4, r5, #16, #17
320 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
321 @ CHECK-ERRORS: sbfx r4, r5, #31, #2
323 @ CHECK-ERRORS: error: bitfield width must be in range [1,32-lsb]
324 @ CHECK-ERRORS: ubfxgt r4, r5, #16, #17
327 @ Out of order Rt/Rt2 operands for ldrd
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]
334 @ CHECK-ERRORS: error: destination operands must be sequential
335 @ CHECK-ERRORS: ldrd r4, r3, [r8, #8]!
337 @ CHECK-ERRORS: error: destination operands must be sequential
338 @ CHECK-ERRORS: ldrd r4, r3, [r8], #8
342 @ Bad register lists for VFP.
344 @ CHECK-ERRORS: error: non-contiguous register range
345 @ CHECK-ERRORS: vpush {s0, s3}
348 @ Out of range coprocessor option immediate.
349 ldc2 p2, c8, [r1], { 256 }
350 ldc2 p2, c8, [r1], { -1 }
352 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
353 @ CHECK-ERRORS: ldc2 p2, c8, [r1], { 256 }
355 @ CHECK-ERRORS: error: coprocessor option must be an immediate in range [0, 255]
356 @ CHECK-ERRORS: ldc2 p2, c8, [r1], { -1 }
359 @ Bad CPS instruction format.
361 @ CHECK-ERRORS: error: invalid operand for instruction
362 @ CHECK-ERRORS: cps f,#1
365 @ Bad operands for msr
368 @ CHECK-ERRORS: error: invalid operand for instruction
369 @ CHECK-ERRORS: msr #0, #0
371 @ CHECK-ERRORS: error: invalid operand for instruction
372 @ CHECK-ERRORS: msr foo, #0
377 @ CHECK-ERRORS: error: immediate value out of range
378 @ CHECK-ERRORS: error: immediate value out of range
381 @ CHECK-ERRORS: error: instruction with .n (narrow) qualifier not allowed in arm mode