[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-vmovnstore.ll
blobb8ddde719a67e26c92520125d3aa5ba0c6aaeaf4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
4 define arm_aapcs_vfpcc void @vmovn32_trunc1(<4 x i32> %src1, <4 x i32> %src2, <8 x i16> *%dest) {
5 ; CHECK-LABEL: vmovn32_trunc1:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    vmovnt.i32 q0, q1
8 ; CHECK-NEXT:    vstrw.32 q0, [r0]
9 ; CHECK-NEXT:    bx lr
10 entry:
11   %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>
12   %out = trunc <8 x i32> %strided.vec to <8 x i16>
13   store <8 x i16> %out, <8 x i16> *%dest, align 8
14   ret void
17 define arm_aapcs_vfpcc void @vmovn32_trunc2(<4 x i32> %src1, <4 x i32> %src2, <8 x i16> *%dest) {
18 ; CHECK-LABEL: vmovn32_trunc2:
19 ; CHECK:       @ %bb.0: @ %entry
20 ; CHECK-NEXT:    vmovnt.i32 q1, q0
21 ; CHECK-NEXT:    vstrw.32 q1, [r0]
22 ; CHECK-NEXT:    bx lr
23 entry:
24   %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>
25   %out = trunc <8 x i32> %strided.vec to <8 x i16>
26   store <8 x i16> %out, <8 x i16> *%dest, align 8
27   ret void
30 define arm_aapcs_vfpcc void @vmovn32_trunc1_onesrc(<8 x i32> %src1, <8 x i16> *%dest) {
31 ; CHECK-LABEL: vmovn32_trunc1_onesrc:
32 ; CHECK:       @ %bb.0: @ %entry
33 ; CHECK-NEXT:    vmovnt.i32 q0, q1
34 ; CHECK-NEXT:    vstrw.32 q0, [r0]
35 ; CHECK-NEXT:    bx lr
36 entry:
37   %strided.vec = shufflevector <8 x i32> %src1, <8 x i32> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
38   %out = trunc <8 x i32> %strided.vec to <8 x i16>
39   store <8 x i16> %out, <8 x i16> *%dest, align 8
40   ret void
43 define arm_aapcs_vfpcc void @vmovn32_trunc2_onesrc(<8 x i32> %src1, <8 x i16> *%dest) {
44 ; CHECK-LABEL: vmovn32_trunc2_onesrc:
45 ; CHECK:       @ %bb.0: @ %entry
46 ; CHECK-NEXT:    vmovnt.i32 q1, q0
47 ; CHECK-NEXT:    vstrw.32 q1, [r0]
48 ; CHECK-NEXT:    bx lr
49 entry:
50   %strided.vec = shufflevector <8 x i32> %src1, <8 x i32> undef, <8 x i32> <i32 4, i32 0, i32 5, i32 1, i32 6, i32 2, i32 7, i32 3>
51   %out = trunc <8 x i32> %strided.vec to <8 x i16>
52   store <8 x i16> %out, <8 x i16> *%dest, align 8
53   ret void
56 define arm_aapcs_vfpcc void @vmovn16_trunc1(<8 x i16> %src1, <8 x i16> %src2, <16 x i8> *%dest) {
57 ; CHECK-LABEL: vmovn16_trunc1:
58 ; CHECK:       @ %bb.0: @ %entry
59 ; CHECK-NEXT:    vmovnt.i16 q0, q1
60 ; CHECK-NEXT:    vstrw.32 q0, [r0]
61 ; CHECK-NEXT:    bx lr
62 entry:
63   %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>
64   %out = trunc <16 x i16> %strided.vec to <16 x i8>
65   store <16 x i8> %out, <16 x i8> *%dest, align 8
66   ret void
69 define arm_aapcs_vfpcc void @vmovn16_trunc2(<8 x i16> %src1, <8 x i16> %src2, <16 x i8> *%dest) {
70 ; CHECK-LABEL: vmovn16_trunc2:
71 ; CHECK:       @ %bb.0: @ %entry
72 ; CHECK-NEXT:    vmovnt.i16 q1, q0
73 ; CHECK-NEXT:    vstrw.32 q1, [r0]
74 ; CHECK-NEXT:    bx lr
75 entry:
76   %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>
77   %out = trunc <16 x i16> %strided.vec to <16 x i8>
78   store <16 x i8> %out, <16 x i8> *%dest, align 8
79   ret void
82 define arm_aapcs_vfpcc void @vmovn16_trunc1_onesrc(<16 x i16> %src1, <16 x i8> *%dest) {
83 ; CHECK-LABEL: vmovn16_trunc1_onesrc:
84 ; CHECK:       @ %bb.0: @ %entry
85 ; CHECK-NEXT:    vmovnt.i16 q0, q1
86 ; CHECK-NEXT:    vstrw.32 q0, [r0]
87 ; CHECK-NEXT:    bx lr
88 entry:
89   %strided.vec = shufflevector <16 x i16> %src1, <16 x i16> undef, <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>
90   %out = trunc <16 x i16> %strided.vec to <16 x i8>
91   store <16 x i8> %out, <16 x i8> *%dest, align 8
92   ret void
95 define arm_aapcs_vfpcc void @vmovn16_trunc2_onesrc(<16 x i16> %src1, <16 x i8> *%dest) {
96 ; CHECK-LABEL: vmovn16_trunc2_onesrc:
97 ; CHECK:       @ %bb.0: @ %entry
98 ; CHECK-NEXT:    vmovnt.i16 q1, q0
99 ; CHECK-NEXT:    vstrw.32 q1, [r0]
100 ; CHECK-NEXT:    bx lr
101 entry:
102   %strided.vec = shufflevector <16 x i16> %src1, <16 x i16> undef, <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>
103   %out = trunc <16 x i16> %strided.vec to <16 x i8>
104   store <16 x i8> %out, <16 x i8> *%dest, align 8
105   ret void
109 define arm_aapcs_vfpcc void @vmovn64_t1(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
110 ; CHECK-LABEL: vmovn64_t1:
111 ; CHECK:       @ %bb.0: @ %entry
112 ; CHECK-NEXT:    vmov.f32 s2, s4
113 ; CHECK-NEXT:    vmov.f32 s3, s5
114 ; CHECK-NEXT:    vstrw.32 q0, [r0]
115 ; CHECK-NEXT:    bx lr
116 entry:
117   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 2>
118   store <2 x i64> %out, <2 x i64> *%dest, align 8
119   ret void
122 define arm_aapcs_vfpcc void @vmovn64_t2(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
123 ; CHECK-LABEL: vmovn64_t2:
124 ; CHECK:       @ %bb.0: @ %entry
125 ; CHECK-NEXT:    vmov.f32 s6, s0
126 ; CHECK-NEXT:    vmov.f32 s7, s1
127 ; CHECK-NEXT:    vstrw.32 q1, [r0]
128 ; CHECK-NEXT:    bx lr
129 entry:
130   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 0>
131   store <2 x i64> %out, <2 x i64> *%dest, align 8
132   ret void
135 define arm_aapcs_vfpcc void @vmovn64_b1(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
136 ; CHECK-LABEL: vmovn64_b1:
137 ; CHECK:       @ %bb.0: @ %entry
138 ; CHECK-NEXT:    vmov.f32 s2, s6
139 ; CHECK-NEXT:    vmov.f32 s3, s7
140 ; CHECK-NEXT:    vstrw.32 q0, [r0]
141 ; CHECK-NEXT:    bx lr
142 entry:
143   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 3>
144   store <2 x i64> %out, <2 x i64> *%dest, align 8
145   ret void
148 define arm_aapcs_vfpcc void @vmovn64_b2(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
149 ; CHECK-LABEL: vmovn64_b2:
150 ; CHECK:       @ %bb.0: @ %entry
151 ; CHECK-NEXT:    vmov.f32 s4, s6
152 ; CHECK-NEXT:    vmov.f32 s5, s7
153 ; CHECK-NEXT:    vmov.f32 s6, s0
154 ; CHECK-NEXT:    vmov.f32 s7, s1
155 ; CHECK-NEXT:    vstrw.32 q1, [r0]
156 ; CHECK-NEXT:    bx lr
157 entry:
158   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 3, i32 0>
159   store <2 x i64> %out, <2 x i64> *%dest, align 8
160   ret void
163 define arm_aapcs_vfpcc void @vmovn64_b3(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
164 ; CHECK-LABEL: vmovn64_b3:
165 ; CHECK:       @ %bb.0: @ %entry
166 ; CHECK-NEXT:    vmov.f32 s0, s2
167 ; CHECK-NEXT:    vmov.f32 s1, s3
168 ; CHECK-NEXT:    vmov.f32 s2, s4
169 ; CHECK-NEXT:    vmov.f32 s3, s5
170 ; CHECK-NEXT:    vstrw.32 q0, [r0]
171 ; CHECK-NEXT:    bx lr
172 entry:
173   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 1, i32 2>
174   store <2 x i64> %out, <2 x i64> *%dest, align 8
175   ret void
178 define arm_aapcs_vfpcc void @vmovn64_b4(<2 x i64> %src1, <2 x i64> %src2, <2 x i64> *%dest) {
179 ; CHECK-LABEL: vmovn64_b4:
180 ; CHECK:       @ %bb.0: @ %entry
181 ; CHECK-NEXT:    vmov.f32 s6, s2
182 ; CHECK-NEXT:    vmov.f32 s7, s3
183 ; CHECK-NEXT:    vstrw.32 q1, [r0]
184 ; CHECK-NEXT:    bx lr
185 entry:
186   %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 1>
187   store <2 x i64> %out, <2 x i64> *%dest, align 8
188   ret void
193 define arm_aapcs_vfpcc void @vmovn32_t1(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
194 ; CHECK-LABEL: vmovn32_t1:
195 ; CHECK:       @ %bb.0: @ %entry
196 ; CHECK-NEXT:    vmov.f32 s1, s4
197 ; CHECK-NEXT:    vmov.f32 s3, s6
198 ; CHECK-NEXT:    vstrw.32 q0, [r0]
199 ; CHECK-NEXT:    bx lr
200 entry:
201   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
202   store <4 x i32> %out, <4 x i32> *%dest, align 8
203   ret void
206 define arm_aapcs_vfpcc void @vmovn32_t2(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
207 ; CHECK-LABEL: vmovn32_t2:
208 ; CHECK:       @ %bb.0: @ %entry
209 ; CHECK-NEXT:    vmov.f32 s5, s0
210 ; CHECK-NEXT:    vmov.f32 s7, s2
211 ; CHECK-NEXT:    vstrw.32 q1, [r0]
212 ; CHECK-NEXT:    bx lr
213 entry:
214   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
215   store <4 x i32> %out, <4 x i32> *%dest, align 8
216   ret void
219 define arm_aapcs_vfpcc void @vmovn32_b1(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
220 ; CHECK-LABEL: vmovn32_b1:
221 ; CHECK:       @ %bb.0: @ %entry
222 ; CHECK-NEXT:    vmov.f32 s1, s5
223 ; CHECK-NEXT:    vmov.f32 s3, s7
224 ; CHECK-NEXT:    vstrw.32 q0, [r0]
225 ; CHECK-NEXT:    bx lr
226 entry:
227   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
228   store <4 x i32> %out, <4 x i32> *%dest, align 8
229   ret void
232 define arm_aapcs_vfpcc void @vmovn32_b2(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
233 ; CHECK-LABEL: vmovn32_b2:
234 ; CHECK:       @ %bb.0: @ %entry
235 ; CHECK-NEXT:    vmov.f32 s4, s5
236 ; CHECK-NEXT:    vmov.f32 s6, s7
237 ; CHECK-NEXT:    vmov.f32 s5, s0
238 ; CHECK-NEXT:    vmov.f32 s7, s2
239 ; CHECK-NEXT:    vstrw.32 q1, [r0]
240 ; CHECK-NEXT:    bx lr
241 entry:
242   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 5, i32 0, i32 7, i32 2>
243   store <4 x i32> %out, <4 x i32> *%dest, align 8
244   ret void
247 define arm_aapcs_vfpcc void @vmovn32_b3(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
248 ; CHECK-LABEL: vmovn32_b3:
249 ; CHECK:       @ %bb.0: @ %entry
250 ; CHECK-NEXT:    vmov.f32 s0, s1
251 ; CHECK-NEXT:    vmov.f32 s2, s3
252 ; CHECK-NEXT:    vmov.f32 s1, s4
253 ; CHECK-NEXT:    vmov.f32 s3, s6
254 ; CHECK-NEXT:    vstrw.32 q0, [r0]
255 ; CHECK-NEXT:    bx lr
256 entry:
257   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 1, i32 4, i32 3, i32 6>
258   store <4 x i32> %out, <4 x i32> *%dest, align 8
259   ret void
262 define arm_aapcs_vfpcc void @vmovn32_b4(<4 x i32> %src1, <4 x i32> %src2, <4 x i32> *%dest) {
263 ; CHECK-LABEL: vmovn32_b4:
264 ; CHECK:       @ %bb.0: @ %entry
265 ; CHECK-NEXT:    vmov.f32 s5, s1
266 ; CHECK-NEXT:    vmov.f32 s7, s3
267 ; CHECK-NEXT:    vstrw.32 q1, [r0]
268 ; CHECK-NEXT:    bx lr
269 entry:
270   %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
271   store <4 x i32> %out, <4 x i32> *%dest, align 8
272   ret void
278 define arm_aapcs_vfpcc void @vmovn16_t1(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
279 ; CHECK-LABEL: vmovn16_t1:
280 ; CHECK:       @ %bb.0: @ %entry
281 ; CHECK-NEXT:    vmovnt.i32 q0, q1
282 ; CHECK-NEXT:    vstrw.32 q0, [r0]
283 ; CHECK-NEXT:    bx lr
284 entry:
285   %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>
286   store <8 x i16> %out, <8 x i16> *%dest, align 8
287   ret void
290 define arm_aapcs_vfpcc void @vmovn16_t2(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
291 ; CHECK-LABEL: vmovn16_t2:
292 ; CHECK:       @ %bb.0: @ %entry
293 ; CHECK-NEXT:    vmovnt.i32 q1, q0
294 ; CHECK-NEXT:    vstrw.32 q1, [r0]
295 ; CHECK-NEXT:    bx lr
296 entry:
297   %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>
298   store <8 x i16> %out, <8 x i16> *%dest, align 8
299   ret void
302 define arm_aapcs_vfpcc void @vmovn16_b1(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
303 ; CHECK-LABEL: vmovn16_b1:
304 ; CHECK:       @ %bb.0: @ %entry
305 ; CHECK-NEXT:    vmovnb.i32 q1, q0
306 ; CHECK-NEXT:    vstrw.32 q1, [r0]
307 ; CHECK-NEXT:    bx lr
308 entry:
309   %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>
310   store <8 x i16> %out, <8 x i16> *%dest, align 8
311   ret void
314 define arm_aapcs_vfpcc void @vmovn16_b2(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
315 ; CHECK-LABEL: vmovn16_b2:
316 ; CHECK:       @ %bb.0: @ %entry
317 ; CHECK-NEXT:    vmovx.f16 s5, s5
318 ; CHECK-NEXT:    vmovx.f16 s4, s4
319 ; CHECK-NEXT:    vmovx.f16 s6, s6
320 ; CHECK-NEXT:    vmovx.f16 s7, s7
321 ; CHECK-NEXT:    vins.f16 s5, s1
322 ; CHECK-NEXT:    vins.f16 s4, s0
323 ; CHECK-NEXT:    vins.f16 s6, s2
324 ; CHECK-NEXT:    vins.f16 s7, s3
325 ; CHECK-NEXT:    vstrw.32 q1, [r0]
326 ; CHECK-NEXT:    bx lr
327 entry:
328   %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>
329   store <8 x i16> %out, <8 x i16> *%dest, align 8
330   ret void
333 define arm_aapcs_vfpcc void @vmovn16_b3(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
334 ; CHECK-LABEL: vmovn16_b3:
335 ; CHECK:       @ %bb.0: @ %entry
336 ; CHECK-NEXT:    vmovx.f16 s1, s1
337 ; CHECK-NEXT:    vmovx.f16 s0, s0
338 ; CHECK-NEXT:    vmovx.f16 s2, s2
339 ; CHECK-NEXT:    vmovx.f16 s3, s3
340 ; CHECK-NEXT:    vins.f16 s1, s5
341 ; CHECK-NEXT:    vins.f16 s0, s4
342 ; CHECK-NEXT:    vins.f16 s2, s6
343 ; CHECK-NEXT:    vins.f16 s3, s7
344 ; CHECK-NEXT:    vstrw.32 q0, [r0]
345 ; CHECK-NEXT:    bx lr
346 entry:
347   %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>
348   store <8 x i16> %out, <8 x i16> *%dest, align 8
349   ret void
352 define arm_aapcs_vfpcc void @vmovn16_b4(<8 x i16> %src1, <8 x i16> %src2, <8 x i16> *%dest) {
353 ; CHECK-LABEL: vmovn16_b4:
354 ; CHECK:       @ %bb.0: @ %entry
355 ; CHECK-NEXT:    vmovnb.i32 q0, q1
356 ; CHECK-NEXT:    vstrw.32 q0, [r0]
357 ; CHECK-NEXT:    bx lr
358 entry:
359   %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>
360   store <8 x i16> %out, <8 x i16> *%dest, align 8
361   ret void
365 define arm_aapcs_vfpcc void @vmovn8_b1(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
366 ; CHECK-LABEL: vmovn8_b1:
367 ; CHECK:       @ %bb.0: @ %entry
368 ; CHECK-NEXT:    vmovnt.i16 q0, q1
369 ; CHECK-NEXT:    vstrw.32 q0, [r0]
370 ; CHECK-NEXT:    bx lr
371 entry:
372   %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>
373   store <16 x i8> %out, <16 x i8> *%dest, align 8
374   ret void
377 define arm_aapcs_vfpcc void @vmovn8_b2(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
378 ; CHECK-LABEL: vmovn8_b2:
379 ; CHECK:       @ %bb.0: @ %entry
380 ; CHECK-NEXT:    vmovnt.i16 q1, q0
381 ; CHECK-NEXT:    vstrw.32 q1, [r0]
382 ; CHECK-NEXT:    bx lr
383 entry:
384   %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>
385   store <16 x i8> %out, <16 x i8> *%dest, align 8
386   ret void
389 define arm_aapcs_vfpcc void @vmovn8_t1(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
390 ; CHECK-LABEL: vmovn8_t1:
391 ; CHECK:       @ %bb.0: @ %entry
392 ; CHECK-NEXT:    vmovnb.i16 q1, q0
393 ; CHECK-NEXT:    vstrw.32 q1, [r0]
394 ; CHECK-NEXT:    bx lr
395 entry:
396   %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>
397   store <16 x i8> %out, <16 x i8> *%dest, align 8
398   ret void
401 define arm_aapcs_vfpcc void @vmovn8_t2(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
402 ; CHECK-LABEL: vmovn8_t2:
403 ; CHECK:       @ %bb.0: @ %entry
404 ; CHECK-NEXT:    vmov.u8 r1, q1[1]
405 ; CHECK-NEXT:    vmov.8 q2[0], r1
406 ; CHECK-NEXT:    vmov.u8 r1, q0[0]
407 ; CHECK-NEXT:    vmov.8 q2[1], r1
408 ; CHECK-NEXT:    vmov.u8 r1, q1[3]
409 ; CHECK-NEXT:    vmov.8 q2[2], r1
410 ; CHECK-NEXT:    vmov.u8 r1, q0[2]
411 ; CHECK-NEXT:    vmov.8 q2[3], r1
412 ; CHECK-NEXT:    vmov.u8 r1, q1[5]
413 ; CHECK-NEXT:    vmov.8 q2[4], r1
414 ; CHECK-NEXT:    vmov.u8 r1, q0[4]
415 ; CHECK-NEXT:    vmov.8 q2[5], r1
416 ; CHECK-NEXT:    vmov.u8 r1, q1[7]
417 ; CHECK-NEXT:    vmov.8 q2[6], r1
418 ; CHECK-NEXT:    vmov.u8 r1, q0[6]
419 ; CHECK-NEXT:    vmov.8 q2[7], r1
420 ; CHECK-NEXT:    vmov.u8 r1, q1[9]
421 ; CHECK-NEXT:    vmov.8 q2[8], r1
422 ; CHECK-NEXT:    vmov.u8 r1, q0[8]
423 ; CHECK-NEXT:    vmov.8 q2[9], r1
424 ; CHECK-NEXT:    vmov.u8 r1, q1[11]
425 ; CHECK-NEXT:    vmov.8 q2[10], r1
426 ; CHECK-NEXT:    vmov.u8 r1, q0[10]
427 ; CHECK-NEXT:    vmov.8 q2[11], r1
428 ; CHECK-NEXT:    vmov.u8 r1, q1[13]
429 ; CHECK-NEXT:    vmov.8 q2[12], r1
430 ; CHECK-NEXT:    vmov.u8 r1, q0[12]
431 ; CHECK-NEXT:    vmov.8 q2[13], r1
432 ; CHECK-NEXT:    vmov.u8 r1, q1[15]
433 ; CHECK-NEXT:    vmov.8 q2[14], r1
434 ; CHECK-NEXT:    vmov.u8 r1, q0[14]
435 ; CHECK-NEXT:    vmov.8 q2[15], r1
436 ; CHECK-NEXT:    vstrw.32 q2, [r0]
437 ; CHECK-NEXT:    bx lr
438 entry:
439   %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>
440   store <16 x i8> %out, <16 x i8> *%dest, align 8
441   ret void
444 define arm_aapcs_vfpcc void @vmovn8_t3(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
445 ; CHECK-LABEL: vmovn8_t3:
446 ; CHECK:       @ %bb.0: @ %entry
447 ; CHECK-NEXT:    vmov.u8 r1, q0[1]
448 ; CHECK-NEXT:    vmov.8 q2[0], r1
449 ; CHECK-NEXT:    vmov.u8 r1, q1[0]
450 ; CHECK-NEXT:    vmov.8 q2[1], r1
451 ; CHECK-NEXT:    vmov.u8 r1, q0[3]
452 ; CHECK-NEXT:    vmov.8 q2[2], r1
453 ; CHECK-NEXT:    vmov.u8 r1, q1[2]
454 ; CHECK-NEXT:    vmov.8 q2[3], r1
455 ; CHECK-NEXT:    vmov.u8 r1, q0[5]
456 ; CHECK-NEXT:    vmov.8 q2[4], r1
457 ; CHECK-NEXT:    vmov.u8 r1, q1[4]
458 ; CHECK-NEXT:    vmov.8 q2[5], r1
459 ; CHECK-NEXT:    vmov.u8 r1, q0[7]
460 ; CHECK-NEXT:    vmov.8 q2[6], r1
461 ; CHECK-NEXT:    vmov.u8 r1, q1[6]
462 ; CHECK-NEXT:    vmov.8 q2[7], r1
463 ; CHECK-NEXT:    vmov.u8 r1, q0[9]
464 ; CHECK-NEXT:    vmov.8 q2[8], r1
465 ; CHECK-NEXT:    vmov.u8 r1, q1[8]
466 ; CHECK-NEXT:    vmov.8 q2[9], r1
467 ; CHECK-NEXT:    vmov.u8 r1, q0[11]
468 ; CHECK-NEXT:    vmov.8 q2[10], r1
469 ; CHECK-NEXT:    vmov.u8 r1, q1[10]
470 ; CHECK-NEXT:    vmov.8 q2[11], r1
471 ; CHECK-NEXT:    vmov.u8 r1, q0[13]
472 ; CHECK-NEXT:    vmov.8 q2[12], r1
473 ; CHECK-NEXT:    vmov.u8 r1, q1[12]
474 ; CHECK-NEXT:    vmov.8 q2[13], r1
475 ; CHECK-NEXT:    vmov.u8 r1, q0[15]
476 ; CHECK-NEXT:    vmov.8 q2[14], r1
477 ; CHECK-NEXT:    vmov.u8 r1, q1[14]
478 ; CHECK-NEXT:    vmov.8 q2[15], r1
479 ; CHECK-NEXT:    vstrw.32 q2, [r0]
480 ; CHECK-NEXT:    bx lr
481 entry:
482   %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>
483   store <16 x i8> %out, <16 x i8> *%dest, align 8
484   ret void
487 define arm_aapcs_vfpcc void @vmovn8_t4(<16 x i8> %src1, <16 x i8> %src2, <16 x i8> *%dest) {
488 ; CHECK-LABEL: vmovn8_t4:
489 ; CHECK:       @ %bb.0: @ %entry
490 ; CHECK-NEXT:    vmovnb.i16 q0, q1
491 ; CHECK-NEXT:    vstrw.32 q0, [r0]
492 ; CHECK-NEXT:    bx lr
493 entry:
494   %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>
495   store <16 x i8> %out, <16 x i8> *%dest, align 8
496   ret void