Add AArch32 DCPS{1,2,3} and HLT instructions.
[oota-llvm.git] / test / MC / ARM / thumb-diagnostics.s
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 @ CHECK-ERRORS: error: registers must be in range r0-r7
61 @ CHECK-ERRORS:         ldm r2!, {r5, r8}
62 @ CHECK-ERRORS:                  ^
63 @ CHECK-ERRORS: error: writeback operator '!' expected
64 @ CHECK-ERRORS:         ldm r2, {r5, r7}
65 @ CHECK-ERRORS:             ^
66 @ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list
67 @ CHECK-ERRORS:         ldm r2!, {r2, r3, r4}
68 @ CHECK-ERRORS:               ^
69
70 @ Invalid writeback and register lists for PUSH/POP
71         pop {r1, r2, r10}
72         push {r8, r9}
73 @ CHECK-ERRORS: error: registers must be in range r0-r7 or pc
74 @ CHECK-ERRORS:         pop {r1, r2, r10}
75 @ CHECK-ERRORS:             ^
76 @ CHECK-ERRORS: error: registers must be in range r0-r7 or lr
77 @ CHECK-ERRORS:         push {r8, r9}
78 @ CHECK-ERRORS:              ^
79
80
81 @ Invalid writeback and register lists for STM
82         stm r1, {r2, r6}
83         stm r1!, {r2, r9}
84 @ CHECK-ERRORS: error: instruction requires: thumb2
85 @ CHECK-ERRORS:         stm r1, {r2, r6}
86 @ CHECK-ERRORS:         ^
87 @ CHECK-ERRORS: error: registers must be in range r0-r7
88 @ CHECK-ERRORS:         stm r1!, {r2, r9}
89 @ CHECK-ERRORS:                  ^
90
91 @ Out of range immediates for LSL instruction.
92         lsls r4, r5, #-1
93         lsls r4, r5, #32
94 @ CHECK-ERRORS: error: invalid operand for instruction
95 @ CHECK-ERRORS:         lsls r4, r5, #-1
96 @ CHECK-ERRORS:                      ^
97 @ CHECK-ERRORS: error: invalid operand for instruction
98 @ CHECK-ERRORS:         lsls r4, r5, #32
99 @ CHECK-ERRORS:                      ^
100
101 @ Mismatched source/destination operands for MUL instruction.
102         muls r1, r2, r3
103 @ CHECK-ERRORS: error: destination register must match source register
104 @ CHECK-ERRORS:         muls r1, r2, r3
105 @ CHECK-ERRORS:              ^
106
107
108 @ Out of range immediates for STR instruction.
109         str r2, [r7, #-1]
110         str r5, [r1, #3]
111         str r3, [r7, #128]
112 @ CHECK-ERRORS: error: instruction requires: thumb2
113 @ CHECK-ERRORS:         str r2, [r7, #-1]
114 @ CHECK-ERRORS:         ^
115 @ CHECK-ERRORS: error: instruction requires: thumb2
116 @ CHECK-ERRORS:         str r5, [r1, #3]
117 @ CHECK-ERRORS:         ^
118 @ CHECK-ERRORS: error: instruction requires: thumb2
119 @ CHECK-ERRORS:         str r3, [r7, #128]
120 @ CHECK-ERRORS:         ^
121
122 @ Out of range immediate for SVC instruction.
123         svc #-1
124         svc #256
125 @ CHECK-ERRORS: error: invalid operand for instruction
126 @ CHECK-ERRORS:         svc #-1
127 @ CHECK-ERRORS:             ^
128 @ CHECK-ERRORS: error: instruction requires: arm-mode
129 @ CHECK-ERRORS:         svc #256
130 @ CHECK-ERRORS:         ^
131
132
133 @ Out of range immediate for ADD SP instructions
134         add sp, #-1
135         add sp, #3
136         add sp, sp, #512
137         add r2, sp, #1024
138 @ CHECK-ERRORS: error: instruction requires: thumb2
139 @ CHECK-ERRORS:         add sp, #-1
140 @ CHECK-ERRORS:                 ^
141 @ CHECK-ERRORS: error: instruction requires: thumb2
142 @ CHECK-ERRORS:         add sp, #3
143 @ CHECK-ERRORS:                 ^
144 @ CHECK-ERRORS: error: instruction requires: thumb2
145 @ CHECK-ERRORS:         add sp, sp, #512
146 @ CHECK-ERRORS:                     ^
147 @ CHECK-ERRORS: error: instruction requires: arm-mode
148 @ CHECK-ERRORS:         add r2, sp, #1024
149 @ CHECK-ERRORS:         ^
150
151         add r2, sp, ip
152 @ CHECK-ERRORS: error: source register must be the same as destination
153 @ CHECK-ERRORS:         add r2, sp, ip
154 @ CHECK-ERRORS:                     ^
155
156
157 @------------------------------------------------------------------------------
158 @ B/Bcc - out of range immediates for Thumb1 branches
159 @------------------------------------------------------------------------------
160
161         beq    #-258
162         bne    #256
163         bgt    #13
164         b      #-1048578
165         b      #1048576
166         b      #10323
167
168 @ CHECK-ERRORS: error: Branch target out of range
169 @ CHECK-ERRORS: error: Branch target out of range
170 @ CHECK-ERRORS: error: Branch target out of range
171 @ CHECK-ERRORS: error: Branch target out of range
172 @ CHECK-ERRORS: error: Branch target out of range
173 @ CHECK-ERRORS: error: Branch target out of range
174
175 @------------------------------------------------------------------------------
176 @ WFE/WFI/YIELD - are not supported pre v6T2
177 @------------------------------------------------------------------------------
178         wfe
179         wfi
180         yield
181
182 @ CHECK-ERRORS: error: instruction requires: thumb2
183 @ CHECK-ERRORS: wfe
184 @ CHECK-ERRORS: ^
185 @ CHECK-ERRORS: error: instruction requires: thumb2
186 @ CHECK-ERRORS: wfi
187 @ CHECK-ERRORS: ^
188 @ CHECK-ERRORS: error: instruction requires: thumb2
189 @ CHECK-ERRORS: yield
190 @ CHECK-ERRORS: ^
191
192 @------------------------------------------------------------------------------
193 @ PLDW required mp-extensions
194 @------------------------------------------------------------------------------
195         pldw [r0, #4]
196 @ CHECK-ERRORS: error: instruction requires: mp-extensions
197
198 @------------------------------------------------------------------------------
199 @ LDR(lit) - invalid offsets
200 @------------------------------------------------------------------------------
201
202         ldr r4, [pc, #-12]
203 @ CHECK-ERRORS: error: instruction requires: thumb2
204