1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
4 define arm_aapcs_vfpcc <8 x i16> @vmovn32_trunc1(<4 x i32> %src1, <4 x i32> %src2) {
5 ; CHECK-LABEL: vmovn32_trunc1:
6 ; CHECK: @ %bb.0: @ %entry
7 ; CHECK-NEXT: vmov q2, q0
8 ; CHECK-NEXT: vmov r0, s8
9 ; CHECK-NEXT: vmov.16 q0[0], r0
10 ; CHECK-NEXT: vmov r0, s4
11 ; CHECK-NEXT: vmov.16 q0[1], r0
12 ; CHECK-NEXT: vmov r0, s9
13 ; CHECK-NEXT: vmov.16 q0[2], r0
14 ; CHECK-NEXT: vmov r0, s5
15 ; CHECK-NEXT: vmov.16 q0[3], r0
16 ; CHECK-NEXT: vmov r0, s10
17 ; CHECK-NEXT: vmov.16 q0[4], r0
18 ; CHECK-NEXT: vmov r0, s6
19 ; CHECK-NEXT: vmov.16 q0[5], r0
20 ; CHECK-NEXT: vmov r0, s11
21 ; CHECK-NEXT: vmov.16 q0[6], r0
22 ; CHECK-NEXT: vmov r0, s7
23 ; CHECK-NEXT: vmov.16 q0[7], r0
26 %strided.vec = shufflevector <4 x i32> %src1, <4 x i32> %src2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
27 %out = trunc <8 x i32> %strided.vec to <8 x i16>
31 define arm_aapcs_vfpcc <8 x i16> @vmovn32_trunc2(<4 x i32> %src1, <4 x i32> %src2) {
32 ; CHECK-LABEL: vmovn32_trunc2:
33 ; CHECK: @ %bb.0: @ %entry
34 ; CHECK-NEXT: vmov q2, q0
35 ; CHECK-NEXT: vmov r0, s4
36 ; CHECK-NEXT: vmov.16 q0[0], r0
37 ; CHECK-NEXT: vmov r0, s8
38 ; CHECK-NEXT: vmov.16 q0[1], r0
39 ; CHECK-NEXT: vmov r0, s5
40 ; CHECK-NEXT: vmov.16 q0[2], r0
41 ; CHECK-NEXT: vmov r0, s9
42 ; CHECK-NEXT: vmov.16 q0[3], r0
43 ; CHECK-NEXT: vmov r0, s6
44 ; CHECK-NEXT: vmov.16 q0[4], r0
45 ; CHECK-NEXT: vmov r0, s10
46 ; CHECK-NEXT: vmov.16 q0[5], r0
47 ; CHECK-NEXT: vmov r0, s7
48 ; CHECK-NEXT: vmov.16 q0[6], r0
49 ; CHECK-NEXT: vmov r0, s11
50 ; CHECK-NEXT: vmov.16 q0[7], r0
53 %strided.vec = shufflevector <4 x i32> %src1, <4 x i32> %src2, <8 x i32> <i32 4, i32 0, i32 5, i32 1, i32 6, i32 2, i32 7, i32 3>
54 %out = trunc <8 x i32> %strided.vec to <8 x i16>
58 define arm_aapcs_vfpcc <16 x i8> @vmovn16_trunc1(<8 x i16> %src1, <8 x i16> %src2) {
59 ; CHECK-LABEL: vmovn16_trunc1:
60 ; CHECK: @ %bb.0: @ %entry
61 ; CHECK-NEXT: vmov.u16 r0, q0[0]
62 ; CHECK-NEXT: vmov q2, q0
63 ; CHECK-NEXT: vmov.8 q0[0], r0
64 ; CHECK-NEXT: vmov.u16 r0, q1[0]
65 ; CHECK-NEXT: vmov.8 q0[1], r0
66 ; CHECK-NEXT: vmov.u16 r0, q2[1]
67 ; CHECK-NEXT: vmov.8 q0[2], r0
68 ; CHECK-NEXT: vmov.u16 r0, q1[1]
69 ; CHECK-NEXT: vmov.8 q0[3], r0
70 ; CHECK-NEXT: vmov.u16 r0, q2[2]
71 ; CHECK-NEXT: vmov.8 q0[4], r0
72 ; CHECK-NEXT: vmov.u16 r0, q1[2]
73 ; CHECK-NEXT: vmov.8 q0[5], r0
74 ; CHECK-NEXT: vmov.u16 r0, q2[3]
75 ; CHECK-NEXT: vmov.8 q0[6], r0
76 ; CHECK-NEXT: vmov.u16 r0, q1[3]
77 ; CHECK-NEXT: vmov.8 q0[7], r0
78 ; CHECK-NEXT: vmov.u16 r0, q2[4]
79 ; CHECK-NEXT: vmov.8 q0[8], r0
80 ; CHECK-NEXT: vmov.u16 r0, q1[4]
81 ; CHECK-NEXT: vmov.8 q0[9], r0
82 ; CHECK-NEXT: vmov.u16 r0, q2[5]
83 ; CHECK-NEXT: vmov.8 q0[10], r0
84 ; CHECK-NEXT: vmov.u16 r0, q1[5]
85 ; CHECK-NEXT: vmov.8 q0[11], r0
86 ; CHECK-NEXT: vmov.u16 r0, q2[6]
87 ; CHECK-NEXT: vmov.8 q0[12], r0
88 ; CHECK-NEXT: vmov.u16 r0, q1[6]
89 ; CHECK-NEXT: vmov.8 q0[13], r0
90 ; CHECK-NEXT: vmov.u16 r0, q2[7]
91 ; CHECK-NEXT: vmov.8 q0[14], r0
92 ; CHECK-NEXT: vmov.u16 r0, q1[7]
93 ; CHECK-NEXT: vmov.8 q0[15], r0
96 %strided.vec = shufflevector <8 x i16> %src1, <8 x i16> %src2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
97 %out = trunc <16 x i16> %strided.vec to <16 x i8>
101 define arm_aapcs_vfpcc <16 x i8> @vmovn16_trunc2(<8 x i16> %src1, <8 x i16> %src2) {
102 ; CHECK-LABEL: vmovn16_trunc2:
103 ; CHECK: @ %bb.0: @ %entry
104 ; CHECK-NEXT: vmov q2, q0
105 ; CHECK-NEXT: vmov.u16 r0, q1[0]
106 ; CHECK-NEXT: vmov.8 q0[0], r0
107 ; CHECK-NEXT: vmov.u16 r0, q2[0]
108 ; CHECK-NEXT: vmov.8 q0[1], r0
109 ; CHECK-NEXT: vmov.u16 r0, q1[1]
110 ; CHECK-NEXT: vmov.8 q0[2], r0
111 ; CHECK-NEXT: vmov.u16 r0, q2[1]
112 ; CHECK-NEXT: vmov.8 q0[3], r0
113 ; CHECK-NEXT: vmov.u16 r0, q1[2]
114 ; CHECK-NEXT: vmov.8 q0[4], r0
115 ; CHECK-NEXT: vmov.u16 r0, q2[2]
116 ; CHECK-NEXT: vmov.8 q0[5], r0
117 ; CHECK-NEXT: vmov.u16 r0, q1[3]
118 ; CHECK-NEXT: vmov.8 q0[6], r0
119 ; CHECK-NEXT: vmov.u16 r0, q2[3]
120 ; CHECK-NEXT: vmov.8 q0[7], r0
121 ; CHECK-NEXT: vmov.u16 r0, q1[4]
122 ; CHECK-NEXT: vmov.8 q0[8], r0
123 ; CHECK-NEXT: vmov.u16 r0, q2[4]
124 ; CHECK-NEXT: vmov.8 q0[9], r0
125 ; CHECK-NEXT: vmov.u16 r0, q1[5]
126 ; CHECK-NEXT: vmov.8 q0[10], r0
127 ; CHECK-NEXT: vmov.u16 r0, q2[5]
128 ; CHECK-NEXT: vmov.8 q0[11], r0
129 ; CHECK-NEXT: vmov.u16 r0, q1[6]
130 ; CHECK-NEXT: vmov.8 q0[12], r0
131 ; CHECK-NEXT: vmov.u16 r0, q2[6]
132 ; CHECK-NEXT: vmov.8 q0[13], r0
133 ; CHECK-NEXT: vmov.u16 r0, q1[7]
134 ; CHECK-NEXT: vmov.8 q0[14], r0
135 ; CHECK-NEXT: vmov.u16 r0, q2[7]
136 ; CHECK-NEXT: vmov.8 q0[15], r0
139 %strided.vec = shufflevector <8 x i16> %src1, <8 x i16> %src2, <16 x i32> <i32 8, i32 0, i32 9, i32 1, i32 10, i32 2, i32 11, i32 3, i32 12, i32 4, i32 13, i32 5, i32 14, i32 6, i32 15, i32 7>
140 %out = trunc <16 x i16> %strided.vec to <16 x i8>
145 define arm_aapcs_vfpcc <2 x i64> @vmovn64_t1(<2 x i64> %src1, <2 x i64> %src2) {
146 ; CHECK-LABEL: vmovn64_t1:
147 ; CHECK: @ %bb.0: @ %entry
148 ; CHECK-NEXT: vmov.f32 s2, s4
149 ; CHECK-NEXT: vmov.f32 s3, s5
152 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 2>
156 define arm_aapcs_vfpcc <2 x i64> @vmovn64_t2(<2 x i64> %src1, <2 x i64> %src2) {
157 ; CHECK-LABEL: vmovn64_t2:
158 ; CHECK: @ %bb.0: @ %entry
159 ; CHECK-NEXT: vmov.f32 s6, s0
160 ; CHECK-NEXT: vmov.f32 s7, s1
161 ; CHECK-NEXT: vmov q0, q1
164 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 0>
168 define arm_aapcs_vfpcc <2 x i64> @vmovn64_b1(<2 x i64> %src1, <2 x i64> %src2) {
169 ; CHECK-LABEL: vmovn64_b1:
170 ; CHECK: @ %bb.0: @ %entry
171 ; CHECK-NEXT: vmov.f32 s2, s6
172 ; CHECK-NEXT: vmov.f32 s3, s7
175 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 3>
179 define arm_aapcs_vfpcc <2 x i64> @vmovn64_b2(<2 x i64> %src1, <2 x i64> %src2) {
180 ; CHECK-LABEL: vmovn64_b2:
181 ; CHECK: @ %bb.0: @ %entry
182 ; CHECK-NEXT: vmov.f32 s4, s6
183 ; CHECK-NEXT: vmov.f32 s5, s7
184 ; CHECK-NEXT: vmov.f32 s6, s0
185 ; CHECK-NEXT: vmov.f32 s7, s1
186 ; CHECK-NEXT: vmov q0, q1
189 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 3, i32 0>
193 define arm_aapcs_vfpcc <2 x i64> @vmovn64_b3(<2 x i64> %src1, <2 x i64> %src2) {
194 ; CHECK-LABEL: vmovn64_b3:
195 ; CHECK: @ %bb.0: @ %entry
196 ; CHECK-NEXT: vmov.f32 s0, s2
197 ; CHECK-NEXT: vmov.f32 s1, s3
198 ; CHECK-NEXT: vmov.f32 s2, s4
199 ; CHECK-NEXT: vmov.f32 s3, s5
202 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 1, i32 2>
206 define arm_aapcs_vfpcc <2 x i64> @vmovn64_b4(<2 x i64> %src1, <2 x i64> %src2) {
207 ; CHECK-LABEL: vmovn64_b4:
208 ; CHECK: @ %bb.0: @ %entry
209 ; CHECK-NEXT: vmov.f32 s6, s2
210 ; CHECK-NEXT: vmov.f32 s7, s3
211 ; CHECK-NEXT: vmov q0, q1
214 %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 1>
220 define arm_aapcs_vfpcc <4 x i32> @vmovn32_t1(<4 x i32> %src1, <4 x i32> %src2) {
221 ; CHECK-LABEL: vmovn32_t1:
222 ; CHECK: @ %bb.0: @ %entry
223 ; CHECK-NEXT: vmov.f32 s1, s4
224 ; CHECK-NEXT: vmov.f32 s3, s6
227 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
231 define arm_aapcs_vfpcc <4 x i32> @vmovn32_t2(<4 x i32> %src1, <4 x i32> %src2) {
232 ; CHECK-LABEL: vmovn32_t2:
233 ; CHECK: @ %bb.0: @ %entry
234 ; CHECK-NEXT: vmov.f32 s5, s0
235 ; CHECK-NEXT: vmov.f32 s7, s2
236 ; CHECK-NEXT: vmov q0, q1
239 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
243 define arm_aapcs_vfpcc <4 x i32> @vmovn32_b1(<4 x i32> %src1, <4 x i32> %src2) {
244 ; CHECK-LABEL: vmovn32_b1:
245 ; CHECK: @ %bb.0: @ %entry
246 ; CHECK-NEXT: vmov.f32 s1, s5
247 ; CHECK-NEXT: vmov.f32 s3, s7
250 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
254 define arm_aapcs_vfpcc <4 x i32> @vmovn32_b2(<4 x i32> %src1, <4 x i32> %src2) {
255 ; CHECK-LABEL: vmovn32_b2:
256 ; CHECK: @ %bb.0: @ %entry
257 ; CHECK-NEXT: vmov.f32 s8, s5
258 ; CHECK-NEXT: vmov.f32 s9, s0
259 ; CHECK-NEXT: vmov.f32 s10, s7
260 ; CHECK-NEXT: vmov.f32 s11, s2
261 ; CHECK-NEXT: vmov q0, q2
264 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 5, i32 0, i32 7, i32 2>
268 define arm_aapcs_vfpcc <4 x i32> @vmovn32_b3(<4 x i32> %src1, <4 x i32> %src2) {
269 ; CHECK-LABEL: vmovn32_b3:
270 ; CHECK: @ %bb.0: @ %entry
271 ; CHECK-NEXT: vmov.f32 s8, s1
272 ; CHECK-NEXT: vmov.f32 s9, s4
273 ; CHECK-NEXT: vmov.f32 s10, s3
274 ; CHECK-NEXT: vmov.f32 s11, s6
275 ; CHECK-NEXT: vmov q0, q2
278 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 1, i32 4, i32 3, i32 6>
282 define arm_aapcs_vfpcc <4 x i32> @vmovn32_b4(<4 x i32> %src1, <4 x i32> %src2) {
283 ; CHECK-LABEL: vmovn32_b4:
284 ; CHECK: @ %bb.0: @ %entry
285 ; CHECK-NEXT: vmov.f32 s5, s1
286 ; CHECK-NEXT: vmov.f32 s7, s3
287 ; CHECK-NEXT: vmov q0, q1
290 %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
297 define arm_aapcs_vfpcc <8 x i16> @vmovn16_t1(<8 x i16> %src1, <8 x i16> %src2) {
298 ; CHECK-LABEL: vmovn16_t1:
299 ; CHECK: @ %bb.0: @ %entry
300 ; CHECK-NEXT: vmov.u16 r0, q0[0]
301 ; CHECK-NEXT: vmov q2, q0
302 ; CHECK-NEXT: vmov.16 q0[0], r0
303 ; CHECK-NEXT: vmov.u16 r0, q1[0]
304 ; CHECK-NEXT: vmov.16 q0[1], r0
305 ; CHECK-NEXT: vmov.u16 r0, q2[2]
306 ; CHECK-NEXT: vmov.16 q0[2], r0
307 ; CHECK-NEXT: vmov.u16 r0, q1[2]
308 ; CHECK-NEXT: vmov.16 q0[3], r0
309 ; CHECK-NEXT: vmov.u16 r0, q2[4]
310 ; CHECK-NEXT: vmov.16 q0[4], r0
311 ; CHECK-NEXT: vmov.u16 r0, q1[4]
312 ; CHECK-NEXT: vmov.16 q0[5], r0
313 ; CHECK-NEXT: vmov.u16 r0, q2[6]
314 ; CHECK-NEXT: vmov.16 q0[6], r0
315 ; CHECK-NEXT: vmov.u16 r0, q1[6]
316 ; CHECK-NEXT: vmov.16 q0[7], r0
319 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
323 define arm_aapcs_vfpcc <8 x i16> @vmovn16_t2(<8 x i16> %src1, <8 x i16> %src2) {
324 ; CHECK-LABEL: vmovn16_t2:
325 ; CHECK: @ %bb.0: @ %entry
326 ; CHECK-NEXT: vmov q2, q0
327 ; CHECK-NEXT: vmov.u16 r0, q1[0]
328 ; CHECK-NEXT: vmov.16 q0[0], r0
329 ; CHECK-NEXT: vmov.u16 r0, q2[0]
330 ; CHECK-NEXT: vmov.16 q0[1], r0
331 ; CHECK-NEXT: vmov.u16 r0, q1[2]
332 ; CHECK-NEXT: vmov.16 q0[2], r0
333 ; CHECK-NEXT: vmov.u16 r0, q2[2]
334 ; CHECK-NEXT: vmov.16 q0[3], r0
335 ; CHECK-NEXT: vmov.u16 r0, q1[4]
336 ; CHECK-NEXT: vmov.16 q0[4], r0
337 ; CHECK-NEXT: vmov.u16 r0, q2[4]
338 ; CHECK-NEXT: vmov.16 q0[5], r0
339 ; CHECK-NEXT: vmov.u16 r0, q1[6]
340 ; CHECK-NEXT: vmov.16 q0[6], r0
341 ; CHECK-NEXT: vmov.u16 r0, q2[6]
342 ; CHECK-NEXT: vmov.16 q0[7], r0
345 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 0, i32 10, i32 2, i32 12, i32 4, i32 14, i32 6>
349 define arm_aapcs_vfpcc <8 x i16> @vmovn16_b1(<8 x i16> %src1, <8 x i16> %src2) {
350 ; CHECK-LABEL: vmovn16_b1:
351 ; CHECK: @ %bb.0: @ %entry
352 ; CHECK-NEXT: vmov.u16 r0, q0[0]
353 ; CHECK-NEXT: vmov q2, q0
354 ; CHECK-NEXT: vmov.16 q0[0], r0
355 ; CHECK-NEXT: vmov.u16 r0, q1[1]
356 ; CHECK-NEXT: vmov.16 q0[1], r0
357 ; CHECK-NEXT: vmov.u16 r0, q2[2]
358 ; CHECK-NEXT: vmov.16 q0[2], r0
359 ; CHECK-NEXT: vmov.u16 r0, q1[3]
360 ; CHECK-NEXT: vmov.16 q0[3], r0
361 ; CHECK-NEXT: vmov.u16 r0, q2[4]
362 ; CHECK-NEXT: vmov.16 q0[4], r0
363 ; CHECK-NEXT: vmov.u16 r0, q1[5]
364 ; CHECK-NEXT: vmov.16 q0[5], r0
365 ; CHECK-NEXT: vmov.u16 r0, q2[6]
366 ; CHECK-NEXT: vmov.16 q0[6], r0
367 ; CHECK-NEXT: vmov.u16 r0, q1[7]
368 ; CHECK-NEXT: vmov.16 q0[7], r0
371 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
375 define arm_aapcs_vfpcc <8 x i16> @vmovn16_b2(<8 x i16> %src1, <8 x i16> %src2) {
376 ; CHECK-LABEL: vmovn16_b2:
377 ; CHECK: @ %bb.0: @ %entry
378 ; CHECK-NEXT: vmov q2, q0
379 ; CHECK-NEXT: vmov.u16 r0, q1[1]
380 ; CHECK-NEXT: vmov.16 q0[0], r0
381 ; CHECK-NEXT: vmov.u16 r0, q2[0]
382 ; CHECK-NEXT: vmov.16 q0[1], r0
383 ; CHECK-NEXT: vmov.u16 r0, q1[3]
384 ; CHECK-NEXT: vmov.16 q0[2], r0
385 ; CHECK-NEXT: vmov.u16 r0, q2[2]
386 ; CHECK-NEXT: vmov.16 q0[3], r0
387 ; CHECK-NEXT: vmov.u16 r0, q1[5]
388 ; CHECK-NEXT: vmov.16 q0[4], r0
389 ; CHECK-NEXT: vmov.u16 r0, q2[4]
390 ; CHECK-NEXT: vmov.16 q0[5], r0
391 ; CHECK-NEXT: vmov.u16 r0, q1[7]
392 ; CHECK-NEXT: vmov.16 q0[6], r0
393 ; CHECK-NEXT: vmov.u16 r0, q2[6]
394 ; CHECK-NEXT: vmov.16 q0[7], r0
397 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 9, i32 0, i32 11, i32 2, i32 13, i32 4, i32 15, i32 6>
401 define arm_aapcs_vfpcc <8 x i16> @vmovn16_b3(<8 x i16> %src1, <8 x i16> %src2) {
402 ; CHECK-LABEL: vmovn16_b3:
403 ; CHECK: @ %bb.0: @ %entry
404 ; CHECK-NEXT: vmov.u16 r0, q0[1]
405 ; CHECK-NEXT: vmov q2, q0
406 ; CHECK-NEXT: vmov.16 q0[0], r0
407 ; CHECK-NEXT: vmov.u16 r0, q1[0]
408 ; CHECK-NEXT: vmov.16 q0[1], r0
409 ; CHECK-NEXT: vmov.u16 r0, q2[3]
410 ; CHECK-NEXT: vmov.16 q0[2], r0
411 ; CHECK-NEXT: vmov.u16 r0, q1[2]
412 ; CHECK-NEXT: vmov.16 q0[3], r0
413 ; CHECK-NEXT: vmov.u16 r0, q2[5]
414 ; CHECK-NEXT: vmov.16 q0[4], r0
415 ; CHECK-NEXT: vmov.u16 r0, q1[4]
416 ; CHECK-NEXT: vmov.16 q0[5], r0
417 ; CHECK-NEXT: vmov.u16 r0, q2[7]
418 ; CHECK-NEXT: vmov.16 q0[6], r0
419 ; CHECK-NEXT: vmov.u16 r0, q1[6]
420 ; CHECK-NEXT: vmov.16 q0[7], r0
423 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 1, i32 8, i32 3, i32 10, i32 5, i32 12, i32 7, i32 14>
427 define arm_aapcs_vfpcc <8 x i16> @vmovn16_b4(<8 x i16> %src1, <8 x i16> %src2) {
428 ; CHECK-LABEL: vmovn16_b4:
429 ; CHECK: @ %bb.0: @ %entry
430 ; CHECK-NEXT: vmov q2, q0
431 ; CHECK-NEXT: vmov.u16 r0, q1[0]
432 ; CHECK-NEXT: vmov.16 q0[0], r0
433 ; CHECK-NEXT: vmov.u16 r0, q2[1]
434 ; CHECK-NEXT: vmov.16 q0[1], r0
435 ; CHECK-NEXT: vmov.u16 r0, q1[2]
436 ; CHECK-NEXT: vmov.16 q0[2], r0
437 ; CHECK-NEXT: vmov.u16 r0, q2[3]
438 ; CHECK-NEXT: vmov.16 q0[3], r0
439 ; CHECK-NEXT: vmov.u16 r0, q1[4]
440 ; CHECK-NEXT: vmov.16 q0[4], r0
441 ; CHECK-NEXT: vmov.u16 r0, q2[5]
442 ; CHECK-NEXT: vmov.16 q0[5], r0
443 ; CHECK-NEXT: vmov.u16 r0, q1[6]
444 ; CHECK-NEXT: vmov.16 q0[6], r0
445 ; CHECK-NEXT: vmov.u16 r0, q2[7]
446 ; CHECK-NEXT: vmov.16 q0[7], r0
449 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
454 define arm_aapcs_vfpcc <16 x i8> @vmovn8_b1(<16 x i8> %src1, <16 x i8> %src2) {
455 ; CHECK-LABEL: vmovn8_b1:
456 ; CHECK: @ %bb.0: @ %entry
457 ; CHECK-NEXT: vmov.u8 r0, q0[0]
458 ; CHECK-NEXT: vmov q2, q0
459 ; CHECK-NEXT: vmov.8 q0[0], r0
460 ; CHECK-NEXT: vmov.u8 r0, q1[0]
461 ; CHECK-NEXT: vmov.8 q0[1], r0
462 ; CHECK-NEXT: vmov.u8 r0, q2[2]
463 ; CHECK-NEXT: vmov.8 q0[2], r0
464 ; CHECK-NEXT: vmov.u8 r0, q1[2]
465 ; CHECK-NEXT: vmov.8 q0[3], r0
466 ; CHECK-NEXT: vmov.u8 r0, q2[4]
467 ; CHECK-NEXT: vmov.8 q0[4], r0
468 ; CHECK-NEXT: vmov.u8 r0, q1[4]
469 ; CHECK-NEXT: vmov.8 q0[5], r0
470 ; CHECK-NEXT: vmov.u8 r0, q2[6]
471 ; CHECK-NEXT: vmov.8 q0[6], r0
472 ; CHECK-NEXT: vmov.u8 r0, q1[6]
473 ; CHECK-NEXT: vmov.8 q0[7], r0
474 ; CHECK-NEXT: vmov.u8 r0, q2[8]
475 ; CHECK-NEXT: vmov.8 q0[8], r0
476 ; CHECK-NEXT: vmov.u8 r0, q1[8]
477 ; CHECK-NEXT: vmov.8 q0[9], r0
478 ; CHECK-NEXT: vmov.u8 r0, q2[10]
479 ; CHECK-NEXT: vmov.8 q0[10], r0
480 ; CHECK-NEXT: vmov.u8 r0, q1[10]
481 ; CHECK-NEXT: vmov.8 q0[11], r0
482 ; CHECK-NEXT: vmov.u8 r0, q2[12]
483 ; CHECK-NEXT: vmov.8 q0[12], r0
484 ; CHECK-NEXT: vmov.u8 r0, q1[12]
485 ; CHECK-NEXT: vmov.8 q0[13], r0
486 ; CHECK-NEXT: vmov.u8 r0, q2[14]
487 ; CHECK-NEXT: vmov.8 q0[14], r0
488 ; CHECK-NEXT: vmov.u8 r0, q1[14]
489 ; CHECK-NEXT: vmov.8 q0[15], r0
492 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
496 define arm_aapcs_vfpcc <16 x i8> @vmovn8_b2(<16 x i8> %src1, <16 x i8> %src2) {
497 ; CHECK-LABEL: vmovn8_b2:
498 ; CHECK: @ %bb.0: @ %entry
499 ; CHECK-NEXT: vmov q2, q0
500 ; CHECK-NEXT: vmov.u8 r0, q1[0]
501 ; CHECK-NEXT: vmov.8 q0[0], r0
502 ; CHECK-NEXT: vmov.u8 r0, q2[0]
503 ; CHECK-NEXT: vmov.8 q0[1], r0
504 ; CHECK-NEXT: vmov.u8 r0, q1[2]
505 ; CHECK-NEXT: vmov.8 q0[2], r0
506 ; CHECK-NEXT: vmov.u8 r0, q2[2]
507 ; CHECK-NEXT: vmov.8 q0[3], r0
508 ; CHECK-NEXT: vmov.u8 r0, q1[4]
509 ; CHECK-NEXT: vmov.8 q0[4], r0
510 ; CHECK-NEXT: vmov.u8 r0, q2[4]
511 ; CHECK-NEXT: vmov.8 q0[5], r0
512 ; CHECK-NEXT: vmov.u8 r0, q1[6]
513 ; CHECK-NEXT: vmov.8 q0[6], r0
514 ; CHECK-NEXT: vmov.u8 r0, q2[6]
515 ; CHECK-NEXT: vmov.8 q0[7], r0
516 ; CHECK-NEXT: vmov.u8 r0, q1[8]
517 ; CHECK-NEXT: vmov.8 q0[8], r0
518 ; CHECK-NEXT: vmov.u8 r0, q2[8]
519 ; CHECK-NEXT: vmov.8 q0[9], r0
520 ; CHECK-NEXT: vmov.u8 r0, q1[10]
521 ; CHECK-NEXT: vmov.8 q0[10], r0
522 ; CHECK-NEXT: vmov.u8 r0, q2[10]
523 ; CHECK-NEXT: vmov.8 q0[11], r0
524 ; CHECK-NEXT: vmov.u8 r0, q1[12]
525 ; CHECK-NEXT: vmov.8 q0[12], r0
526 ; CHECK-NEXT: vmov.u8 r0, q2[12]
527 ; CHECK-NEXT: vmov.8 q0[13], r0
528 ; CHECK-NEXT: vmov.u8 r0, q1[14]
529 ; CHECK-NEXT: vmov.8 q0[14], r0
530 ; CHECK-NEXT: vmov.u8 r0, q2[14]
531 ; CHECK-NEXT: vmov.8 q0[15], r0
534 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 0, i32 18, i32 2, i32 20, i32 4, i32 22, i32 6, i32 24, i32 8, i32 26, i32 10, i32 28, i32 12, i32 30, i32 14>
538 define arm_aapcs_vfpcc <16 x i8> @vmovn8_t1(<16 x i8> %src1, <16 x i8> %src2) {
539 ; CHECK-LABEL: vmovn8_t1:
540 ; CHECK: @ %bb.0: @ %entry
541 ; CHECK-NEXT: vmov.u8 r0, q0[0]
542 ; CHECK-NEXT: vmov q2, q0
543 ; CHECK-NEXT: vmov.8 q0[0], r0
544 ; CHECK-NEXT: vmov.u8 r0, q1[1]
545 ; CHECK-NEXT: vmov.8 q0[1], r0
546 ; CHECK-NEXT: vmov.u8 r0, q2[2]
547 ; CHECK-NEXT: vmov.8 q0[2], r0
548 ; CHECK-NEXT: vmov.u8 r0, q1[3]
549 ; CHECK-NEXT: vmov.8 q0[3], r0
550 ; CHECK-NEXT: vmov.u8 r0, q2[4]
551 ; CHECK-NEXT: vmov.8 q0[4], r0
552 ; CHECK-NEXT: vmov.u8 r0, q1[5]
553 ; CHECK-NEXT: vmov.8 q0[5], r0
554 ; CHECK-NEXT: vmov.u8 r0, q2[6]
555 ; CHECK-NEXT: vmov.8 q0[6], r0
556 ; CHECK-NEXT: vmov.u8 r0, q1[7]
557 ; CHECK-NEXT: vmov.8 q0[7], r0
558 ; CHECK-NEXT: vmov.u8 r0, q2[8]
559 ; CHECK-NEXT: vmov.8 q0[8], r0
560 ; CHECK-NEXT: vmov.u8 r0, q1[9]
561 ; CHECK-NEXT: vmov.8 q0[9], r0
562 ; CHECK-NEXT: vmov.u8 r0, q2[10]
563 ; CHECK-NEXT: vmov.8 q0[10], r0
564 ; CHECK-NEXT: vmov.u8 r0, q1[11]
565 ; CHECK-NEXT: vmov.8 q0[11], r0
566 ; CHECK-NEXT: vmov.u8 r0, q2[12]
567 ; CHECK-NEXT: vmov.8 q0[12], r0
568 ; CHECK-NEXT: vmov.u8 r0, q1[13]
569 ; CHECK-NEXT: vmov.8 q0[13], r0
570 ; CHECK-NEXT: vmov.u8 r0, q2[14]
571 ; CHECK-NEXT: vmov.8 q0[14], r0
572 ; CHECK-NEXT: vmov.u8 r0, q1[15]
573 ; CHECK-NEXT: vmov.8 q0[15], r0
576 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
580 define arm_aapcs_vfpcc <16 x i8> @vmovn8_t2(<16 x i8> %src1, <16 x i8> %src2) {
581 ; CHECK-LABEL: vmovn8_t2:
582 ; CHECK: @ %bb.0: @ %entry
583 ; CHECK-NEXT: vmov q2, q0
584 ; CHECK-NEXT: vmov.u8 r0, q1[1]
585 ; CHECK-NEXT: vmov.8 q0[0], r0
586 ; CHECK-NEXT: vmov.u8 r0, q2[0]
587 ; CHECK-NEXT: vmov.8 q0[1], r0
588 ; CHECK-NEXT: vmov.u8 r0, q1[3]
589 ; CHECK-NEXT: vmov.8 q0[2], r0
590 ; CHECK-NEXT: vmov.u8 r0, q2[2]
591 ; CHECK-NEXT: vmov.8 q0[3], r0
592 ; CHECK-NEXT: vmov.u8 r0, q1[5]
593 ; CHECK-NEXT: vmov.8 q0[4], r0
594 ; CHECK-NEXT: vmov.u8 r0, q2[4]
595 ; CHECK-NEXT: vmov.8 q0[5], r0
596 ; CHECK-NEXT: vmov.u8 r0, q1[7]
597 ; CHECK-NEXT: vmov.8 q0[6], r0
598 ; CHECK-NEXT: vmov.u8 r0, q2[6]
599 ; CHECK-NEXT: vmov.8 q0[7], r0
600 ; CHECK-NEXT: vmov.u8 r0, q1[9]
601 ; CHECK-NEXT: vmov.8 q0[8], r0
602 ; CHECK-NEXT: vmov.u8 r0, q2[8]
603 ; CHECK-NEXT: vmov.8 q0[9], r0
604 ; CHECK-NEXT: vmov.u8 r0, q1[11]
605 ; CHECK-NEXT: vmov.8 q0[10], r0
606 ; CHECK-NEXT: vmov.u8 r0, q2[10]
607 ; CHECK-NEXT: vmov.8 q0[11], r0
608 ; CHECK-NEXT: vmov.u8 r0, q1[13]
609 ; CHECK-NEXT: vmov.8 q0[12], r0
610 ; CHECK-NEXT: vmov.u8 r0, q2[12]
611 ; CHECK-NEXT: vmov.8 q0[13], r0
612 ; CHECK-NEXT: vmov.u8 r0, q1[15]
613 ; CHECK-NEXT: vmov.8 q0[14], r0
614 ; CHECK-NEXT: vmov.u8 r0, q2[14]
615 ; CHECK-NEXT: vmov.8 q0[15], r0
618 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 17, i32 0, i32 19, i32 2, i32 21, i32 4, i32 23, i32 6, i32 25, i32 8, i32 27, i32 10, i32 29, i32 12, i32 31, i32 14>
622 define arm_aapcs_vfpcc <16 x i8> @vmovn8_t3(<16 x i8> %src1, <16 x i8> %src2) {
623 ; CHECK-LABEL: vmovn8_t3:
624 ; CHECK: @ %bb.0: @ %entry
625 ; CHECK-NEXT: vmov.u8 r0, q0[1]
626 ; CHECK-NEXT: vmov q2, q0
627 ; CHECK-NEXT: vmov.8 q0[0], r0
628 ; CHECK-NEXT: vmov.u8 r0, q1[0]
629 ; CHECK-NEXT: vmov.8 q0[1], r0
630 ; CHECK-NEXT: vmov.u8 r0, q2[3]
631 ; CHECK-NEXT: vmov.8 q0[2], r0
632 ; CHECK-NEXT: vmov.u8 r0, q1[2]
633 ; CHECK-NEXT: vmov.8 q0[3], r0
634 ; CHECK-NEXT: vmov.u8 r0, q2[5]
635 ; CHECK-NEXT: vmov.8 q0[4], r0
636 ; CHECK-NEXT: vmov.u8 r0, q1[4]
637 ; CHECK-NEXT: vmov.8 q0[5], r0
638 ; CHECK-NEXT: vmov.u8 r0, q2[7]
639 ; CHECK-NEXT: vmov.8 q0[6], r0
640 ; CHECK-NEXT: vmov.u8 r0, q1[6]
641 ; CHECK-NEXT: vmov.8 q0[7], r0
642 ; CHECK-NEXT: vmov.u8 r0, q2[9]
643 ; CHECK-NEXT: vmov.8 q0[8], r0
644 ; CHECK-NEXT: vmov.u8 r0, q1[8]
645 ; CHECK-NEXT: vmov.8 q0[9], r0
646 ; CHECK-NEXT: vmov.u8 r0, q2[11]
647 ; CHECK-NEXT: vmov.8 q0[10], r0
648 ; CHECK-NEXT: vmov.u8 r0, q1[10]
649 ; CHECK-NEXT: vmov.8 q0[11], r0
650 ; CHECK-NEXT: vmov.u8 r0, q2[13]
651 ; CHECK-NEXT: vmov.8 q0[12], r0
652 ; CHECK-NEXT: vmov.u8 r0, q1[12]
653 ; CHECK-NEXT: vmov.8 q0[13], r0
654 ; CHECK-NEXT: vmov.u8 r0, q2[15]
655 ; CHECK-NEXT: vmov.8 q0[14], r0
656 ; CHECK-NEXT: vmov.u8 r0, q1[14]
657 ; CHECK-NEXT: vmov.8 q0[15], r0
660 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 1, i32 16, i32 3, i32 18, i32 5, i32 20, i32 7, i32 22, i32 9, i32 24, i32 11, i32 26, i32 13, i32 28, i32 15, i32 30>
664 define arm_aapcs_vfpcc <16 x i8> @vmovn8_t4(<16 x i8> %src1, <16 x i8> %src2) {
665 ; CHECK-LABEL: vmovn8_t4:
666 ; CHECK: @ %bb.0: @ %entry
667 ; CHECK-NEXT: vmov q2, q0
668 ; CHECK-NEXT: vmov.u8 r0, q1[0]
669 ; CHECK-NEXT: vmov.8 q0[0], r0
670 ; CHECK-NEXT: vmov.u8 r0, q2[1]
671 ; CHECK-NEXT: vmov.8 q0[1], r0
672 ; CHECK-NEXT: vmov.u8 r0, q1[2]
673 ; CHECK-NEXT: vmov.8 q0[2], r0
674 ; CHECK-NEXT: vmov.u8 r0, q2[3]
675 ; CHECK-NEXT: vmov.8 q0[3], r0
676 ; CHECK-NEXT: vmov.u8 r0, q1[4]
677 ; CHECK-NEXT: vmov.8 q0[4], r0
678 ; CHECK-NEXT: vmov.u8 r0, q2[5]
679 ; CHECK-NEXT: vmov.8 q0[5], r0
680 ; CHECK-NEXT: vmov.u8 r0, q1[6]
681 ; CHECK-NEXT: vmov.8 q0[6], r0
682 ; CHECK-NEXT: vmov.u8 r0, q2[7]
683 ; CHECK-NEXT: vmov.8 q0[7], r0
684 ; CHECK-NEXT: vmov.u8 r0, q1[8]
685 ; CHECK-NEXT: vmov.8 q0[8], r0
686 ; CHECK-NEXT: vmov.u8 r0, q2[9]
687 ; CHECK-NEXT: vmov.8 q0[9], r0
688 ; CHECK-NEXT: vmov.u8 r0, q1[10]
689 ; CHECK-NEXT: vmov.8 q0[10], r0
690 ; CHECK-NEXT: vmov.u8 r0, q2[11]
691 ; CHECK-NEXT: vmov.8 q0[11], r0
692 ; CHECK-NEXT: vmov.u8 r0, q1[12]
693 ; CHECK-NEXT: vmov.8 q0[12], r0
694 ; CHECK-NEXT: vmov.u8 r0, q2[13]
695 ; CHECK-NEXT: vmov.8 q0[13], r0
696 ; CHECK-NEXT: vmov.u8 r0, q1[14]
697 ; CHECK-NEXT: vmov.8 q0[14], r0
698 ; CHECK-NEXT: vmov.u8 r0, q2[15]
699 ; CHECK-NEXT: vmov.8 q0[15], r0
702 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>