1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=armv7a-none-eabihf -mattr=+neon -verify-machineinstrs | FileCheck %s
4 define <16 x i8> @ins16bw(<16 x i8> %tmp1, i8 %tmp2) {
5 ; CHECK-LABEL: ins16bw:
7 ; CHECK-NEXT: vmov.8 d1[7], r0
9 %tmp3 = insertelement <16 x i8> %tmp1, i8 %tmp2, i32 15
13 define <8 x i16> @ins8hw(<8 x i16> %tmp1, i16 %tmp2) {
14 ; CHECK-LABEL: ins8hw:
16 ; CHECK-NEXT: vmov.16 d1[2], r0
18 %tmp3 = insertelement <8 x i16> %tmp1, i16 %tmp2, i32 6
22 define <4 x i32> @ins4sw(<4 x i32> %tmp1, i32 %tmp2) {
23 ; CHECK-LABEL: ins4sw:
25 ; CHECK-NEXT: vmov.32 d1[0], r0
27 %tmp3 = insertelement <4 x i32> %tmp1, i32 %tmp2, i32 2
31 define <2 x i64> @ins2dw(<2 x i64> %tmp1, i64 %tmp2) {
32 ; CHECK-LABEL: ins2dw:
34 ; CHECK-NEXT: vmov.32 d1[0], r0
35 ; CHECK-NEXT: vmov.32 d1[1], r1
37 %tmp3 = insertelement <2 x i64> %tmp1, i64 %tmp2, i32 1
41 define <8 x i8> @ins8bw(<8 x i8> %tmp1, i8 %tmp2) {
42 ; CHECK-LABEL: ins8bw:
44 ; CHECK-NEXT: vmov.8 d0[5], r0
46 %tmp3 = insertelement <8 x i8> %tmp1, i8 %tmp2, i32 5
50 define <4 x i16> @ins4hw(<4 x i16> %tmp1, i16 %tmp2) {
51 ; CHECK-LABEL: ins4hw:
53 ; CHECK-NEXT: vmov.16 d0[3], r0
55 %tmp3 = insertelement <4 x i16> %tmp1, i16 %tmp2, i32 3
59 define <2 x i32> @ins2sw(<2 x i32> %tmp1, i32 %tmp2) {
60 ; CHECK-LABEL: ins2sw:
62 ; CHECK-NEXT: vmov.32 d0[1], r0
64 %tmp3 = insertelement <2 x i32> %tmp1, i32 %tmp2, i32 1
68 define <16 x i8> @ins16b16(<16 x i8> %tmp1, <16 x i8> %tmp2) {
69 ; CHECK-LABEL: ins16b16:
71 ; CHECK-NEXT: vmov.u8 r0, d0[2]
72 ; CHECK-NEXT: vmov.8 d3[7], r0
73 ; CHECK-NEXT: vorr q0, q1, q1
75 %tmp3 = extractelement <16 x i8> %tmp1, i32 2
76 %tmp4 = insertelement <16 x i8> %tmp2, i8 %tmp3, i32 15
80 define <8 x i16> @ins8h8(<8 x i16> %tmp1, <8 x i16> %tmp2) {
81 ; CHECK-LABEL: ins8h8:
83 ; CHECK-NEXT: vmov.u16 r0, d0[2]
84 ; CHECK-NEXT: vmov.16 d3[3], r0
85 ; CHECK-NEXT: vorr q0, q1, q1
87 %tmp3 = extractelement <8 x i16> %tmp1, i32 2
88 %tmp4 = insertelement <8 x i16> %tmp2, i16 %tmp3, i32 7
92 define <4 x i32> @ins4s4(<4 x i32> %tmp1, <4 x i32> %tmp2) {
93 ; CHECK-LABEL: ins4s4:
95 ; CHECK-NEXT: vmov.32 r0, d1[0]
96 ; CHECK-NEXT: vmov.32 d2[1], r0
97 ; CHECK-NEXT: vorr q0, q1, q1
99 %tmp3 = extractelement <4 x i32> %tmp1, i32 2
100 %tmp4 = insertelement <4 x i32> %tmp2, i32 %tmp3, i32 1
104 define <2 x i64> @ins2d2(<2 x i64> %tmp1, <2 x i64> %tmp2) {
105 ; CHECK-LABEL: ins2d2:
107 ; CHECK-NEXT: vmov r0, r1, d0
108 ; CHECK-NEXT: vmov.32 d3[0], r0
109 ; CHECK-NEXT: vmov.32 d3[1], r1
110 ; CHECK-NEXT: vorr q0, q1, q1
112 %tmp3 = extractelement <2 x i64> %tmp1, i32 0
113 %tmp4 = insertelement <2 x i64> %tmp2, i64 %tmp3, i32 1
117 define <4 x float> @ins4f4(<4 x float> %tmp1, <4 x float> %tmp2) {
118 ; CHECK-LABEL: ins4f4:
120 ; CHECK-NEXT: vmov.f32 s5, s2
121 ; CHECK-NEXT: vorr q0, q1, q1
123 %tmp3 = extractelement <4 x float> %tmp1, i32 2
124 %tmp4 = insertelement <4 x float> %tmp2, float %tmp3, i32 1
125 ret <4 x float> %tmp4
128 define <2 x double> @ins2df2(<2 x double> %tmp1, <2 x double> %tmp2) {
129 ; CHECK-LABEL: ins2df2:
131 ; CHECK-NEXT: vorr d3, d0, d0
132 ; CHECK-NEXT: vorr q0, q1, q1
134 %tmp3 = extractelement <2 x double> %tmp1, i32 0
135 %tmp4 = insertelement <2 x double> %tmp2, double %tmp3, i32 1
136 ret <2 x double> %tmp4
139 define <16 x i8> @ins8b16(<8 x i8> %tmp1, <16 x i8> %tmp2) {
140 ; CHECK-LABEL: ins8b16:
142 ; CHECK-NEXT: vmov.u8 r0, d0[2]
143 ; CHECK-NEXT: vmov.8 d3[7], r0
144 ; CHECK-NEXT: vorr q0, q1, q1
146 %tmp3 = extractelement <8 x i8> %tmp1, i32 2
147 %tmp4 = insertelement <16 x i8> %tmp2, i8 %tmp3, i32 15
151 define <8 x i16> @ins4h8(<4 x i16> %tmp1, <8 x i16> %tmp2) {
152 ; CHECK-LABEL: ins4h8:
154 ; CHECK-NEXT: vmov.u16 r0, d0[2]
155 ; CHECK-NEXT: vmov.16 d3[3], r0
156 ; CHECK-NEXT: vorr q0, q1, q1
158 %tmp3 = extractelement <4 x i16> %tmp1, i32 2
159 %tmp4 = insertelement <8 x i16> %tmp2, i16 %tmp3, i32 7
163 define <4 x i32> @ins2s4(<2 x i32> %tmp1, <4 x i32> %tmp2) {
164 ; CHECK-LABEL: ins2s4:
166 ; CHECK-NEXT: vmov.32 r0, d0[1]
167 ; CHECK-NEXT: vmov.32 d2[1], r0
168 ; CHECK-NEXT: vorr q0, q1, q1
170 %tmp3 = extractelement <2 x i32> %tmp1, i32 1
171 %tmp4 = insertelement <4 x i32> %tmp2, i32 %tmp3, i32 1
175 define <2 x i64> @ins1d2(<1 x i64> %tmp1, <2 x i64> %tmp2) {
176 ; CHECK-LABEL: ins1d2:
178 ; CHECK-NEXT: vmov.32 r0, d0[0]
179 ; CHECK-NEXT: vmov.32 r1, d0[1]
180 ; CHECK-NEXT: vmov.32 d3[0], r0
181 ; CHECK-NEXT: vmov.32 d3[1], r1
182 ; CHECK-NEXT: vorr q0, q1, q1
184 %tmp3 = extractelement <1 x i64> %tmp1, i32 0
185 %tmp4 = insertelement <2 x i64> %tmp2, i64 %tmp3, i32 1
189 define <4 x float> @ins2f4(<2 x float> %tmp1, <4 x float> %tmp2) {
190 ; CHECK-LABEL: ins2f4:
192 ; CHECK-NEXT: vmov.f32 s5, s1
193 ; CHECK-NEXT: vorr q0, q1, q1
195 %tmp3 = extractelement <2 x float> %tmp1, i32 1
196 %tmp4 = insertelement <4 x float> %tmp2, float %tmp3, i32 1
197 ret <4 x float> %tmp4
200 define <2 x double> @ins1f2(<1 x double> %tmp1, <2 x double> %tmp2) {
201 ; CHECK-LABEL: ins1f2:
203 ; CHECK-NEXT: vorr d3, d0, d0
204 ; CHECK-NEXT: vorr q0, q1, q1
206 %tmp3 = extractelement <1 x double> %tmp1, i32 0
207 %tmp4 = insertelement <2 x double> %tmp2, double %tmp3, i32 1
208 ret <2 x double> %tmp4
211 define <2 x double> @ins1f2_args_flipped(<2 x double> %tmp2, <1 x double> %tmp1) {
212 ; CHECK-LABEL: ins1f2_args_flipped:
214 ; CHECK-NEXT: vmov.f64 d1, d2
216 %tmp3 = extractelement <1 x double> %tmp1, i32 0
217 %tmp4 = insertelement <2 x double> %tmp2, double %tmp3, i32 1
218 ret <2 x double> %tmp4
221 define <8 x i8> @ins16b8(<16 x i8> %tmp1, <8 x i8> %tmp2) {
222 ; CHECK-LABEL: ins16b8:
224 ; CHECK-NEXT: vmov.u8 r0, d0[2]
225 ; CHECK-NEXT: vmov.8 d2[7], r0
226 ; CHECK-NEXT: vorr d0, d2, d2
228 %tmp3 = extractelement <16 x i8> %tmp1, i32 2
229 %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 7
233 define <4 x i16> @ins8h4(<8 x i16> %tmp1, <4 x i16> %tmp2) {
234 ; CHECK-LABEL: ins8h4:
236 ; CHECK-NEXT: vmov.u16 r0, d0[2]
237 ; CHECK-NEXT: vmov.16 d2[3], r0
238 ; CHECK-NEXT: vorr d0, d2, d2
240 %tmp3 = extractelement <8 x i16> %tmp1, i32 2
241 %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 3
245 define <2 x i32> @ins4s2(<4 x i32> %tmp1, <2 x i32> %tmp2) {
246 ; CHECK-LABEL: ins4s2:
248 ; CHECK-NEXT: vmov.32 r0, d1[0]
249 ; CHECK-NEXT: vmov.32 d2[1], r0
250 ; CHECK-NEXT: vorr d0, d2, d2
252 %tmp3 = extractelement <4 x i32> %tmp1, i32 2
253 %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
257 define <1 x i64> @ins2d1(<2 x i64> %tmp1, <1 x i64> %tmp2) {
258 ; CHECK-LABEL: ins2d1:
260 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0
262 %tmp3 = extractelement <2 x i64> %tmp1, i32 0
263 %tmp4 = insertelement <1 x i64> %tmp2, i64 %tmp3, i32 0
267 define <2 x float> @ins4f2(<4 x float> %tmp1, <2 x float> %tmp2) {
268 ; CHECK-LABEL: ins4f2:
270 ; CHECK-NEXT: vmov.f32 s5, s2
271 ; CHECK-NEXT: vmov.f64 d0, d2
273 %tmp3 = extractelement <4 x float> %tmp1, i32 2
274 %tmp4 = insertelement <2 x float> %tmp2, float %tmp3, i32 1
275 ret <2 x float> %tmp4
278 define <1 x double> @ins2f1(<2 x double> %tmp1, <1 x double> %tmp2) {
279 ; CHECK-LABEL: ins2f1:
281 ; CHECK-NEXT: vmov.f64 d0, d1
283 %tmp3 = extractelement <2 x double> %tmp1, i32 1
284 %tmp4 = insertelement <1 x double> %tmp2, double %tmp3, i32 0
285 ret <1 x double> %tmp4
288 define <8 x i8> @ins8b8(<8 x i8> %tmp1, <8 x i8> %tmp2) {
289 ; CHECK-LABEL: ins8b8:
291 ; CHECK-NEXT: vmov.u8 r0, d0[2]
292 ; CHECK-NEXT: vmov.8 d1[4], r0
293 ; CHECK-NEXT: vorr d0, d1, d1
295 %tmp3 = extractelement <8 x i8> %tmp1, i32 2
296 %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 4
300 define <4 x i16> @ins4h4(<4 x i16> %tmp1, <4 x i16> %tmp2) {
301 ; CHECK-LABEL: ins4h4:
303 ; CHECK-NEXT: vmov.u16 r0, d0[2]
304 ; CHECK-NEXT: vmov.16 d1[3], r0
305 ; CHECK-NEXT: vorr d0, d1, d1
307 %tmp3 = extractelement <4 x i16> %tmp1, i32 2
308 %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 3
312 define <2 x i32> @ins2s2(<2 x i32> %tmp1, <2 x i32> %tmp2) {
313 ; CHECK-LABEL: ins2s2:
315 ; CHECK-NEXT: vmov.32 r0, d0[0]
316 ; CHECK-NEXT: vmov.32 d1[1], r0
317 ; CHECK-NEXT: vorr d0, d1, d1
319 %tmp3 = extractelement <2 x i32> %tmp1, i32 0
320 %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
324 define <1 x i64> @ins1d1(<1 x i64> %tmp1, <1 x i64> %tmp2) {
325 ; CHECK-LABEL: ins1d1:
328 %tmp3 = extractelement <1 x i64> %tmp1, i32 0
329 %tmp4 = insertelement <1 x i64> %tmp2, i64 %tmp3, i32 0
333 define <2 x float> @ins2f2(<2 x float> %tmp1, <2 x float> %tmp2) {
334 ; CHECK-LABEL: ins2f2:
336 ; CHECK-NEXT: vmov.f32 s3, s0
337 ; CHECK-NEXT: vmov.f64 d0, d1
339 %tmp3 = extractelement <2 x float> %tmp1, i32 0
340 %tmp4 = insertelement <2 x float> %tmp2, float %tmp3, i32 1
341 ret <2 x float> %tmp4
344 define <1 x double> @ins1df1(<1 x double> %tmp1, <1 x double> %tmp2) {
345 ; CHECK-LABEL: ins1df1:
348 %tmp3 = extractelement <1 x double> %tmp1, i32 0
349 %tmp4 = insertelement <1 x double> %tmp2, double %tmp3, i32 0
350 ret <1 x double> %tmp4
353 define i32 @umovw16b(<16 x i8> %tmp1) {
354 ; CHECK-LABEL: umovw16b:
356 ; CHECK-NEXT: vmov.u8 r0, d1[0]
358 %tmp3 = extractelement <16 x i8> %tmp1, i32 8
359 %tmp4 = zext i8 %tmp3 to i32
363 define i32 @umovw8h(<8 x i16> %tmp1) {
364 ; CHECK-LABEL: umovw8h:
366 ; CHECK-NEXT: vmov.u16 r0, d0[2]
368 %tmp3 = extractelement <8 x i16> %tmp1, i32 2
369 %tmp4 = zext i16 %tmp3 to i32
373 define i32 @umovw4s(<4 x i32> %tmp1) {
374 ; CHECK-LABEL: umovw4s:
376 ; CHECK-NEXT: vmov.32 r0, d1[0]
378 %tmp3 = extractelement <4 x i32> %tmp1, i32 2
382 define i64 @umovx2d(<2 x i64> %tmp1) {
383 ; CHECK-LABEL: umovx2d:
385 ; CHECK-NEXT: vmov r0, r1, d1
387 %tmp3 = extractelement <2 x i64> %tmp1, i32 1
391 define i32 @umovw8b(<8 x i8> %tmp1) {
392 ; CHECK-LABEL: umovw8b:
394 ; CHECK-NEXT: vmov.u8 r0, d0[7]
396 %tmp3 = extractelement <8 x i8> %tmp1, i32 7
397 %tmp4 = zext i8 %tmp3 to i32
401 define i32 @umovw4h(<4 x i16> %tmp1) {
402 ; CHECK-LABEL: umovw4h:
404 ; CHECK-NEXT: vmov.u16 r0, d0[2]
406 %tmp3 = extractelement <4 x i16> %tmp1, i32 2
407 %tmp4 = zext i16 %tmp3 to i32
411 define i32 @umovw2s(<2 x i32> %tmp1) {
412 ; CHECK-LABEL: umovw2s:
414 ; CHECK-NEXT: vmov.32 r0, d0[1]
416 %tmp3 = extractelement <2 x i32> %tmp1, i32 1
420 define i64 @umovx1d(<1 x i64> %tmp1) {
421 ; CHECK-LABEL: umovx1d:
423 ; CHECK-NEXT: vmov.32 r0, d0[0]
424 ; CHECK-NEXT: vmov.32 r1, d0[1]
426 %tmp3 = extractelement <1 x i64> %tmp1, i32 0
430 define i32 @smovw16b(<16 x i8> %tmp1) {
431 ; CHECK-LABEL: smovw16b:
433 ; CHECK-NEXT: vmov.s8 r0, d1[0]
434 ; CHECK-NEXT: add r0, r0, r0
436 %tmp3 = extractelement <16 x i8> %tmp1, i32 8
437 %tmp4 = sext i8 %tmp3 to i32
438 %tmp5 = add i32 %tmp4, %tmp4
442 define i32 @smovw8h(<8 x i16> %tmp1) {
443 ; CHECK-LABEL: smovw8h:
445 ; CHECK-NEXT: vmov.s16 r0, d0[2]
446 ; CHECK-NEXT: add r0, r0, r0
448 %tmp3 = extractelement <8 x i16> %tmp1, i32 2
449 %tmp4 = sext i16 %tmp3 to i32
450 %tmp5 = add i32 %tmp4, %tmp4
454 define i64 @smovx16b(<16 x i8> %tmp1) {
455 ; CHECK-LABEL: smovx16b:
457 ; CHECK-NEXT: vmov.s8 r0, d1[0]
458 ; CHECK-NEXT: asr r1, r0, #31
460 %tmp3 = extractelement <16 x i8> %tmp1, i32 8
461 %tmp4 = sext i8 %tmp3 to i64
465 define i64 @smovx8h(<8 x i16> %tmp1) {
466 ; CHECK-LABEL: smovx8h:
468 ; CHECK-NEXT: vmov.s16 r0, d0[2]
469 ; CHECK-NEXT: asr r1, r0, #31
471 %tmp3 = extractelement <8 x i16> %tmp1, i32 2
472 %tmp4 = sext i16 %tmp3 to i64
476 define i64 @smovx4s(<4 x i32> %tmp1) {
477 ; CHECK-LABEL: smovx4s:
479 ; CHECK-NEXT: vmov.32 r0, d1[0]
480 ; CHECK-NEXT: asr r1, r0, #31
482 %tmp3 = extractelement <4 x i32> %tmp1, i32 2
483 %tmp4 = sext i32 %tmp3 to i64
487 define i32 @smovw8b(<8 x i8> %tmp1) {
488 ; CHECK-LABEL: smovw8b:
490 ; CHECK-NEXT: vmov.s8 r0, d0[4]
491 ; CHECK-NEXT: add r0, r0, r0
493 %tmp3 = extractelement <8 x i8> %tmp1, i32 4
494 %tmp4 = sext i8 %tmp3 to i32
495 %tmp5 = add i32 %tmp4, %tmp4
499 define i32 @smovw4h(<4 x i16> %tmp1) {
500 ; CHECK-LABEL: smovw4h:
502 ; CHECK-NEXT: vmov.s16 r0, d0[2]
503 ; CHECK-NEXT: add r0, r0, r0
505 %tmp3 = extractelement <4 x i16> %tmp1, i32 2
506 %tmp4 = sext i16 %tmp3 to i32
507 %tmp5 = add i32 %tmp4, %tmp4
511 define i32 @smovx8b(<8 x i8> %tmp1) {
512 ; CHECK-LABEL: smovx8b:
514 ; CHECK-NEXT: vmov.s8 r0, d0[6]
516 %tmp3 = extractelement <8 x i8> %tmp1, i32 6
517 %tmp4 = sext i8 %tmp3 to i32
521 define i32 @smovx4h(<4 x i16> %tmp1) {
522 ; CHECK-LABEL: smovx4h:
524 ; CHECK-NEXT: vmov.s16 r0, d0[2]
526 %tmp3 = extractelement <4 x i16> %tmp1, i32 2
527 %tmp4 = sext i16 %tmp3 to i32
531 define i64 @smovx2s(<2 x i32> %tmp1) {
532 ; CHECK-LABEL: smovx2s:
534 ; CHECK-NEXT: vmov.32 r0, d0[1]
535 ; CHECK-NEXT: asr r1, r0, #31
537 %tmp3 = extractelement <2 x i32> %tmp1, i32 1
538 %tmp4 = sext i32 %tmp3 to i64
542 define <8 x i8> @test_vcopy_lane_s8(<8 x i8> %v1, <8 x i8> %v2) {
543 ; CHECK-LABEL: test_vcopy_lane_s8:
545 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
546 ; CHECK-NEXT: vldr d16, .LCPI50_0
547 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
548 ; CHECK-NEXT: vtbl.8 d0, {d0, d1}, d16
550 ; CHECK-NEXT: .p2align 3
551 ; CHECK-NEXT: @ %bb.1:
552 ; CHECK-NEXT: .LCPI50_0:
553 ; CHECK-NEXT: .byte 0 @ 0x0
554 ; CHECK-NEXT: .byte 1 @ 0x1
555 ; CHECK-NEXT: .byte 2 @ 0x2
556 ; CHECK-NEXT: .byte 3 @ 0x3
557 ; CHECK-NEXT: .byte 4 @ 0x4
558 ; CHECK-NEXT: .byte 11 @ 0xb
559 ; CHECK-NEXT: .byte 6 @ 0x6
560 ; CHECK-NEXT: .byte 7 @ 0x7
561 %vset_lane = shufflevector <8 x i8> %v1, <8 x i8> %v2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 11, i32 6, i32 7>
562 ret <8 x i8> %vset_lane
565 define <16 x i8> @test_vcopyq_laneq_s8(<16 x i8> %v1, <16 x i8> %v2) {
566 ; CHECK-LABEL: test_vcopyq_laneq_s8:
568 ; CHECK-NEXT: @ kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
569 ; CHECK-NEXT: vldr d16, .LCPI51_0
570 ; CHECK-NEXT: @ kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
571 ; CHECK-NEXT: vtbl.8 d1, {d1, d2}, d16
572 ; CHECK-NEXT: @ kill: def $q0 killed $q0 killed $q0_q1
574 ; CHECK-NEXT: .p2align 3
575 ; CHECK-NEXT: @ %bb.1:
576 ; CHECK-NEXT: .LCPI51_0:
577 ; CHECK-NEXT: .byte 0 @ 0x0
578 ; CHECK-NEXT: .byte 1 @ 0x1
579 ; CHECK-NEXT: .byte 2 @ 0x2
580 ; CHECK-NEXT: .byte 3 @ 0x3
581 ; CHECK-NEXT: .byte 4 @ 0x4
582 ; CHECK-NEXT: .byte 5 @ 0x5
583 ; CHECK-NEXT: .byte 14 @ 0xe
584 ; CHECK-NEXT: .byte 7 @ 0x7
585 %vset_lane = shufflevector <16 x i8> %v1, <16 x i8> %v2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 22, i32 15>
586 ret <16 x i8> %vset_lane
589 define <8 x i8> @test_vcopy_lane_swap_s8(<8 x i8> %v1, <8 x i8> %v2) {
590 ; CHECK-LABEL: test_vcopy_lane_swap_s8:
592 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
593 ; CHECK-NEXT: vldr d16, .LCPI52_0
594 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
595 ; CHECK-NEXT: vtbl.8 d0, {d0, d1}, d16
597 ; CHECK-NEXT: .p2align 3
598 ; CHECK-NEXT: @ %bb.1:
599 ; CHECK-NEXT: .LCPI52_0:
600 ; CHECK-NEXT: .byte 8 @ 0x8
601 ; CHECK-NEXT: .byte 9 @ 0x9
602 ; CHECK-NEXT: .byte 10 @ 0xa
603 ; CHECK-NEXT: .byte 11 @ 0xb
604 ; CHECK-NEXT: .byte 12 @ 0xc
605 ; CHECK-NEXT: .byte 13 @ 0xd
606 ; CHECK-NEXT: .byte 14 @ 0xe
607 ; CHECK-NEXT: .byte 0 @ 0x0
608 %vset_lane = shufflevector <8 x i8> %v1, <8 x i8> %v2, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 0>
609 ret <8 x i8> %vset_lane
612 define <16 x i8> @test_vcopyq_laneq_swap_s8(<16 x i8> %v1, <16 x i8> %v2) {
613 ; CHECK-LABEL: test_vcopyq_laneq_swap_s8:
615 ; CHECK-NEXT: @ kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
616 ; CHECK-NEXT: vldr d16, .LCPI53_0
617 ; CHECK-NEXT: @ kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
618 ; CHECK-NEXT: vtbl.8 d2, {d1, d2}, d16
619 ; CHECK-NEXT: vorr q0, q1, q1
621 ; CHECK-NEXT: .p2align 3
622 ; CHECK-NEXT: @ %bb.1:
623 ; CHECK-NEXT: .LCPI53_0:
624 ; CHECK-NEXT: .byte 7 @ 0x7
625 ; CHECK-NEXT: .byte 9 @ 0x9
626 ; CHECK-NEXT: .byte 10 @ 0xa
627 ; CHECK-NEXT: .byte 11 @ 0xb
628 ; CHECK-NEXT: .byte 12 @ 0xc
629 ; CHECK-NEXT: .byte 13 @ 0xd
630 ; CHECK-NEXT: .byte 14 @ 0xe
631 ; CHECK-NEXT: .byte 15 @ 0xf
632 %vset_lane = shufflevector <16 x i8> %v1, <16 x i8> %v2, <16 x i32> <i32 15, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
633 ret <16 x i8> %vset_lane
636 define <8 x i8> @test_vdup_n_u8(i8 %v1) #0 {
637 ; CHECK-LABEL: test_vdup_n_u8:
639 ; CHECK-NEXT: vdup.8 d0, r0
641 %vecinit.i = insertelement <8 x i8> undef, i8 %v1, i32 0
642 %vecinit1.i = insertelement <8 x i8> %vecinit.i, i8 %v1, i32 1
643 %vecinit2.i = insertelement <8 x i8> %vecinit1.i, i8 %v1, i32 2
644 %vecinit3.i = insertelement <8 x i8> %vecinit2.i, i8 %v1, i32 3
645 %vecinit4.i = insertelement <8 x i8> %vecinit3.i, i8 %v1, i32 4
646 %vecinit5.i = insertelement <8 x i8> %vecinit4.i, i8 %v1, i32 5
647 %vecinit6.i = insertelement <8 x i8> %vecinit5.i, i8 %v1, i32 6
648 %vecinit7.i = insertelement <8 x i8> %vecinit6.i, i8 %v1, i32 7
649 ret <8 x i8> %vecinit7.i
652 define <4 x i16> @test_vdup_n_u16(i16 %v1) #0 {
653 ; CHECK-LABEL: test_vdup_n_u16:
655 ; CHECK-NEXT: vdup.16 d0, r0
657 %vecinit.i = insertelement <4 x i16> undef, i16 %v1, i32 0
658 %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %v1, i32 1
659 %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %v1, i32 2
660 %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %v1, i32 3
661 ret <4 x i16> %vecinit3.i
664 define <2 x i32> @test_vdup_n_u32(i32 %v1) #0 {
665 ; CHECK-LABEL: test_vdup_n_u32:
667 ; CHECK-NEXT: vdup.32 d0, r0
669 %vecinit.i = insertelement <2 x i32> undef, i32 %v1, i32 0
670 %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %v1, i32 1
671 ret <2 x i32> %vecinit1.i
674 define <1 x i64> @test_vdup_n_u64(i64 %v1) #0 {
675 ; CHECK-LABEL: test_vdup_n_u64:
677 ; CHECK-NEXT: vmov.32 d0[0], r0
678 ; CHECK-NEXT: vmov.32 d0[1], r1
680 %vecinit.i = insertelement <1 x i64> undef, i64 %v1, i32 0
681 ret <1 x i64> %vecinit.i
684 define <16 x i8> @test_vdupq_n_u8(i8 %v1) #0 {
685 ; CHECK-LABEL: test_vdupq_n_u8:
687 ; CHECK-NEXT: vdup.8 q0, r0
689 %vecinit.i = insertelement <16 x i8> undef, i8 %v1, i32 0
690 %vecinit1.i = insertelement <16 x i8> %vecinit.i, i8 %v1, i32 1
691 %vecinit2.i = insertelement <16 x i8> %vecinit1.i, i8 %v1, i32 2
692 %vecinit3.i = insertelement <16 x i8> %vecinit2.i, i8 %v1, i32 3
693 %vecinit4.i = insertelement <16 x i8> %vecinit3.i, i8 %v1, i32 4
694 %vecinit5.i = insertelement <16 x i8> %vecinit4.i, i8 %v1, i32 5
695 %vecinit6.i = insertelement <16 x i8> %vecinit5.i, i8 %v1, i32 6
696 %vecinit7.i = insertelement <16 x i8> %vecinit6.i, i8 %v1, i32 7
697 %vecinit8.i = insertelement <16 x i8> %vecinit7.i, i8 %v1, i32 8
698 %vecinit9.i = insertelement <16 x i8> %vecinit8.i, i8 %v1, i32 9
699 %vecinit10.i = insertelement <16 x i8> %vecinit9.i, i8 %v1, i32 10
700 %vecinit11.i = insertelement <16 x i8> %vecinit10.i, i8 %v1, i32 11
701 %vecinit12.i = insertelement <16 x i8> %vecinit11.i, i8 %v1, i32 12
702 %vecinit13.i = insertelement <16 x i8> %vecinit12.i, i8 %v1, i32 13
703 %vecinit14.i = insertelement <16 x i8> %vecinit13.i, i8 %v1, i32 14
704 %vecinit15.i = insertelement <16 x i8> %vecinit14.i, i8 %v1, i32 15
705 ret <16 x i8> %vecinit15.i
708 define <8 x i16> @test_vdupq_n_u16(i16 %v1) #0 {
709 ; CHECK-LABEL: test_vdupq_n_u16:
711 ; CHECK-NEXT: vdup.16 q0, r0
713 %vecinit.i = insertelement <8 x i16> undef, i16 %v1, i32 0
714 %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %v1, i32 1
715 %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %v1, i32 2
716 %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %v1, i32 3
717 %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %v1, i32 4
718 %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %v1, i32 5
719 %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %v1, i32 6
720 %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %v1, i32 7
721 ret <8 x i16> %vecinit7.i
724 define <4 x i32> @test_vdupq_n_u32(i32 %v1) #0 {
725 ; CHECK-LABEL: test_vdupq_n_u32:
727 ; CHECK-NEXT: vdup.32 q0, r0
729 %vecinit.i = insertelement <4 x i32> undef, i32 %v1, i32 0
730 %vecinit1.i = insertelement <4 x i32> %vecinit.i, i32 %v1, i32 1
731 %vecinit2.i = insertelement <4 x i32> %vecinit1.i, i32 %v1, i32 2
732 %vecinit3.i = insertelement <4 x i32> %vecinit2.i, i32 %v1, i32 3
733 ret <4 x i32> %vecinit3.i
736 define <2 x i64> @test_vdupq_n_u64(i64 %v1) #0 {
737 ; CHECK-LABEL: test_vdupq_n_u64:
739 ; CHECK-NEXT: vmov.32 d0[0], r0
740 ; CHECK-NEXT: vmov.32 d0[1], r1
741 ; CHECK-NEXT: vorr d1, d0, d0
743 %vecinit.i = insertelement <2 x i64> undef, i64 %v1, i32 0
744 %vecinit1.i = insertelement <2 x i64> %vecinit.i, i64 %v1, i32 1
745 ret <2 x i64> %vecinit1.i
748 define <8 x i8> @test_vdup_lane_s8(<8 x i8> %v1) #0 {
749 ; CHECK-LABEL: test_vdup_lane_s8:
751 ; CHECK-NEXT: vdup.8 d0, d0[5]
753 %shuffle = shufflevector <8 x i8> %v1, <8 x i8> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
754 ret <8 x i8> %shuffle
757 define <4 x i16> @test_vdup_lane_s16(<4 x i16> %v1) #0 {
758 ; CHECK-LABEL: test_vdup_lane_s16:
760 ; CHECK-NEXT: vdup.16 d0, d0[2]
762 %shuffle = shufflevector <4 x i16> %v1, <4 x i16> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
763 ret <4 x i16> %shuffle
766 define <2 x i32> @test_vdup_lane_s32(<2 x i32> %v1) #0 {
767 ; CHECK-LABEL: test_vdup_lane_s32:
769 ; CHECK-NEXT: vdup.32 d0, d0[1]
771 %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <2 x i32> <i32 1, i32 1>
772 ret <2 x i32> %shuffle
775 define <16 x i8> @test_vdupq_lane_s8(<8 x i8> %v1) #0 {
776 ; CHECK-LABEL: test_vdupq_lane_s8:
778 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
779 ; CHECK-NEXT: vdup.8 q0, d0[5]
781 %shuffle = shufflevector <8 x i8> %v1, <8 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
782 ret <16 x i8> %shuffle
785 define <8 x i16> @test_vdupq_lane_s16(<4 x i16> %v1) #0 {
786 ; CHECK-LABEL: test_vdupq_lane_s16:
788 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
789 ; CHECK-NEXT: vdup.16 q0, d0[2]
791 %shuffle = shufflevector <4 x i16> %v1, <4 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
792 ret <8 x i16> %shuffle
795 define <4 x i32> @test_vdupq_lane_s32(<2 x i32> %v1) #0 {
796 ; CHECK-LABEL: test_vdupq_lane_s32:
798 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
799 ; CHECK-NEXT: vdup.32 q0, d0[1]
801 %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
802 ret <4 x i32> %shuffle
805 define <2 x i64> @test_vdupq_lane_s64(<1 x i64> %v1) #0 {
806 ; CHECK-LABEL: test_vdupq_lane_s64:
808 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
809 ; CHECK-NEXT: vmov.f64 d1, d0
811 %shuffle = shufflevector <1 x i64> %v1, <1 x i64> undef, <2 x i32> zeroinitializer
812 ret <2 x i64> %shuffle
815 define <8 x i8> @test_vdup_laneq_s8(<16 x i8> %v1) #0 {
816 ; CHECK-LABEL: test_vdup_laneq_s8:
818 ; CHECK-NEXT: vdup.8 d0, d0[5]
820 %shuffle = shufflevector <16 x i8> %v1, <16 x i8> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
821 ret <8 x i8> %shuffle
824 define <4 x i16> @test_vdup_laneq_s16(<8 x i16> %v1) #0 {
825 ; CHECK-LABEL: test_vdup_laneq_s16:
827 ; CHECK-NEXT: vdup.16 d0, d0[2]
829 %shuffle = shufflevector <8 x i16> %v1, <8 x i16> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
830 ret <4 x i16> %shuffle
833 define <2 x i32> @test_vdup_laneq_s32(<4 x i32> %v1) #0 {
834 ; CHECK-LABEL: test_vdup_laneq_s32:
836 ; CHECK-NEXT: vdup.32 d0, d0[1]
838 %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <2 x i32> <i32 1, i32 1>
839 ret <2 x i32> %shuffle
842 define <16 x i8> @test_vdupq_laneq_s8(<16 x i8> %v1) #0 {
843 ; CHECK-LABEL: test_vdupq_laneq_s8:
845 ; CHECK-NEXT: vdup.8 q0, d0[5]
847 %shuffle = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
848 ret <16 x i8> %shuffle
851 define <8 x i16> @test_vdupq_laneq_s16(<8 x i16> %v1) #0 {
852 ; CHECK-LABEL: test_vdupq_laneq_s16:
854 ; CHECK-NEXT: vdup.16 q0, d0[2]
856 %shuffle = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
857 ret <8 x i16> %shuffle
860 define <4 x i32> @test_vdupq_laneq_s32(<4 x i32> %v1) #0 {
861 ; CHECK-LABEL: test_vdupq_laneq_s32:
863 ; CHECK-NEXT: vdup.32 q0, d0[1]
865 %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
866 ret <4 x i32> %shuffle
869 define <2 x i64> @test_vdupq_laneq_s64(<2 x i64> %v1) #0 {
870 ; CHECK-LABEL: test_vdupq_laneq_s64:
872 ; CHECK-NEXT: vmov.f64 d1, d0
874 %shuffle = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer
875 ret <2 x i64> %shuffle
878 define i64 @test_bitcastv8i8toi64(<8 x i8> %in) {
879 ; CHECK-LABEL: test_bitcastv8i8toi64:
881 ; CHECK-NEXT: vmov r0, r1, d0
883 %res = bitcast <8 x i8> %in to i64
887 define i64 @test_bitcastv4i16toi64(<4 x i16> %in) {
888 ; CHECK-LABEL: test_bitcastv4i16toi64:
890 ; CHECK-NEXT: vmov r0, r1, d0
892 %res = bitcast <4 x i16> %in to i64
896 define i64 @test_bitcastv2i32toi64(<2 x i32> %in) {
897 ; CHECK-LABEL: test_bitcastv2i32toi64:
899 ; CHECK-NEXT: vmov r0, r1, d0
901 %res = bitcast <2 x i32> %in to i64
905 define i64 @test_bitcastv2f32toi64(<2 x float> %in) {
906 ; CHECK-LABEL: test_bitcastv2f32toi64:
908 ; CHECK-NEXT: vmov r0, r1, d0
910 %res = bitcast <2 x float> %in to i64
914 define i64 @test_bitcastv1i64toi64(<1 x i64> %in) {
915 ; CHECK-LABEL: test_bitcastv1i64toi64:
917 ; CHECK-NEXT: vmov r0, r1, d0
919 %res = bitcast <1 x i64> %in to i64
923 define i64 @test_bitcastv1f64toi64(<1 x double> %in) {
924 ; CHECK-LABEL: test_bitcastv1f64toi64:
926 ; CHECK-NEXT: vmov r0, r1, d0
928 %res = bitcast <1 x double> %in to i64
932 define <8 x i8> @test_bitcasti64tov8i8(i64 %in) {
933 ; CHECK-LABEL: test_bitcasti64tov8i8:
935 ; CHECK-NEXT: vmov d0, r0, r1
937 %res = bitcast i64 %in to <8 x i8>
941 define <4 x i16> @test_bitcasti64tov4i16(i64 %in) {
942 ; CHECK-LABEL: test_bitcasti64tov4i16:
944 ; CHECK-NEXT: vmov d0, r0, r1
946 %res = bitcast i64 %in to <4 x i16>
950 define <2 x i32> @test_bitcasti64tov2i32(i64 %in) {
951 ; CHECK-LABEL: test_bitcasti64tov2i32:
953 ; CHECK-NEXT: vmov d0, r0, r1
955 %res = bitcast i64 %in to <2 x i32>
959 define <2 x float> @test_bitcasti64tov2f32(i64 %in) {
960 ; CHECK-LABEL: test_bitcasti64tov2f32:
962 ; CHECK-NEXT: vmov d0, r0, r1
964 %res = bitcast i64 %in to <2 x float>
968 define <1 x i64> @test_bitcasti64tov1i64(i64 %in) {
969 ; CHECK-LABEL: test_bitcasti64tov1i64:
971 ; CHECK-NEXT: vmov d0, r0, r1
973 %res = bitcast i64 %in to <1 x i64>
977 define <1 x double> @test_bitcasti64tov1f64(i64 %in) {
978 ; CHECK-LABEL: test_bitcasti64tov1f64:
980 ; CHECK-NEXT: vmov d0, r0, r1
982 %res = bitcast i64 %in to <1 x double>
983 ret <1 x double> %res
986 define <1 x i64> @test_bitcastv8i8tov1f64(<8 x i8> %a) #0 {
987 ; CHECK-LABEL: test_bitcastv8i8tov1f64:
989 ; CHECK-NEXT: .save {r11, lr}
990 ; CHECK-NEXT: push {r11, lr}
991 ; CHECK-NEXT: vneg.s8 d16, d0
992 ; CHECK-NEXT: vmov r0, r1, d16
993 ; CHECK-NEXT: bl __aeabi_d2lz
994 ; CHECK-NEXT: vmov.32 d0[0], r0
995 ; CHECK-NEXT: vmov.32 d0[1], r1
996 ; CHECK-NEXT: pop {r11, pc}
997 %sub.i = sub <8 x i8> zeroinitializer, %a
998 %1 = bitcast <8 x i8> %sub.i to <1 x double>
999 %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
1000 ret <1 x i64> %vcvt.i
1003 define <1 x i64> @test_bitcastv4i16tov1f64(<4 x i16> %a) #0 {
1004 ; CHECK-LABEL: test_bitcastv4i16tov1f64:
1006 ; CHECK-NEXT: .save {r11, lr}
1007 ; CHECK-NEXT: push {r11, lr}
1008 ; CHECK-NEXT: vneg.s16 d16, d0
1009 ; CHECK-NEXT: vmov r0, r1, d16
1010 ; CHECK-NEXT: bl __aeabi_d2lz
1011 ; CHECK-NEXT: vmov.32 d0[0], r0
1012 ; CHECK-NEXT: vmov.32 d0[1], r1
1013 ; CHECK-NEXT: pop {r11, pc}
1014 %sub.i = sub <4 x i16> zeroinitializer, %a
1015 %1 = bitcast <4 x i16> %sub.i to <1 x double>
1016 %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
1017 ret <1 x i64> %vcvt.i
1020 define <1 x i64> @test_bitcastv2i32tov1f64(<2 x i32> %a) #0 {
1021 ; CHECK-LABEL: test_bitcastv2i32tov1f64:
1023 ; CHECK-NEXT: .save {r11, lr}
1024 ; CHECK-NEXT: push {r11, lr}
1025 ; CHECK-NEXT: vneg.s32 d16, d0
1026 ; CHECK-NEXT: vmov r0, r1, d16
1027 ; CHECK-NEXT: bl __aeabi_d2lz
1028 ; CHECK-NEXT: vmov.32 d0[0], r0
1029 ; CHECK-NEXT: vmov.32 d0[1], r1
1030 ; CHECK-NEXT: pop {r11, pc}
1031 %sub.i = sub <2 x i32> zeroinitializer, %a
1032 %1 = bitcast <2 x i32> %sub.i to <1 x double>
1033 %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
1034 ret <1 x i64> %vcvt.i
1037 define <1 x i64> @test_bitcastv1i64tov1f64(<1 x i64> %a) #0 {
1038 ; CHECK-LABEL: test_bitcastv1i64tov1f64:
1040 ; CHECK-NEXT: .save {r11, lr}
1041 ; CHECK-NEXT: push {r11, lr}
1042 ; CHECK-NEXT: vmov.i32 d16, #0x0
1043 ; CHECK-NEXT: vsub.i64 d16, d16, d0
1044 ; CHECK-NEXT: vmov r0, r1, d16
1045 ; CHECK-NEXT: bl __aeabi_d2lz
1046 ; CHECK-NEXT: vmov.32 d0[0], r0
1047 ; CHECK-NEXT: vmov.32 d0[1], r1
1048 ; CHECK-NEXT: pop {r11, pc}
1049 %sub.i = sub <1 x i64> zeroinitializer, %a
1050 %1 = bitcast <1 x i64> %sub.i to <1 x double>
1051 %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
1052 ret <1 x i64> %vcvt.i
1055 define <1 x i64> @test_bitcastv2f32tov1f64(<2 x float> %a) #0 {
1056 ; CHECK-LABEL: test_bitcastv2f32tov1f64:
1058 ; CHECK-NEXT: .save {r11, lr}
1059 ; CHECK-NEXT: push {r11, lr}
1060 ; CHECK-NEXT: vneg.f32 d16, d0
1061 ; CHECK-NEXT: vmov r0, r1, d16
1062 ; CHECK-NEXT: bl __aeabi_d2lz
1063 ; CHECK-NEXT: vmov.32 d0[0], r0
1064 ; CHECK-NEXT: vmov.32 d0[1], r1
1065 ; CHECK-NEXT: pop {r11, pc}
1066 %sub.i = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %a
1067 %1 = bitcast <2 x float> %sub.i to <1 x double>
1068 %vcvt.i = fptosi <1 x double> %1 to <1 x i64>
1069 ret <1 x i64> %vcvt.i
1072 define <8 x i8> @test_bitcastv1f64tov8i8(<1 x i64> %a) #0 {
1073 ; CHECK-LABEL: test_bitcastv1f64tov8i8:
1075 ; CHECK-NEXT: .save {r11, lr}
1076 ; CHECK-NEXT: push {r11, lr}
1077 ; CHECK-NEXT: vmov.32 r0, d0[0]
1078 ; CHECK-NEXT: vmov.32 r1, d0[1]
1079 ; CHECK-NEXT: bl __aeabi_l2d
1080 ; CHECK-NEXT: vmov d16, r0, r1
1081 ; CHECK-NEXT: vneg.s8 d0, d16
1082 ; CHECK-NEXT: pop {r11, pc}
1083 %vcvt.i = sitofp <1 x i64> %a to <1 x double>
1084 %1 = bitcast <1 x double> %vcvt.i to <8 x i8>
1085 %sub.i = sub <8 x i8> zeroinitializer, %1
1089 define <4 x i16> @test_bitcastv1f64tov4i16(<1 x i64> %a) #0 {
1090 ; CHECK-LABEL: test_bitcastv1f64tov4i16:
1092 ; CHECK-NEXT: .save {r11, lr}
1093 ; CHECK-NEXT: push {r11, lr}
1094 ; CHECK-NEXT: vmov.32 r0, d0[0]
1095 ; CHECK-NEXT: vmov.32 r1, d0[1]
1096 ; CHECK-NEXT: bl __aeabi_l2d
1097 ; CHECK-NEXT: vmov d16, r0, r1
1098 ; CHECK-NEXT: vneg.s16 d0, d16
1099 ; CHECK-NEXT: pop {r11, pc}
1100 %vcvt.i = sitofp <1 x i64> %a to <1 x double>
1101 %1 = bitcast <1 x double> %vcvt.i to <4 x i16>
1102 %sub.i = sub <4 x i16> zeroinitializer, %1
1103 ret <4 x i16> %sub.i
1106 define <2 x i32> @test_bitcastv1f64tov2i32(<1 x i64> %a) #0 {
1107 ; CHECK-LABEL: test_bitcastv1f64tov2i32:
1109 ; CHECK-NEXT: .save {r11, lr}
1110 ; CHECK-NEXT: push {r11, lr}
1111 ; CHECK-NEXT: vmov.32 r0, d0[0]
1112 ; CHECK-NEXT: vmov.32 r1, d0[1]
1113 ; CHECK-NEXT: bl __aeabi_l2d
1114 ; CHECK-NEXT: vmov d16, r0, r1
1115 ; CHECK-NEXT: vneg.s32 d0, d16
1116 ; CHECK-NEXT: pop {r11, pc}
1117 %vcvt.i = sitofp <1 x i64> %a to <1 x double>
1118 %1 = bitcast <1 x double> %vcvt.i to <2 x i32>
1119 %sub.i = sub <2 x i32> zeroinitializer, %1
1120 ret <2 x i32> %sub.i
1123 define <1 x i64> @test_bitcastv1f64tov1i64(<1 x i64> %a) #0 {
1124 ; CHECK-LABEL: test_bitcastv1f64tov1i64:
1126 ; CHECK-NEXT: .save {r11, lr}
1127 ; CHECK-NEXT: push {r11, lr}
1128 ; CHECK-NEXT: vmov.32 r0, d0[0]
1129 ; CHECK-NEXT: vmov.32 r1, d0[1]
1130 ; CHECK-NEXT: bl __aeabi_l2d
1131 ; CHECK-NEXT: vmov.i32 d16, #0x0
1132 ; CHECK-NEXT: vmov d17, r0, r1
1133 ; CHECK-NEXT: vsub.i64 d0, d16, d17
1134 ; CHECK-NEXT: pop {r11, pc}
1135 %vcvt.i = sitofp <1 x i64> %a to <1 x double>
1136 %1 = bitcast <1 x double> %vcvt.i to <1 x i64>
1137 %sub.i = sub <1 x i64> zeroinitializer, %1
1138 ret <1 x i64> %sub.i
1141 define <2 x float> @test_bitcastv1f64tov2f32(<1 x i64> %a) #0 {
1142 ; CHECK-LABEL: test_bitcastv1f64tov2f32:
1144 ; CHECK-NEXT: .save {r11, lr}
1145 ; CHECK-NEXT: push {r11, lr}
1146 ; CHECK-NEXT: vmov.32 r0, d0[0]
1147 ; CHECK-NEXT: vmov.32 r1, d0[1]
1148 ; CHECK-NEXT: bl __aeabi_l2d
1149 ; CHECK-NEXT: vmov d16, r0, r1
1150 ; CHECK-NEXT: vneg.f32 d0, d16
1151 ; CHECK-NEXT: pop {r11, pc}
1152 %vcvt.i = sitofp <1 x i64> %a to <1 x double>
1153 %1 = bitcast <1 x double> %vcvt.i to <2 x float>
1154 %sub.i = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, %1
1155 ret <2 x float> %sub.i
1158 ; Test insert element into an undef vector
1159 define <8 x i8> @scalar_to_vector_v8i8(i8 %a) {
1160 ; CHECK-LABEL: scalar_to_vector_v8i8:
1162 ; CHECK-NEXT: vmov.8 d0[0], r0
1164 %b = insertelement <8 x i8> undef, i8 %a, i32 0
1168 define <16 x i8> @scalar_to_vector_v16i8(i8 %a) {
1169 ; CHECK-LABEL: scalar_to_vector_v16i8:
1171 ; CHECK-NEXT: vmov.8 d0[0], r0
1173 %b = insertelement <16 x i8> undef, i8 %a, i32 0
1177 define <4 x i16> @scalar_to_vector_v4i16(i16 %a) {
1178 ; CHECK-LABEL: scalar_to_vector_v4i16:
1180 ; CHECK-NEXT: vmov.16 d0[0], r0
1182 %b = insertelement <4 x i16> undef, i16 %a, i32 0
1186 define <8 x i16> @scalar_to_vector_v8i16(i16 %a) {
1187 ; CHECK-LABEL: scalar_to_vector_v8i16:
1189 ; CHECK-NEXT: vmov.16 d0[0], r0
1191 %b = insertelement <8 x i16> undef, i16 %a, i32 0
1195 define <2 x i32> @scalar_to_vector_v2i32(i32 %a) {
1196 ; CHECK-LABEL: scalar_to_vector_v2i32:
1198 ; CHECK-NEXT: vmov.32 d0[0], r0
1200 %b = insertelement <2 x i32> undef, i32 %a, i32 0
1204 define <4 x i32> @scalar_to_vector_v4i32(i32 %a) {
1205 ; CHECK-LABEL: scalar_to_vector_v4i32:
1207 ; CHECK-NEXT: vmov.32 d0[0], r0
1209 %b = insertelement <4 x i32> undef, i32 %a, i32 0
1213 define <2 x i64> @scalar_to_vector_v2i64(i64 %a) {
1214 ; CHECK-LABEL: scalar_to_vector_v2i64:
1216 ; CHECK-NEXT: vmov.32 d0[0], r0
1217 ; CHECK-NEXT: vmov.32 d0[1], r1
1219 %b = insertelement <2 x i64> undef, i64 %a, i32 0
1223 define <8 x i8> @testDUPv1i8(<1 x i8> %a) {
1224 ; CHECK-LABEL: testDUPv1i8:
1226 ; CHECK-NEXT: vdup.8 d0, r0
1228 %b = extractelement <1 x i8> %a, i32 0
1229 %c = insertelement <8 x i8> undef, i8 %b, i32 0
1230 %d = insertelement <8 x i8> %c, i8 %b, i32 1
1231 %e = insertelement <8 x i8> %d, i8 %b, i32 2
1232 %f = insertelement <8 x i8> %e, i8 %b, i32 3
1233 %g = insertelement <8 x i8> %f, i8 %b, i32 4
1234 %h = insertelement <8 x i8> %g, i8 %b, i32 5
1235 %i = insertelement <8 x i8> %h, i8 %b, i32 6
1236 %j = insertelement <8 x i8> %i, i8 %b, i32 7
1240 define <8 x i16> @testDUPv1i16(<1 x i16> %a) {
1241 ; CHECK-LABEL: testDUPv1i16:
1243 ; CHECK-NEXT: vdup.16 q0, r0
1245 %b = extractelement <1 x i16> %a, i32 0
1246 %c = insertelement <8 x i16> undef, i16 %b, i32 0
1247 %d = insertelement <8 x i16> %c, i16 %b, i32 1
1248 %e = insertelement <8 x i16> %d, i16 %b, i32 2
1249 %f = insertelement <8 x i16> %e, i16 %b, i32 3
1250 %g = insertelement <8 x i16> %f, i16 %b, i32 4
1251 %h = insertelement <8 x i16> %g, i16 %b, i32 5
1252 %i = insertelement <8 x i16> %h, i16 %b, i32 6
1253 %j = insertelement <8 x i16> %i, i16 %b, i32 7
1257 define <4 x i32> @testDUPv1i32(<1 x i32> %a) {
1258 ; CHECK-LABEL: testDUPv1i32:
1260 ; CHECK-NEXT: vdup.32 q0, r0
1262 %b = extractelement <1 x i32> %a, i32 0
1263 %c = insertelement <4 x i32> undef, i32 %b, i32 0
1264 %d = insertelement <4 x i32> %c, i32 %b, i32 1
1265 %e = insertelement <4 x i32> %d, i32 %b, i32 2
1266 %f = insertelement <4 x i32> %e, i32 %b, i32 3
1270 define <8 x i8> @getl(<16 x i8> %x) #0 {
1271 ; CHECK-LABEL: getl:
1273 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0
1275 %vecext = extractelement <16 x i8> %x, i32 0
1276 %vecinit = insertelement <8 x i8> undef, i8 %vecext, i32 0
1277 %vecext1 = extractelement <16 x i8> %x, i32 1
1278 %vecinit2 = insertelement <8 x i8> %vecinit, i8 %vecext1, i32 1
1279 %vecext3 = extractelement <16 x i8> %x, i32 2
1280 %vecinit4 = insertelement <8 x i8> %vecinit2, i8 %vecext3, i32 2
1281 %vecext5 = extractelement <16 x i8> %x, i32 3
1282 %vecinit6 = insertelement <8 x i8> %vecinit4, i8 %vecext5, i32 3
1283 %vecext7 = extractelement <16 x i8> %x, i32 4
1284 %vecinit8 = insertelement <8 x i8> %vecinit6, i8 %vecext7, i32 4
1285 %vecext9 = extractelement <16 x i8> %x, i32 5
1286 %vecinit10 = insertelement <8 x i8> %vecinit8, i8 %vecext9, i32 5
1287 %vecext11 = extractelement <16 x i8> %x, i32 6
1288 %vecinit12 = insertelement <8 x i8> %vecinit10, i8 %vecext11, i32 6
1289 %vecext13 = extractelement <16 x i8> %x, i32 7
1290 %vecinit14 = insertelement <8 x i8> %vecinit12, i8 %vecext13, i32 7
1291 ret <8 x i8> %vecinit14
1294 define <4 x i16> @test_extracts_inserts_varidx_extract(<8 x i16> %x, i32 %idx) {
1295 ; CHECK-LABEL: test_extracts_inserts_varidx_extract:
1297 ; CHECK-NEXT: .save {r11}
1298 ; CHECK-NEXT: push {r11}
1299 ; CHECK-NEXT: .setfp r11, sp
1300 ; CHECK-NEXT: mov r11, sp
1301 ; CHECK-NEXT: .pad #28
1302 ; CHECK-NEXT: sub sp, sp, #28
1303 ; CHECK-NEXT: bfc sp, #0, #4
1304 ; CHECK-NEXT: vmov.u16 r1, d0[1]
1305 ; CHECK-NEXT: and r0, r0, #7
1306 ; CHECK-NEXT: vmov.u16 r2, d0[2]
1307 ; CHECK-NEXT: mov r3, sp
1308 ; CHECK-NEXT: vmov.u16 r12, d0[3]
1309 ; CHECK-NEXT: lsl r0, r0, #1
1310 ; CHECK-NEXT: vst1.64 {d0, d1}, [r3:128], r0
1311 ; CHECK-NEXT: vld1.16 {d0[0]}, [r3:16]
1312 ; CHECK-NEXT: vmov.16 d0[1], r1
1313 ; CHECK-NEXT: vmov.16 d0[2], r2
1314 ; CHECK-NEXT: vmov.16 d0[3], r12
1315 ; CHECK-NEXT: mov sp, r11
1316 ; CHECK-NEXT: pop {r11}
1318 %tmp = extractelement <8 x i16> %x, i32 %idx
1319 %tmp2 = insertelement <4 x i16> undef, i16 %tmp, i32 0
1320 %tmp3 = extractelement <8 x i16> %x, i32 1
1321 %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 1
1322 %tmp5 = extractelement <8 x i16> %x, i32 2
1323 %tmp6 = insertelement <4 x i16> %tmp4, i16 %tmp5, i32 2
1324 %tmp7 = extractelement <8 x i16> %x, i32 3
1325 %tmp8 = insertelement <4 x i16> %tmp6, i16 %tmp7, i32 3
1329 define <4 x i16> @test_extracts_inserts_varidx_insert(<8 x i16> %x, i32 %idx) {
1330 ; CHECK-LABEL: test_extracts_inserts_varidx_insert:
1332 ; CHECK-NEXT: .pad #8
1333 ; CHECK-NEXT: sub sp, sp, #8
1334 ; CHECK-NEXT: vmov.u16 r1, d0[1]
1335 ; CHECK-NEXT: and r0, r0, #3
1336 ; CHECK-NEXT: vmov.u16 r2, d0[2]
1337 ; CHECK-NEXT: mov r3, sp
1338 ; CHECK-NEXT: vmov.u16 r12, d0[3]
1339 ; CHECK-NEXT: orr r0, r3, r0, lsl #1
1340 ; CHECK-NEXT: vst1.16 {d0[0]}, [r0:16]
1341 ; CHECK-NEXT: vldr d0, [sp]
1342 ; CHECK-NEXT: vmov.16 d0[1], r1
1343 ; CHECK-NEXT: vmov.16 d0[2], r2
1344 ; CHECK-NEXT: vmov.16 d0[3], r12
1345 ; CHECK-NEXT: add sp, sp, #8
1347 %tmp = extractelement <8 x i16> %x, i32 0
1348 %tmp2 = insertelement <4 x i16> undef, i16 %tmp, i32 %idx
1349 %tmp3 = extractelement <8 x i16> %x, i32 1
1350 %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 1
1351 %tmp5 = extractelement <8 x i16> %x, i32 2
1352 %tmp6 = insertelement <4 x i16> %tmp4, i16 %tmp5, i32 2
1353 %tmp7 = extractelement <8 x i16> %x, i32 3
1354 %tmp8 = insertelement <4 x i16> %tmp6, i16 %tmp7, i32 3
1358 define <4 x i16> @test_dup_v2i32_v4i16(<2 x i32> %a) {
1359 ; CHECK-LABEL: test_dup_v2i32_v4i16:
1360 ; CHECK: @ %bb.0: @ %entry
1361 ; CHECK-NEXT: vmov.32 r0, d0[1]
1362 ; CHECK-NEXT: vmov.16 d16[1], r0
1363 ; CHECK-NEXT: vdup.16 d0, d16[1]
1366 %x = extractelement <2 x i32> %a, i32 1
1367 %vget_lane = trunc i32 %x to i16
1368 %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
1369 %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
1370 %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1371 %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1372 ret <4 x i16> %vecinit3.i
1375 define <8 x i16> @test_dup_v4i32_v8i16(<4 x i32> %a) {
1376 ; CHECK-LABEL: test_dup_v4i32_v8i16:
1377 ; CHECK: @ %bb.0: @ %entry
1378 ; CHECK-NEXT: vmov.32 r0, d1[1]
1379 ; CHECK-NEXT: vmov.16 d16[3], r0
1380 ; CHECK-NEXT: vdup.16 q0, d16[3]
1383 %x = extractelement <4 x i32> %a, i32 3
1384 %vget_lane = trunc i32 %x to i16
1385 %vecinit.i = insertelement <8 x i16> undef, i16 %vget_lane, i32 0
1386 %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %vget_lane, i32 1
1387 %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1388 %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1389 %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %vget_lane, i32 4
1390 %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %vget_lane, i32 5
1391 %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %vget_lane, i32 6
1392 %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %vget_lane, i32 7
1393 ret <8 x i16> %vecinit7.i
1396 define <4 x i16> @test_dup_v1i64_v4i16(<1 x i64> %a) {
1397 ; CHECK-LABEL: test_dup_v1i64_v4i16:
1398 ; CHECK: @ %bb.0: @ %entry
1399 ; CHECK-NEXT: vmov.32 r0, d0[0]
1400 ; CHECK-NEXT: vmov.16 d16[0], r0
1401 ; CHECK-NEXT: vdup.16 d0, d16[0]
1404 %x = extractelement <1 x i64> %a, i32 0
1405 %vget_lane = trunc i64 %x to i16
1406 %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
1407 %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
1408 %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1409 %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1410 ret <4 x i16> %vecinit3.i
1413 define <2 x i32> @test_dup_v1i64_v2i32(<1 x i64> %a) {
1414 ; CHECK-LABEL: test_dup_v1i64_v2i32:
1415 ; CHECK: @ %bb.0: @ %entry
1416 ; CHECK-NEXT: vdup.32 d0, d0[0]
1419 %x = extractelement <1 x i64> %a, i32 0
1420 %vget_lane = trunc i64 %x to i32
1421 %vecinit.i = insertelement <2 x i32> undef, i32 %vget_lane, i32 0
1422 %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %vget_lane, i32 1
1423 ret <2 x i32> %vecinit1.i
1426 define <8 x i16> @test_dup_v2i64_v8i16(<2 x i64> %a) {
1427 ; CHECK-LABEL: test_dup_v2i64_v8i16:
1428 ; CHECK: @ %bb.0: @ %entry
1429 ; CHECK-NEXT: vmov.32 r0, d1[0]
1430 ; CHECK-NEXT: vmov.16 d16[2], r0
1431 ; CHECK-NEXT: vdup.16 q0, d16[2]
1434 %x = extractelement <2 x i64> %a, i32 1
1435 %vget_lane = trunc i64 %x to i16
1436 %vecinit.i = insertelement <8 x i16> undef, i16 %vget_lane, i32 0
1437 %vecinit1.i = insertelement <8 x i16> %vecinit.i, i16 %vget_lane, i32 1
1438 %vecinit2.i = insertelement <8 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1439 %vecinit3.i = insertelement <8 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1440 %vecinit4.i = insertelement <8 x i16> %vecinit3.i, i16 %vget_lane, i32 4
1441 %vecinit5.i = insertelement <8 x i16> %vecinit4.i, i16 %vget_lane, i32 5
1442 %vecinit6.i = insertelement <8 x i16> %vecinit5.i, i16 %vget_lane, i32 6
1443 %vecinit7.i = insertelement <8 x i16> %vecinit6.i, i16 %vget_lane, i32 7
1444 ret <8 x i16> %vecinit7.i
1447 define <4 x i32> @test_dup_v2i64_v4i32(<2 x i64> %a) {
1448 ; CHECK-LABEL: test_dup_v2i64_v4i32:
1449 ; CHECK: @ %bb.0: @ %entry
1450 ; CHECK-NEXT: vdup.32 q0, d1[0]
1453 %x = extractelement <2 x i64> %a, i32 1
1454 %vget_lane = trunc i64 %x to i32
1455 %vecinit.i = insertelement <4 x i32> undef, i32 %vget_lane, i32 0
1456 %vecinit1.i = insertelement <4 x i32> %vecinit.i, i32 %vget_lane, i32 1
1457 %vecinit2.i = insertelement <4 x i32> %vecinit1.i, i32 %vget_lane, i32 2
1458 %vecinit3.i = insertelement <4 x i32> %vecinit2.i, i32 %vget_lane, i32 3
1459 ret <4 x i32> %vecinit3.i
1462 define <4 x i16> @test_dup_v4i32_v4i16(<4 x i32> %a) {
1463 ; CHECK-LABEL: test_dup_v4i32_v4i16:
1464 ; CHECK: @ %bb.0: @ %entry
1465 ; CHECK-NEXT: vmov.32 r0, d0[1]
1466 ; CHECK-NEXT: vmov.16 d16[1], r0
1467 ; CHECK-NEXT: vdup.16 d0, d16[1]
1470 %x = extractelement <4 x i32> %a, i32 1
1471 %vget_lane = trunc i32 %x to i16
1472 %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
1473 %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
1474 %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1475 %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1476 ret <4 x i16> %vecinit3.i
1479 define <4 x i16> @test_dup_v2i64_v4i16(<2 x i64> %a) {
1480 ; CHECK-LABEL: test_dup_v2i64_v4i16:
1481 ; CHECK: @ %bb.0: @ %entry
1482 ; CHECK-NEXT: vmov.32 r0, d0[0]
1483 ; CHECK-NEXT: vmov.16 d16[0], r0
1484 ; CHECK-NEXT: vdup.16 d0, d16[0]
1487 %x = extractelement <2 x i64> %a, i32 0
1488 %vget_lane = trunc i64 %x to i16
1489 %vecinit.i = insertelement <4 x i16> undef, i16 %vget_lane, i32 0
1490 %vecinit1.i = insertelement <4 x i16> %vecinit.i, i16 %vget_lane, i32 1
1491 %vecinit2.i = insertelement <4 x i16> %vecinit1.i, i16 %vget_lane, i32 2
1492 %vecinit3.i = insertelement <4 x i16> %vecinit2.i, i16 %vget_lane, i32 3
1493 ret <4 x i16> %vecinit3.i
1496 define <2 x i32> @test_dup_v2i64_v2i32(<2 x i64> %a) {
1497 ; CHECK-LABEL: test_dup_v2i64_v2i32:
1498 ; CHECK: @ %bb.0: @ %entry
1499 ; CHECK-NEXT: vdup.32 d0, d0[0]
1502 %x = extractelement <2 x i64> %a, i32 0
1503 %vget_lane = trunc i64 %x to i32
1504 %vecinit.i = insertelement <2 x i32> undef, i32 %vget_lane, i32 0
1505 %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %vget_lane, i32 1
1506 ret <2 x i32> %vecinit1.i
1509 define <2 x i32> @test_concat_undef_v1i32(<2 x i32> %a) {
1510 ; CHECK-LABEL: test_concat_undef_v1i32:
1511 ; CHECK: @ %bb.0: @ %entry
1512 ; CHECK-NEXT: vdup.32 d0, d0[0]
1515 %0 = extractelement <2 x i32> %a, i32 0
1516 %vecinit1.i = insertelement <2 x i32> undef, i32 %0, i32 1
1517 ret <2 x i32> %vecinit1.i
1520 define <2 x i32> @test_concat_same_v1i32_v1i32(<2 x i32> %a) {
1521 ; CHECK-LABEL: test_concat_same_v1i32_v1i32:
1522 ; CHECK: @ %bb.0: @ %entry
1523 ; CHECK-NEXT: vdup.32 d0, d0[0]
1526 %0 = extractelement <2 x i32> %a, i32 0
1527 %vecinit.i = insertelement <2 x i32> undef, i32 %0, i32 0
1528 %vecinit1.i = insertelement <2 x i32> %vecinit.i, i32 %0, i32 1
1529 ret <2 x i32> %vecinit1.i
1533 define <16 x i8> @test_concat_v16i8_v16i8_v16i8(<16 x i8> %x, <16 x i8> %y) #0 {
1534 ; CHECK-LABEL: test_concat_v16i8_v16i8_v16i8:
1535 ; CHECK: @ %bb.0: @ %entry
1536 ; CHECK-NEXT: vmov.f64 d1, d2
1539 %vecinit30 = shufflevector <16 x i8> %x, <16 x i8> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
1540 ret <16 x i8> %vecinit30
1543 define <16 x i8> @test_concat_v16i8_v8i8_v16i8(<8 x i8> %x, <16 x i8> %y) #0 {
1544 ; CHECK-LABEL: test_concat_v16i8_v8i8_v16i8:
1545 ; CHECK: @ %bb.0: @ %entry
1546 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
1547 ; CHECK-NEXT: vmov.f64 d1, d2
1550 %vecext = extractelement <8 x i8> %x, i32 0
1551 %vecinit = insertelement <16 x i8> undef, i8 %vecext, i32 0
1552 %vecext1 = extractelement <8 x i8> %x, i32 1
1553 %vecinit2 = insertelement <16 x i8> %vecinit, i8 %vecext1, i32 1
1554 %vecext3 = extractelement <8 x i8> %x, i32 2
1555 %vecinit4 = insertelement <16 x i8> %vecinit2, i8 %vecext3, i32 2
1556 %vecext5 = extractelement <8 x i8> %x, i32 3
1557 %vecinit6 = insertelement <16 x i8> %vecinit4, i8 %vecext5, i32 3
1558 %vecext7 = extractelement <8 x i8> %x, i32 4
1559 %vecinit8 = insertelement <16 x i8> %vecinit6, i8 %vecext7, i32 4
1560 %vecext9 = extractelement <8 x i8> %x, i32 5
1561 %vecinit10 = insertelement <16 x i8> %vecinit8, i8 %vecext9, i32 5
1562 %vecext11 = extractelement <8 x i8> %x, i32 6
1563 %vecinit12 = insertelement <16 x i8> %vecinit10, i8 %vecext11, i32 6
1564 %vecext13 = extractelement <8 x i8> %x, i32 7
1565 %vecinit14 = insertelement <16 x i8> %vecinit12, i8 %vecext13, i32 7
1566 %vecinit30 = shufflevector <16 x i8> %vecinit14, <16 x i8> %y, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
1567 ret <16 x i8> %vecinit30
1570 define <16 x i8> @test_concat_v16i8_v16i8_v8i8(<16 x i8> %x, <8 x i8> %y) #0 {
1571 ; CHECK-LABEL: test_concat_v16i8_v16i8_v8i8:
1572 ; CHECK: @ %bb.0: @ %entry
1573 ; CHECK-NEXT: vmov.f64 d1, d2
1576 %vecext = extractelement <16 x i8> %x, i32 0
1577 %vecinit = insertelement <16 x i8> undef, i8 %vecext, i32 0
1578 %vecext1 = extractelement <16 x i8> %x, i32 1
1579 %vecinit2 = insertelement <16 x i8> %vecinit, i8 %vecext1, i32 1
1580 %vecext3 = extractelement <16 x i8> %x, i32 2
1581 %vecinit4 = insertelement <16 x i8> %vecinit2, i8 %vecext3, i32 2
1582 %vecext5 = extractelement <16 x i8> %x, i32 3
1583 %vecinit6 = insertelement <16 x i8> %vecinit4, i8 %vecext5, i32 3
1584 %vecext7 = extractelement <16 x i8> %x, i32 4
1585 %vecinit8 = insertelement <16 x i8> %vecinit6, i8 %vecext7, i32 4
1586 %vecext9 = extractelement <16 x i8> %x, i32 5
1587 %vecinit10 = insertelement <16 x i8> %vecinit8, i8 %vecext9, i32 5
1588 %vecext11 = extractelement <16 x i8> %x, i32 6
1589 %vecinit12 = insertelement <16 x i8> %vecinit10, i8 %vecext11, i32 6
1590 %vecext13 = extractelement <16 x i8> %x, i32 7
1591 %vecinit14 = insertelement <16 x i8> %vecinit12, i8 %vecext13, i32 7
1592 %vecext15 = extractelement <8 x i8> %y, i32 0
1593 %vecinit16 = insertelement <16 x i8> %vecinit14, i8 %vecext15, i32 8
1594 %vecext17 = extractelement <8 x i8> %y, i32 1
1595 %vecinit18 = insertelement <16 x i8> %vecinit16, i8 %vecext17, i32 9
1596 %vecext19 = extractelement <8 x i8> %y, i32 2
1597 %vecinit20 = insertelement <16 x i8> %vecinit18, i8 %vecext19, i32 10
1598 %vecext21 = extractelement <8 x i8> %y, i32 3
1599 %vecinit22 = insertelement <16 x i8> %vecinit20, i8 %vecext21, i32 11
1600 %vecext23 = extractelement <8 x i8> %y, i32 4
1601 %vecinit24 = insertelement <16 x i8> %vecinit22, i8 %vecext23, i32 12
1602 %vecext25 = extractelement <8 x i8> %y, i32 5
1603 %vecinit26 = insertelement <16 x i8> %vecinit24, i8 %vecext25, i32 13
1604 %vecext27 = extractelement <8 x i8> %y, i32 6
1605 %vecinit28 = insertelement <16 x i8> %vecinit26, i8 %vecext27, i32 14
1606 %vecext29 = extractelement <8 x i8> %y, i32 7
1607 %vecinit30 = insertelement <16 x i8> %vecinit28, i8 %vecext29, i32 15
1608 ret <16 x i8> %vecinit30
1611 define <16 x i8> @test_concat_v16i8_v8i8_v8i8(<8 x i8> %x, <8 x i8> %y) #0 {
1612 ; CHECK-LABEL: test_concat_v16i8_v8i8_v8i8:
1613 ; CHECK: @ %bb.0: @ %entry
1614 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
1615 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
1618 %vecext = extractelement <8 x i8> %x, i32 0
1619 %vecinit = insertelement <16 x i8> undef, i8 %vecext, i32 0
1620 %vecext1 = extractelement <8 x i8> %x, i32 1
1621 %vecinit2 = insertelement <16 x i8> %vecinit, i8 %vecext1, i32 1
1622 %vecext3 = extractelement <8 x i8> %x, i32 2
1623 %vecinit4 = insertelement <16 x i8> %vecinit2, i8 %vecext3, i32 2
1624 %vecext5 = extractelement <8 x i8> %x, i32 3
1625 %vecinit6 = insertelement <16 x i8> %vecinit4, i8 %vecext5, i32 3
1626 %vecext7 = extractelement <8 x i8> %x, i32 4
1627 %vecinit8 = insertelement <16 x i8> %vecinit6, i8 %vecext7, i32 4
1628 %vecext9 = extractelement <8 x i8> %x, i32 5
1629 %vecinit10 = insertelement <16 x i8> %vecinit8, i8 %vecext9, i32 5
1630 %vecext11 = extractelement <8 x i8> %x, i32 6
1631 %vecinit12 = insertelement <16 x i8> %vecinit10, i8 %vecext11, i32 6
1632 %vecext13 = extractelement <8 x i8> %x, i32 7
1633 %vecinit14 = insertelement <16 x i8> %vecinit12, i8 %vecext13, i32 7
1634 %vecext15 = extractelement <8 x i8> %y, i32 0
1635 %vecinit16 = insertelement <16 x i8> %vecinit14, i8 %vecext15, i32 8
1636 %vecext17 = extractelement <8 x i8> %y, i32 1
1637 %vecinit18 = insertelement <16 x i8> %vecinit16, i8 %vecext17, i32 9
1638 %vecext19 = extractelement <8 x i8> %y, i32 2
1639 %vecinit20 = insertelement <16 x i8> %vecinit18, i8 %vecext19, i32 10
1640 %vecext21 = extractelement <8 x i8> %y, i32 3
1641 %vecinit22 = insertelement <16 x i8> %vecinit20, i8 %vecext21, i32 11
1642 %vecext23 = extractelement <8 x i8> %y, i32 4
1643 %vecinit24 = insertelement <16 x i8> %vecinit22, i8 %vecext23, i32 12
1644 %vecext25 = extractelement <8 x i8> %y, i32 5
1645 %vecinit26 = insertelement <16 x i8> %vecinit24, i8 %vecext25, i32 13
1646 %vecext27 = extractelement <8 x i8> %y, i32 6
1647 %vecinit28 = insertelement <16 x i8> %vecinit26, i8 %vecext27, i32 14
1648 %vecext29 = extractelement <8 x i8> %y, i32 7
1649 %vecinit30 = insertelement <16 x i8> %vecinit28, i8 %vecext29, i32 15
1650 ret <16 x i8> %vecinit30
1653 define <8 x i16> @test_concat_v8i16_v8i16_v8i16(<8 x i16> %x, <8 x i16> %y) #0 {
1654 ; CHECK-LABEL: test_concat_v8i16_v8i16_v8i16:
1655 ; CHECK: @ %bb.0: @ %entry
1656 ; CHECK-NEXT: vmov.f64 d1, d2
1659 %vecinit14 = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>
1660 ret <8 x i16> %vecinit14
1663 define <8 x i16> @test_concat_v8i16_v4i16_v8i16(<4 x i16> %x, <8 x i16> %y) #0 {
1664 ; CHECK-LABEL: test_concat_v8i16_v4i16_v8i16:
1665 ; CHECK: @ %bb.0: @ %entry
1666 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
1667 ; CHECK-NEXT: vmov.f64 d1, d2
1670 %vecext = extractelement <4 x i16> %x, i32 0
1671 %vecinit = insertelement <8 x i16> undef, i16 %vecext, i32 0
1672 %vecext1 = extractelement <4 x i16> %x, i32 1
1673 %vecinit2 = insertelement <8 x i16> %vecinit, i16 %vecext1, i32 1
1674 %vecext3 = extractelement <4 x i16> %x, i32 2
1675 %vecinit4 = insertelement <8 x i16> %vecinit2, i16 %vecext3, i32 2
1676 %vecext5 = extractelement <4 x i16> %x, i32 3
1677 %vecinit6 = insertelement <8 x i16> %vecinit4, i16 %vecext5, i32 3
1678 %vecinit14 = shufflevector <8 x i16> %vecinit6, <8 x i16> %y, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>
1679 ret <8 x i16> %vecinit14
1682 define <8 x i16> @test_concat_v8i16_v8i16_v4i16(<8 x i16> %x, <4 x i16> %y) #0 {
1683 ; CHECK-LABEL: test_concat_v8i16_v8i16_v4i16:
1684 ; CHECK: @ %bb.0: @ %entry
1685 ; CHECK-NEXT: vmov.f64 d1, d2
1688 %vecext = extractelement <8 x i16> %x, i32 0
1689 %vecinit = insertelement <8 x i16> undef, i16 %vecext, i32 0
1690 %vecext1 = extractelement <8 x i16> %x, i32 1
1691 %vecinit2 = insertelement <8 x i16> %vecinit, i16 %vecext1, i32 1
1692 %vecext3 = extractelement <8 x i16> %x, i32 2
1693 %vecinit4 = insertelement <8 x i16> %vecinit2, i16 %vecext3, i32 2
1694 %vecext5 = extractelement <8 x i16> %x, i32 3
1695 %vecinit6 = insertelement <8 x i16> %vecinit4, i16 %vecext5, i32 3
1696 %vecext7 = extractelement <4 x i16> %y, i32 0
1697 %vecinit8 = insertelement <8 x i16> %vecinit6, i16 %vecext7, i32 4
1698 %vecext9 = extractelement <4 x i16> %y, i32 1
1699 %vecinit10 = insertelement <8 x i16> %vecinit8, i16 %vecext9, i32 5
1700 %vecext11 = extractelement <4 x i16> %y, i32 2
1701 %vecinit12 = insertelement <8 x i16> %vecinit10, i16 %vecext11, i32 6
1702 %vecext13 = extractelement <4 x i16> %y, i32 3
1703 %vecinit14 = insertelement <8 x i16> %vecinit12, i16 %vecext13, i32 7
1704 ret <8 x i16> %vecinit14
1707 define <8 x i16> @test_concat_v8i16_v4i16_v4i16(<4 x i16> %x, <4 x i16> %y) #0 {
1708 ; CHECK-LABEL: test_concat_v8i16_v4i16_v4i16:
1709 ; CHECK: @ %bb.0: @ %entry
1710 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
1711 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
1714 %vecext = extractelement <4 x i16> %x, i32 0
1715 %vecinit = insertelement <8 x i16> undef, i16 %vecext, i32 0
1716 %vecext1 = extractelement <4 x i16> %x, i32 1
1717 %vecinit2 = insertelement <8 x i16> %vecinit, i16 %vecext1, i32 1
1718 %vecext3 = extractelement <4 x i16> %x, i32 2
1719 %vecinit4 = insertelement <8 x i16> %vecinit2, i16 %vecext3, i32 2
1720 %vecext5 = extractelement <4 x i16> %x, i32 3
1721 %vecinit6 = insertelement <8 x i16> %vecinit4, i16 %vecext5, i32 3
1722 %vecext7 = extractelement <4 x i16> %y, i32 0
1723 %vecinit8 = insertelement <8 x i16> %vecinit6, i16 %vecext7, i32 4
1724 %vecext9 = extractelement <4 x i16> %y, i32 1
1725 %vecinit10 = insertelement <8 x i16> %vecinit8, i16 %vecext9, i32 5
1726 %vecext11 = extractelement <4 x i16> %y, i32 2
1727 %vecinit12 = insertelement <8 x i16> %vecinit10, i16 %vecext11, i32 6
1728 %vecext13 = extractelement <4 x i16> %y, i32 3
1729 %vecinit14 = insertelement <8 x i16> %vecinit12, i16 %vecext13, i32 7
1730 ret <8 x i16> %vecinit14
1733 define <4 x i32> @test_concat_v4i32_v4i32_v4i32(<4 x i32> %x, <4 x i32> %y) #0 {
1734 ; CHECK-LABEL: test_concat_v4i32_v4i32_v4i32:
1735 ; CHECK: @ %bb.0: @ %entry
1736 ; CHECK-NEXT: vmov.f64 d1, d2
1739 %vecinit6 = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1740 ret <4 x i32> %vecinit6
1743 define <4 x i32> @test_concat_v4i32_v2i32_v4i32(<2 x i32> %x, <4 x i32> %y) #0 {
1744 ; CHECK-LABEL: test_concat_v4i32_v2i32_v4i32:
1745 ; CHECK: @ %bb.0: @ %entry
1746 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
1747 ; CHECK-NEXT: vmov.f64 d1, d2
1750 %vecext = extractelement <2 x i32> %x, i32 0
1751 %vecinit = insertelement <4 x i32> undef, i32 %vecext, i32 0
1752 %vecext1 = extractelement <2 x i32> %x, i32 1
1753 %vecinit2 = insertelement <4 x i32> %vecinit, i32 %vecext1, i32 1
1754 %vecinit6 = shufflevector <4 x i32> %vecinit2, <4 x i32> %y, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1755 ret <4 x i32> %vecinit6
1758 define <4 x i32> @test_concat_v4i32_v4i32_v2i32(<4 x i32> %x, <2 x i32> %y) #0 {
1759 ; CHECK-LABEL: test_concat_v4i32_v4i32_v2i32:
1760 ; CHECK: @ %bb.0: @ %entry
1761 ; CHECK-NEXT: vmov.f64 d1, d2
1764 %vecext = extractelement <4 x i32> %x, i32 0
1765 %vecinit = insertelement <4 x i32> undef, i32 %vecext, i32 0
1766 %vecext1 = extractelement <4 x i32> %x, i32 1
1767 %vecinit2 = insertelement <4 x i32> %vecinit, i32 %vecext1, i32 1
1768 %vecext3 = extractelement <2 x i32> %y, i32 0
1769 %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %vecext3, i32 2
1770 %vecext5 = extractelement <2 x i32> %y, i32 1
1771 %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %vecext5, i32 3
1772 ret <4 x i32> %vecinit6
1775 define <4 x i32> @test_concat_v4i32_v2i32_v2i32(<2 x i32> %x, <2 x i32> %y) #0 {
1776 ; CHECK-LABEL: test_concat_v4i32_v2i32_v2i32:
1777 ; CHECK: @ %bb.0: @ %entry
1778 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
1779 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
1782 %vecinit6 = shufflevector <2 x i32> %x, <2 x i32> %y, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1783 ret <4 x i32> %vecinit6
1786 define <2 x i64> @test_concat_v2i64_v2i64_v2i64(<2 x i64> %x, <2 x i64> %y) #0 {
1787 ; CHECK-LABEL: test_concat_v2i64_v2i64_v2i64:
1788 ; CHECK: @ %bb.0: @ %entry
1789 ; CHECK-NEXT: vmov.f64 d1, d2
1792 %vecinit2 = shufflevector <2 x i64> %x, <2 x i64> %y, <2 x i32> <i32 0, i32 2>
1793 ret <2 x i64> %vecinit2
1796 define <2 x i64> @test_concat_v2i64_v1i64_v2i64(<1 x i64> %x, <2 x i64> %y) #0 {
1797 ; CHECK-LABEL: test_concat_v2i64_v1i64_v2i64:
1798 ; CHECK: @ %bb.0: @ %entry
1799 ; CHECK-NEXT: @ kill: def $d0 killed $d0 def $q0
1800 ; CHECK-NEXT: vmov.f64 d1, d2
1803 %vecext = extractelement <1 x i64> %x, i32 0
1804 %vecinit = insertelement <2 x i64> undef, i64 %vecext, i32 0
1805 %vecinit2 = shufflevector <2 x i64> %vecinit, <2 x i64> %y, <2 x i32> <i32 0, i32 2>
1806 ret <2 x i64> %vecinit2
1809 define <2 x i64> @test_concat_v2i64_v2i64_v1i64(<2 x i64> %x, <1 x i64> %y) #0 {
1810 ; CHECK-LABEL: test_concat_v2i64_v2i64_v1i64:
1811 ; CHECK: @ %bb.0: @ %entry
1812 ; CHECK-NEXT: vmov.f64 d1, d2
1815 %vecext = extractelement <2 x i64> %x, i32 0
1816 %vecinit = insertelement <2 x i64> undef, i64 %vecext, i32 0
1817 %vecext1 = extractelement <1 x i64> %y, i32 0
1818 %vecinit2 = insertelement <2 x i64> %vecinit, i64 %vecext1, i32 1
1819 ret <2 x i64> %vecinit2
1822 define <2 x i64> @test_concat_v2i64_v1i64_v1i64(<1 x i64> %x, <1 x i64> %y) #0 {
1823 ; CHECK-LABEL: test_concat_v2i64_v1i64_v1i64:
1824 ; CHECK: @ %bb.0: @ %entry
1825 ; CHECK-NEXT: @ kill: def $d1 killed $d1 killed $q0 def $q0
1826 ; CHECK-NEXT: @ kill: def $d0 killed $d0 killed $q0 def $q0
1829 %vecext = extractelement <1 x i64> %x, i32 0
1830 %vecinit = insertelement <2 x i64> undef, i64 %vecext, i32 0
1831 %vecext1 = extractelement <1 x i64> %y, i32 0
1832 %vecinit2 = insertelement <2 x i64> %vecinit, i64 %vecext1, i32 1
1833 ret <2 x i64> %vecinit2
1837 define <4 x i16> @concat_vector_v4i16_const() {
1838 ; CHECK-LABEL: concat_vector_v4i16_const:
1840 ; CHECK-NEXT: vmov.i32 d0, #0x0
1842 %r = shufflevector <1 x i16> zeroinitializer, <1 x i16> undef, <4 x i32> zeroinitializer
1846 define <4 x i16> @concat_vector_v4i16_const_one() {
1847 ; CHECK-LABEL: concat_vector_v4i16_const_one:
1849 ; CHECK-NEXT: vmov.i16 d0, #0x1
1851 %r = shufflevector <1 x i16> <i16 1>, <1 x i16> undef, <4 x i32> zeroinitializer
1855 define <4 x i32> @concat_vector_v4i32_const() {
1856 ; CHECK-LABEL: concat_vector_v4i32_const:
1858 ; CHECK-NEXT: vmov.i32 q0, #0x0
1860 %r = shufflevector <1 x i32> zeroinitializer, <1 x i32> undef, <4 x i32> zeroinitializer
1864 define <8 x i8> @concat_vector_v8i8_const() {
1865 ; CHECK-LABEL: concat_vector_v8i8_const:
1867 ; CHECK-NEXT: vmov.i32 d0, #0x0
1869 %r = shufflevector <1 x i8> zeroinitializer, <1 x i8> undef, <8 x i32> zeroinitializer
1873 define <8 x i16> @concat_vector_v8i16_const() {
1874 ; CHECK-LABEL: concat_vector_v8i16_const:
1876 ; CHECK-NEXT: vmov.i32 q0, #0x0
1878 %r = shufflevector <1 x i16> zeroinitializer, <1 x i16> undef, <8 x i32> zeroinitializer
1882 define <8 x i16> @concat_vector_v8i16_const_one() {
1883 ; CHECK-LABEL: concat_vector_v8i16_const_one:
1885 ; CHECK-NEXT: vmov.i16 q0, #0x1
1887 %r = shufflevector <1 x i16> <i16 1>, <1 x i16> undef, <8 x i32> zeroinitializer
1891 define <16 x i8> @concat_vector_v16i8_const() {
1892 ; CHECK-LABEL: concat_vector_v16i8_const:
1894 ; CHECK-NEXT: vmov.i32 q0, #0x0
1896 %r = shufflevector <1 x i8> zeroinitializer, <1 x i8> undef, <16 x i32> zeroinitializer
1900 define <4 x i16> @concat_vector_v4i16(<1 x i16> %a) {
1901 ; CHECK-LABEL: concat_vector_v4i16:
1903 ; CHECK-NEXT: vdup.16 d0, r0
1905 %r = shufflevector <1 x i16> %a, <1 x i16> undef, <4 x i32> zeroinitializer
1909 define <4 x i32> @concat_vector_v4i32(<1 x i32> %a) {
1910 ; CHECK-LABEL: concat_vector_v4i32:
1912 ; CHECK-NEXT: vdup.32 q0, r0
1914 %r = shufflevector <1 x i32> %a, <1 x i32> undef, <4 x i32> zeroinitializer
1918 define <8 x i8> @concat_vector_v8i8(<1 x i8> %a) {
1919 ; CHECK-LABEL: concat_vector_v8i8:
1921 ; CHECK-NEXT: vdup.8 d0, r0
1923 %r = shufflevector <1 x i8> %a, <1 x i8> undef, <8 x i32> zeroinitializer
1927 define <8 x i16> @concat_vector_v8i16(<1 x i16> %a) {
1928 ; CHECK-LABEL: concat_vector_v8i16:
1930 ; CHECK-NEXT: vdup.16 q0, r0
1932 %r = shufflevector <1 x i16> %a, <1 x i16> undef, <8 x i32> zeroinitializer
1936 define <16 x i8> @concat_vector_v16i8(<1 x i8> %a) {
1937 ; CHECK-LABEL: concat_vector_v16i8:
1939 ; CHECK-NEXT: vdup.8 q0, r0
1941 %r = shufflevector <1 x i8> %a, <1 x i8> undef, <16 x i32> zeroinitializer