Produce an error for an invalid use of .symver.
[oota-llvm.git] / test / MC / ARM / neon-mul-accum-encoding.ll
1 ; RUN: llc -show-mc-encoding -march=arm -mcpu=cortex-a8 -mattr=+neon < %s | FileCheck %s
2
3 ; CHECK: vmla_8xi8
4 define <8 x i8> @vmla_8xi8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8> * %C) nounwind {
5         %tmp1 = load <8 x i8>* %A
6         %tmp2 = load <8 x i8>* %B
7         %tmp3 = load <8 x i8>* %C
8 ; CHECK: vmla.i8        d16, d18, d17           @ encoding: [0xa1,0x09,0x42,0xf2]
9         %tmp4 = mul <8 x i8> %tmp2, %tmp3
10         %tmp5 = add <8 x i8> %tmp1, %tmp4
11         ret <8 x i8> %tmp5
12 }
13
14 ; CHECK: vmla_4xi16
15 define <4 x i16> @vmla_4xi16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
16         %tmp1 = load <4 x i16>* %A
17         %tmp2 = load <4 x i16>* %B
18         %tmp3 = load <4 x i16>* %C
19 ; CHECK: vmla.i16       d16, d18, d17   @ encoding: [0xa1,0x09,0x52,0xf2]
20         %tmp4 = mul <4 x i16> %tmp2, %tmp3
21         %tmp5 = add <4 x i16> %tmp1, %tmp4
22         ret <4 x i16> %tmp5
23 }
24
25 ; CHECK: vmla_2xi32
26 define <2 x i32> @vmla_2xi32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
27         %tmp1 = load <2 x i32>* %A
28         %tmp2 = load <2 x i32>* %B
29         %tmp3 = load <2 x i32>* %C
30 ; CHECK: vmla.i32       d16, d18, d17   @ encoding: [0xa1,0x09,0x62,0xf2]
31         %tmp4 = mul <2 x i32> %tmp2, %tmp3
32         %tmp5 = add <2 x i32> %tmp1, %tmp4
33         ret <2 x i32> %tmp5
34 }
35
36 ; CHECK: vmla_2xfloat
37 define <2 x float> @vmla_2xfloat(<2 x float>* %A, <2 x float>* %B, <2 x float>* %C) nounwind {
38         %tmp1 = load <2 x float>* %A
39         %tmp2 = load <2 x float>* %B
40         %tmp3 = load <2 x float>* %C
41 ; CHECK: vmla.f32       d16, d18, d17   @ encoding: [0xb1,0x0d,0x42,0xf2]
42         %tmp4 = fmul <2 x float> %tmp2, %tmp3
43         %tmp5 = fadd <2 x float> %tmp1, %tmp4
44         ret <2 x float> %tmp5
45 }
46
47 ; CHECK: vmla_16xi8
48 define <16 x i8> @vmla_16xi8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8> * %C) nounwind {
49         %tmp1 = load <16 x i8>* %A
50         %tmp2 = load <16 x i8>* %B
51         %tmp3 = load <16 x i8>* %C
52 ; CHECK: vmla.i8        q9, q8, q10             @ encoding: [0xe4,0x29,0x40,0xf2]
53         %tmp4 = mul <16 x i8> %tmp2, %tmp3
54         %tmp5 = add <16 x i8> %tmp1, %tmp4
55         ret <16 x i8> %tmp5
56 }
57
58 ; CHECK: vmla_8xi16
59 define <8 x i16> @vmla_8xi16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
60         %tmp1 = load <8 x i16>* %A
61         %tmp2 = load <8 x i16>* %B
62         %tmp3 = load <8 x i16>* %C
63 ; CHECK: vmla.i16       q9, q8, q10     @ encoding: [0xe4,0x29,0x50,0xf2]
64         %tmp4 = mul <8 x i16> %tmp2, %tmp3
65         %tmp5 = add <8 x i16> %tmp1, %tmp4
66         ret <8 x i16> %tmp5
67 }
68
69 ; CHECK: vmla_4xi32
70 define <4 x i32> @vmla_4xi32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
71         %tmp1 = load <4 x i32>* %A
72         %tmp2 = load <4 x i32>* %B
73         %tmp3 = load <4 x i32>* %C
74 ; CHECK: vmla.i32       q9, q8, q10     @ encoding: [0xe4,0x29,0x60,0xf2]
75         %tmp4 = mul <4 x i32> %tmp2, %tmp3
76         %tmp5 = add <4 x i32> %tmp1, %tmp4
77         ret <4 x i32> %tmp5
78 }
79
80 ; CHECK: vmla_4xfloat
81 define <4 x float> @vmla_4xfloat(<4 x float>* %A, <4 x float>* %B, <4 x float>* %C) nounwind {
82         %tmp1 = load <4 x float>* %A
83         %tmp2 = load <4 x float>* %B
84         %tmp3 = load <4 x float>* %C
85 ; CHECK: vmla.f32       q9, q8, q10     @ encoding: [0xf4,0x2d,0x40,0xf2]
86         %tmp4 = fmul <4 x float> %tmp2, %tmp3
87         %tmp5 = fadd <4 x float> %tmp1, %tmp4
88         ret <4 x float> %tmp5
89 }
90
91 ; CHECK: vmlals_8xi8
92 define <8 x i16> @vmlals_8xi8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
93         %tmp1 = load <8 x i16>* %A
94         %tmp2 = load <8 x i8>* %B
95         %tmp3 = load <8 x i8>* %C
96         %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
97         %tmp5 = sext <8 x i8> %tmp3 to <8 x i16>
98 ; CHECK: vmlal.s8       q8, d19, d18    @ encoding: [0xa2,0x08,0xc3,0xf2]
99         %tmp6 = mul <8 x i16> %tmp4, %tmp5
100         %tmp7 = add <8 x i16> %tmp1, %tmp6
101         ret <8 x i16> %tmp7
102 }
103
104 ; CHECK: vmlals_4xi16
105 define <4 x i32> @vmlals_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
106         %tmp1 = load <4 x i32>* %A
107         %tmp2 = load <4 x i16>* %B
108         %tmp3 = load <4 x i16>* %C
109         %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
110         %tmp5 = sext <4 x i16> %tmp3 to <4 x i32>
111 ; CHECK: vmlal.s16      q8, d19, d18    @ encoding: [0xa2,0x08,0xd3,0xf2]
112         %tmp6 = mul <4 x i32> %tmp4, %tmp5
113         %tmp7 = add <4 x i32> %tmp1, %tmp6
114         ret <4 x i32> %tmp7
115 }
116
117 ; CHECK: vmlals_2xi32
118 define <2 x i64> @vmlals_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
119         %tmp1 = load <2 x i64>* %A
120         %tmp2 = load <2 x i32>* %B
121         %tmp3 = load <2 x i32>* %C
122         %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
123         %tmp5 = sext <2 x i32> %tmp3 to <2 x i64>
124 ; CHECK: vmlal.s32      q8, d19, d18    @ encoding: [0xa2,0x08,0xe3,0xf2]
125         %tmp6 = mul <2 x i64> %tmp4, %tmp5
126         %tmp7 = add <2 x i64> %tmp1, %tmp6
127         ret <2 x i64> %tmp7
128 }
129
130 ; CHECK: vmlalu_8xi8
131 define <8 x i16> @vmlalu_8xi8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
132         %tmp1 = load <8 x i16>* %A
133         %tmp2 = load <8 x i8>* %B
134         %tmp3 = load <8 x i8>* %C
135         %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
136         %tmp5 = zext <8 x i8> %tmp3 to <8 x i16>
137 ; CHECK: vmlal.u8       q8, d19, d18    @ encoding: [0xa2,0x08,0xc3,0xf3]
138         %tmp6 = mul <8 x i16> %tmp4, %tmp5
139         %tmp7 = add <8 x i16> %tmp1, %tmp6
140         ret <8 x i16> %tmp7
141 }
142
143 ; CHECK: vmlalu_4xi16
144 define <4 x i32> @vmlalu_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
145         %tmp1 = load <4 x i32>* %A
146         %tmp2 = load <4 x i16>* %B
147         %tmp3 = load <4 x i16>* %C
148         %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
149         %tmp5 = zext <4 x i16> %tmp3 to <4 x i32>
150 ; CHECK: vmlal.u16      q8, d19, d18    @ encoding: [0xa2,0x08,0xd3,0xf3]
151         %tmp6 = mul <4 x i32> %tmp4, %tmp5
152         %tmp7 = add <4 x i32> %tmp1, %tmp6
153         ret <4 x i32> %tmp7
154 }
155
156 ; CHECK: vmlalu_2xi32
157 define <2 x i64> @vmlalu_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
158         %tmp1 = load <2 x i64>* %A
159         %tmp2 = load <2 x i32>* %B
160         %tmp3 = load <2 x i32>* %C
161         %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
162         %tmp5 = zext <2 x i32> %tmp3 to <2 x i64>
163 ; CHECK: vmlal.u32      q8, d19, d18    @ encoding: [0xa2,0x08,0xe3,0xf3]
164         %tmp6 = mul <2 x i64> %tmp4, %tmp5
165         %tmp7 = add <2 x i64> %tmp1, %tmp6
166         ret <2 x i64> %tmp7
167 }
168
169 declare <4 x i32>  @llvm.arm.neon.vqdmlal.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
170 declare <2 x i64>  @llvm.arm.neon.vqdmlal.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
171
172 ; CHECK: vqdmlal_4xi16
173 define <4 x i32> @vqdmlal_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
174         %tmp1 = load <4 x i32>* %A
175         %tmp2 = load <4 x i16>* %B
176         %tmp3 = load <4 x i16>* %C
177 ; CHECK: vqdmlal.s16    q8, d19, d18    @ encoding: [0xa2,0x09,0xd3,0xf2
178         %tmp4 = call <4 x i32> @llvm.arm.neon.vqdmlal.v4i32(<4 x i32> %tmp1, <4 x i16> %tmp2, <4 x i16> %tmp3)
179         ret <4 x i32> %tmp4
180 }
181
182 ; CHECK: vqdmlal_2xi32
183 define <2 x i64> @vqdmlal_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
184         %tmp1 = load <2 x i64>* %A
185         %tmp2 = load <2 x i32>* %B
186         %tmp3 = load <2 x i32>* %C
187 ; CHECK: vqdmlal.s32    q8, d19, d18    @ encoding: [0xa2,0x09,0xe3,0xf2]
188         %tmp4 = call <2 x i64> @llvm.arm.neon.vqdmlal.v2i64(<2 x i64> %tmp1, <2 x i32> %tmp2, <2 x i32> %tmp3)
189         ret <2 x i64> %tmp4
190 }
191
192 ; CHECK: vmls_8xi8
193 define <8 x i8> @vmls_8xi8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8> * %C) nounwind {
194         %tmp1 = load <8 x i8>* %A
195         %tmp2 = load <8 x i8>* %B
196         %tmp3 = load <8 x i8>* %C
197 ; CHECK: vmls.i8        d16, d18, d17           @ encoding: [0xa1,0x09,0x42,0xf3]
198         %tmp4 = mul <8 x i8> %tmp2, %tmp3
199         %tmp5 = sub <8 x i8> %tmp1, %tmp4
200         ret <8 x i8> %tmp5
201 }
202
203 ; CHECK: vmls_4xi16
204 define <4 x i16> @vmls_4xi16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
205         %tmp1 = load <4 x i16>* %A
206         %tmp2 = load <4 x i16>* %B
207         %tmp3 = load <4 x i16>* %C
208 ; CHECK: vmls.i16       d16, d18, d17   @ encoding: [0xa1,0x09,0x52,0xf3]
209         %tmp4 = mul <4 x i16> %tmp2, %tmp3
210         %tmp5 = sub <4 x i16> %tmp1, %tmp4
211         ret <4 x i16> %tmp5
212 }
213
214 ; CHECK: vmls_2xi32
215 define <2 x i32> @vmls_2xi32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
216         %tmp1 = load <2 x i32>* %A
217         %tmp2 = load <2 x i32>* %B
218         %tmp3 = load <2 x i32>* %C
219 ; CHECK: vmls.i32       d16, d18, d17   @ encoding: [0xa1,0x09,0x62,0xf3]
220         %tmp4 = mul <2 x i32> %tmp2, %tmp3
221         %tmp5 = sub <2 x i32> %tmp1, %tmp4
222         ret <2 x i32> %tmp5
223 }
224
225 ; CHECK: vmls_2xfloat
226 define <2 x float> @vmls_2xfloat(<2 x float>* %A, <2 x float>* %B, <2 x float>* %C) nounwind {
227         %tmp1 = load <2 x float>* %A
228         %tmp2 = load <2 x float>* %B
229         %tmp3 = load <2 x float>* %C
230 ; CHECK: vmls.f32       d16, d18, d17   @ encoding: [0xb1,0x0d,0x62,0xf2]
231         %tmp4 = fmul <2 x float> %tmp2, %tmp3
232         %tmp5 = fsub <2 x float> %tmp1, %tmp4
233         ret <2 x float> %tmp5
234 }
235
236 ; CHECK: vmls_16xi8
237 define <16 x i8> @vmls_16xi8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8> * %C) nounwind {
238         %tmp1 = load <16 x i8>* %A
239         %tmp2 = load <16 x i8>* %B
240         %tmp3 = load <16 x i8>* %C
241 ; CHECK: vmls.i8        q9, q8, q10             @ encoding: [0xe4,0x29,0x40,0xf3]
242         %tmp4 = mul <16 x i8> %tmp2, %tmp3
243         %tmp5 = sub <16 x i8> %tmp1, %tmp4
244         ret <16 x i8> %tmp5
245 }
246
247 ; CHECK: vmls_8xi16
248 define <8 x i16> @vmls_8xi16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
249         %tmp1 = load <8 x i16>* %A
250         %tmp2 = load <8 x i16>* %B
251         %tmp3 = load <8 x i16>* %C
252 ; CHECK: vmls.i16       q9, q8, q10     @ encoding: [0xe4,0x29,0x50,0xf3]
253         %tmp4 = mul <8 x i16> %tmp2, %tmp3
254         %tmp5 = sub <8 x i16> %tmp1, %tmp4
255         ret <8 x i16> %tmp5
256 }
257
258 ; CHECK: vmls_4xi32
259 define <4 x i32> @vmls_4xi32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
260         %tmp1 = load <4 x i32>* %A
261         %tmp2 = load <4 x i32>* %B
262         %tmp3 = load <4 x i32>* %C
263 ; CHECK: vmls.i32       q9, q8, q10     @ encoding: [0xe4,0x29,0x60,0xf3]
264         %tmp4 = mul <4 x i32> %tmp2, %tmp3
265         %tmp5 = sub <4 x i32> %tmp1, %tmp4
266         ret <4 x i32> %tmp5
267 }
268
269 ; CHECK: vmls_4xfloat
270 define <4 x float> @vmls_4xfloat(<4 x float>* %A, <4 x float>* %B, <4 x float>* %C) nounwind {
271         %tmp1 = load <4 x float>* %A
272         %tmp2 = load <4 x float>* %B
273         %tmp3 = load <4 x float>* %C
274 ; CHECK: vmls.f32       q9, q8, q10     @ encoding: [0xf4,0x2d,0x60,0xf2]
275         %tmp4 = fmul <4 x float> %tmp2, %tmp3
276         %tmp5 = fsub <4 x float> %tmp1, %tmp4
277         ret <4 x float> %tmp5
278 }
279
280 ; CHECK: vmlsls_8xi8
281 define <8 x i16> @vmlsls_8xi8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
282         %tmp1 = load <8 x i16>* %A
283         %tmp2 = load <8 x i8>* %B
284         %tmp3 = load <8 x i8>* %C
285         %tmp4 = sext <8 x i8> %tmp2 to <8 x i16>
286         %tmp5 = sext <8 x i8> %tmp3 to <8 x i16>
287 ; CHECK: vmlsl.s8       q8, d19, d18    @ encoding: [0xa2,0x0a,0xc3,0xf2]
288         %tmp6 = mul <8 x i16> %tmp4, %tmp5
289         %tmp7 = sub <8 x i16> %tmp1, %tmp6
290         ret <8 x i16> %tmp7
291 }
292
293 ; CHECK: vmlsls_4xi16
294 define <4 x i32> @vmlsls_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
295         %tmp1 = load <4 x i32>* %A
296         %tmp2 = load <4 x i16>* %B
297         %tmp3 = load <4 x i16>* %C
298         %tmp4 = sext <4 x i16> %tmp2 to <4 x i32>
299         %tmp5 = sext <4 x i16> %tmp3 to <4 x i32>
300 ; CHECK: vmlsl.s16      q8, d19, d18    @ encoding: [0xa2,0x0a,0xd3,0xf2]
301         %tmp6 = mul <4 x i32> %tmp4, %tmp5
302         %tmp7 = sub <4 x i32> %tmp1, %tmp6
303         ret <4 x i32> %tmp7
304 }
305
306 ; CHECK: vmlsls_2xi32
307 define <2 x i64> @vmlsls_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
308         %tmp1 = load <2 x i64>* %A
309         %tmp2 = load <2 x i32>* %B
310         %tmp3 = load <2 x i32>* %C
311         %tmp4 = sext <2 x i32> %tmp2 to <2 x i64>
312         %tmp5 = sext <2 x i32> %tmp3 to <2 x i64>
313 ; CHECK: vmlsl.s32      q8, d19, d18    @ encoding: [0xa2,0x0a,0xe3,0xf2]
314         %tmp6 = mul <2 x i64> %tmp4, %tmp5
315         %tmp7 = sub <2 x i64> %tmp1, %tmp6
316         ret <2 x i64> %tmp7
317 }
318
319 ; CHECK: vmlslu_8xi8
320 define <8 x i16> @vmlslu_8xi8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
321         %tmp1 = load <8 x i16>* %A
322         %tmp2 = load <8 x i8>* %B
323         %tmp3 = load <8 x i8>* %C
324         %tmp4 = zext <8 x i8> %tmp2 to <8 x i16>
325         %tmp5 = zext <8 x i8> %tmp3 to <8 x i16>
326 ; CHECK: vmlsl.u8       q8, d19, d18    @ encoding: [0xa2,0x0a,0xc3,0xf3]
327         %tmp6 = mul <8 x i16> %tmp4, %tmp5
328         %tmp7 = sub <8 x i16> %tmp1, %tmp6
329         ret <8 x i16> %tmp7
330 }
331
332 ; CHECK: vmlslu_4xi16
333 define <4 x i32> @vmlslu_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
334         %tmp1 = load <4 x i32>* %A
335         %tmp2 = load <4 x i16>* %B
336         %tmp3 = load <4 x i16>* %C
337         %tmp4 = zext <4 x i16> %tmp2 to <4 x i32>
338 ; CHECK: vmlsl.u16      q8, d19, d18    @ encoding: [0xa2,0x0a,0xd3,0xf3]
339         %tmp5 = zext <4 x i16> %tmp3 to <4 x i32>
340         %tmp6 = mul <4 x i32> %tmp4, %tmp5
341         %tmp7 = sub <4 x i32> %tmp1, %tmp6
342         ret <4 x i32> %tmp7
343 }
344
345 ; CHECK: vmlslu_2xi32
346 define <2 x i64> @vmlslu_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
347         %tmp1 = load <2 x i64>* %A
348         %tmp2 = load <2 x i32>* %B
349         %tmp3 = load <2 x i32>* %C
350         %tmp4 = zext <2 x i32> %tmp2 to <2 x i64>
351         %tmp5 = zext <2 x i32> %tmp3 to <2 x i64>
352 ; CHECK: vmlsl.u32      q8, d19, d18    @ encoding: [0xa2,0x0a,0xe3,0xf3]
353         %tmp6 = mul <2 x i64> %tmp4, %tmp5
354         %tmp7 = sub <2 x i64> %tmp1, %tmp6
355         ret <2 x i64> %tmp7
356 }
357
358 declare <4 x i32>  @llvm.arm.neon.vqdmlsl.v4i32(<4 x i32>, <4 x i16>, <4 x i16>) nounwind readnone
359 declare <2 x i64>  @llvm.arm.neon.vqdmlsl.v2i64(<2 x i64>, <2 x i32>, <2 x i32>) nounwind readnone
360
361 ; CHECK: vqdmlsl_4xi16
362 define <4 x i32> @vqdmlsl_4xi16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
363         %tmp1 = load <4 x i32>* %A
364         %tmp2 = load <4 x i16>* %B
365         %tmp3 = load <4 x i16>* %C
366 ; CHECK: vqdmlsl.s16    q8, d19, d18    @ encoding: [0xa2,0x0b,0xd3,0xf2]
367         %tmp4 = call <4 x i32> @llvm.arm.neon.vqdmlsl.v4i32(<4 x i32> %tmp1, <4 x i16> %tmp2, <4 x i16> %tmp3)
368         ret <4 x i32> %tmp4
369 }
370
371 ; CHECK: vqdmlsl_2xi32
372 define <2 x i64> @vqdmlsl_2xi32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
373         %tmp1 = load <2 x i64>* %A
374         %tmp2 = load <2 x i32>* %B
375         %tmp3 = load <2 x i32>* %C
376 ; CHECK: vqdmlsl.s32    q8, d19, d18    @ encoding: [0xa2,0x0b,0xe3,0xf2]
377         %tmp4 = call <2 x i64> @llvm.arm.neon.vqdmlsl.v2i64(<2 x i64> %tmp1, <2 x i32> %tmp2, <2 x i32> %tmp3)
378         ret <2 x i64> %tmp4
379 }