[X86][AVX512] Added support for AVX512 UNPCK shuffle decode comments.
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v4.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX1
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX2
3 ; RUN: llc < %s -mcpu=knl -mattr=+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512VL
4
5 target triple = "x86_64-unknown-unknown"
6
7 define <4 x double> @shuffle_v4f64_0000(<4 x double> %a, <4 x double> %b) {
8 ; AVX1-LABEL: shuffle_v4f64_0000:
9 ; AVX1:       # BB#0:
10 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
11 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
12 ; AVX1-NEXT:    retq
13 ;
14 ; AVX2-LABEL: shuffle_v4f64_0000:
15 ; AVX2:       # BB#0:
16 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
17 ; AVX2-NEXT:    retq
18 ;
19 ; AVX512VL-LABEL: shuffle_v4f64_0000:
20 ; AVX512VL:       # BB#0:
21 ; AVX512VL-NEXT:    vbroadcastsd %xmm0, %ymm0
22 ; AVX512VL-NEXT:    retq
23   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
24   ret <4 x double> %shuffle
25 }
26
27 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
28 ; AVX1-LABEL: shuffle_v4f64_0001:
29 ; AVX1:       # BB#0:
30 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
31 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
32 ; AVX1-NEXT:    retq
33 ;
34 ; AVX2-LABEL: shuffle_v4f64_0001:
35 ; AVX2:       # BB#0:
36 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,0,1]
37 ; AVX2-NEXT:    retq
38 ;
39 ; AVX512VL-LABEL: shuffle_v4f64_0001:
40 ; AVX512VL:       # BB#0:
41 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,0,1]
42 ; AVX512VL-NEXT:    retq
43   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
44   ret <4 x double> %shuffle
45 }
46
47 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
48 ; AVX1-LABEL: shuffle_v4f64_0020:
49 ; AVX1:       # BB#0:
50 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
51 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
52 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
53 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
54 ; AVX1-NEXT:    retq
55 ;
56 ; AVX2-LABEL: shuffle_v4f64_0020:
57 ; AVX2:       # BB#0:
58 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,0]
59 ; AVX2-NEXT:    retq
60 ;
61 ; AVX512VL-LABEL: shuffle_v4f64_0020:
62 ; AVX512VL:       # BB#0:
63 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,0]
64 ; AVX512VL-NEXT:    retq
65   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
66   ret <4 x double> %shuffle
67 }
68
69 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
70 ; AVX1-LABEL: shuffle_v4f64_0300:
71 ; AVX1:       # BB#0:
72 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
73 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[0,1,2,2]
74 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
75 ; AVX1-NEXT:    retq
76 ;
77 ; AVX2-LABEL: shuffle_v4f64_0300:
78 ; AVX2:       # BB#0:
79 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,0,0]
80 ; AVX2-NEXT:    retq
81 ;
82 ; AVX512VL-LABEL: shuffle_v4f64_0300:
83 ; AVX512VL:       # BB#0:
84 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,0,0]
85 ; AVX512VL-NEXT:    retq
86   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
87   ret <4 x double> %shuffle
88 }
89
90 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
91 ; AVX1-LABEL: shuffle_v4f64_1000:
92 ; AVX1:       # BB#0:
93 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
94 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
95 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
96 ; AVX1-NEXT:    retq
97 ;
98 ; AVX2-LABEL: shuffle_v4f64_1000:
99 ; AVX2:       # BB#0:
100 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]
101 ; AVX2-NEXT:    retq
102 ;
103 ; AVX512VL-LABEL: shuffle_v4f64_1000:
104 ; AVX512VL:       # BB#0:
105 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]
106 ; AVX512VL-NEXT:    retq
107   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
108   ret <4 x double> %shuffle
109 }
110
111 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
112 ; AVX1-LABEL: shuffle_v4f64_2200:
113 ; AVX1:       # BB#0:
114 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
115 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
116 ; AVX1-NEXT:    retq
117 ;
118 ; AVX2-LABEL: shuffle_v4f64_2200:
119 ; AVX2:       # BB#0:
120 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]
121 ; AVX2-NEXT:    retq
122 ;
123 ; AVX512VL-LABEL: shuffle_v4f64_2200:
124 ; AVX512VL:       # BB#0:
125 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]
126 ; AVX512VL-NEXT:    retq
127   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
128   ret <4 x double> %shuffle
129 }
130
131 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
132 ; AVX1-LABEL: shuffle_v4f64_3330:
133 ; AVX1:       # BB#0:
134 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
135 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
136 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,2]
137 ; AVX1-NEXT:    retq
138 ;
139 ; AVX2-LABEL: shuffle_v4f64_3330:
140 ; AVX2:       # BB#0:
141 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,3,3,0]
142 ; AVX2-NEXT:    retq
143 ;
144 ; AVX512VL-LABEL: shuffle_v4f64_3330:
145 ; AVX512VL:       # BB#0:
146 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,3,3,0]
147 ; AVX512VL-NEXT:    retq
148   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
149   ret <4 x double> %shuffle
150 }
151
152 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
153 ; AVX1-LABEL: shuffle_v4f64_3210:
154 ; AVX1:       # BB#0:
155 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
156 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
157 ; AVX1-NEXT:    retq
158 ;
159 ; AVX2-LABEL: shuffle_v4f64_3210:
160 ; AVX2:       # BB#0:
161 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,2,1,0]
162 ; AVX2-NEXT:    retq
163 ;
164 ; AVX512VL-LABEL: shuffle_v4f64_3210:
165 ; AVX512VL:       # BB#0:
166 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,2,1,0]
167 ; AVX512VL-NEXT:    retq
168   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
169   ret <4 x double> %shuffle
170 }
171
172 define <4 x double> @shuffle_v4f64_0023(<4 x double> %a, <4 x double> %b) {
173 ; AVX1-LABEL: shuffle_v4f64_0023:
174 ; AVX1:       # BB#0:
175 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,3]
176 ; AVX1-NEXT:    retq
177 ;
178 ; AVX2-LABEL: shuffle_v4f64_0023:
179 ; AVX2:       # BB#0:
180 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,3]
181 ; AVX2-NEXT:    retq
182 ;
183 ; AVX512VL-LABEL: shuffle_v4f64_0023:
184 ; AVX512VL:       # BB#0:
185 ; AVX512VL-NEXT:    vpermilpd $8, %ymm0, %ymm0
186 ; AVX512VL-NEXT:    retq
187
188   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
189   ret <4 x double> %shuffle
190 }
191
192 define <4 x double> @shuffle_v4f64_0022(<4 x double> %a, <4 x double> %b) {
193 ; ALL-LABEL: shuffle_v4f64_0022:
194 ; ALL:       # BB#0:
195 ; ALL-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
196 ; ALL-NEXT:    retq
197   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
198   ret <4 x double> %shuffle
199 }
200
201 define <4 x double> @shuffle_v4f64_1032(<4 x double> %a, <4 x double> %b) {
202 ; AVX1-LABEL: shuffle_v4f64_1032:
203 ; AVX1:       # BB#0:
204 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
205 ; AVX1-NEXT:    retq
206 ;
207 ; AVX2-LABEL: shuffle_v4f64_1032:
208 ; AVX2:       # BB#0:
209 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
210 ; AVX2-NEXT:    retq
211 ;
212 ; AVX512VL-LABEL: shuffle_v4f64_1032:
213 ; AVX512VL:       # BB#0:
214 ; AVX512VL-NEXT:    vpermilpd $5, %ymm0, %ymm0
215 ; AVX512VL-NEXT:    retq
216   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
217   ret <4 x double> %shuffle
218 }
219
220 define <4 x double> @shuffle_v4f64_1133(<4 x double> %a, <4 x double> %b) {
221 ; AVX1-LABEL: shuffle_v4f64_1133:
222 ; AVX1:       # BB#0:
223 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,3]
224 ; AVX1-NEXT:    retq
225 ;
226 ; AVX2-LABEL: shuffle_v4f64_1133:
227 ; AVX2:       # BB#0:
228 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,3]
229 ; AVX2-NEXT:    retq
230 ;
231 ; AVX512VL-LABEL: shuffle_v4f64_1133:
232 ; AVX512VL:       # BB#0:
233 ; AVX512VL-NEXT:    vpermilpd $15, %ymm0, %ymm0
234 ; AVX512VL-NEXT:    retq
235   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
236   ret <4 x double> %shuffle
237 }
238
239 define <4 x double> @shuffle_v4f64_1023(<4 x double> %a, <4 x double> %b) {
240 ; AVX1-LABEL: shuffle_v4f64_1023:
241 ; AVX1:       # BB#0:
242 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,3]
243 ; AVX1-NEXT:    retq
244 ;
245 ; AVX2-LABEL: shuffle_v4f64_1023:
246 ; AVX2:       # BB#0:
247 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,3]
248 ; AVX2-NEXT:    retq
249 ;
250 ; AVX512VL-LABEL: shuffle_v4f64_1023:
251 ; AVX512VL:       # BB#0:
252 ; AVX512VL-NEXT:    vpermilpd $9, %ymm0, %ymm0
253 ; AVX512VL-NEXT:    retq
254   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
255   ret <4 x double> %shuffle
256 }
257
258 define <4 x double> @shuffle_v4f64_1022(<4 x double> %a, <4 x double> %b) {
259 ; AVX1-LABEL: shuffle_v4f64_1022:
260 ; AVX1:       # BB#0:
261 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]
262 ; AVX1-NEXT:    retq
263 ;
264 ; AVX2-LABEL: shuffle_v4f64_1022:
265 ; AVX2:       # BB#0:
266 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]
267 ; AVX2-NEXT:    retq
268 ;
269 ; AVX512VL-LABEL: shuffle_v4f64_1022:
270 ; AVX512VL:       # BB#0:
271 ; AVX512VL-NEXT:    vpermilpd $1, %ymm0, %ymm0
272 ; AVX512VL-NEXT:    retq
273   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 2>
274   ret <4 x double> %shuffle
275 }
276
277 define <4 x double> @shuffle_v4f64_0423(<4 x double> %a, <4 x double> %b) {
278 ; AVX1-LABEL: shuffle_v4f64_0423:
279 ; AVX1:       # BB#0:
280 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
281 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
282 ; AVX1-NEXT:    retq
283 ;
284 ; AVX2-LABEL: shuffle_v4f64_0423:
285 ; AVX2:       # BB#0:
286 ; AVX2-NEXT:    vbroadcastsd %xmm1, %ymm1
287 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
288 ; AVX2-NEXT:    retq
289 ;
290 ; AVX512VL-LABEL: shuffle_v4f64_0423:
291 ; AVX512VL:       # BB#0:
292 ; AVX512VL-NEXT:    vbroadcastsd %xmm1, %ymm1
293 ; AVX512VL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
294 ; AVX512VL-NEXT:    retq
295   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
296   ret <4 x double> %shuffle
297 }
298
299 define <4 x double> @shuffle_v4f64_0462(<4 x double> %a, <4 x double> %b) {
300 ; ALL-LABEL: shuffle_v4f64_0462:
301 ; ALL:       # BB#0:
302 ; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
303 ; ALL-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
304 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2],ymm0[3]
305 ; ALL-NEXT:    retq
306   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 6, i32 2>
307   ret <4 x double> %shuffle
308 }
309
310 define <4 x double> @shuffle_v4f64_0426(<4 x double> %a, <4 x double> %b) {
311 ; ALL-LABEL: shuffle_v4f64_0426:
312 ; ALL:       # BB#0:
313 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
314 ; ALL-NEXT:    retq
315   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
316   ret <4 x double> %shuffle
317 }
318
319 define <4 x double> @shuffle_v4f64_1537(<4 x double> %a, <4 x double> %b) {
320 ; ALL-LABEL: shuffle_v4f64_1537:
321 ; ALL:       # BB#0:
322 ; ALL-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
323 ; ALL-NEXT:    retq
324   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
325   ret <4 x double> %shuffle
326 }
327
328 define <4 x double> @shuffle_v4f64_4062(<4 x double> %a, <4 x double> %b) {
329 ; ALL-LABEL: shuffle_v4f64_4062:
330 ; ALL:       # BB#0:
331 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
332 ; ALL-NEXT:    retq
333   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
334   ret <4 x double> %shuffle
335 }
336
337 define <4 x double> @shuffle_v4f64_5173(<4 x double> %a, <4 x double> %b) {
338 ; ALL-LABEL: shuffle_v4f64_5173:
339 ; ALL:       # BB#0:
340 ; ALL-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
341 ; ALL-NEXT:    retq
342   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 7, i32 3>
343   ret <4 x double> %shuffle
344 }
345
346 define <4 x double> @shuffle_v4f64_5163(<4 x double> %a, <4 x double> %b) {
347 ; AVX1-LABEL: shuffle_v4f64_5163:
348 ; AVX1:       # BB#0:
349 ; AVX1-NEXT:    vshufpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[2],ymm0[3]
350 ; AVX1-NEXT:    retq
351 ;
352 ; AVX2-LABEL: shuffle_v4f64_5163:
353 ; AVX2:       # BB#0:
354 ; AVX2-NEXT:    vshufpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[2],ymm0[3]
355 ; AVX2-NEXT:    retq
356 ;
357 ; AVX512VL-LABEL: shuffle_v4f64_5163:
358 ; AVX512VL:       # BB#0:
359 ; AVX512VL-NEXT:    vshufpd $11, %ymm0, %ymm1, %ymm0
360 ; AVX512VL-NEXT:    retq
361   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 6, i32 3>
362   ret <4 x double> %shuffle
363 }
364
365 define <4 x double> @shuffle_v4f64_0527(<4 x double> %a, <4 x double> %b) {
366 ; ALL-LABEL: shuffle_v4f64_0527:
367 ; ALL:       # BB#0:
368 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
369 ; ALL-NEXT:    retq
370   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
371   ret <4 x double> %shuffle
372 }
373
374 define <4 x double> @shuffle_v4f64_4163(<4 x double> %a, <4 x double> %b) {
375 ; ALL-LABEL: shuffle_v4f64_4163:
376 ; ALL:       # BB#0:
377 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]
378 ; ALL-NEXT:    retq
379   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
380   ret <4 x double> %shuffle
381 }
382
383 define <4 x double> @shuffle_v4f64_0145(<4 x double> %a, <4 x double> %b) {
384 ; AVX1-LABEL: shuffle_v4f64_0145:
385 ; AVX1:       # BB#0:
386 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
387 ; AVX1-NEXT:    retq
388 ;
389 ; AVX2-LABEL: shuffle_v4f64_0145:
390 ; AVX2:       # BB#0:
391 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
392 ; AVX2-NEXT:    retq
393 ;
394 ; AVX512VL-LABEL: shuffle_v4f64_0145:
395 ; AVX512VL:       # BB#0:
396 ; AVX512VL-NEXT:    vinsertf32x4 $1, %xmm1, %ymm0, %ymm0
397 ; AVX512VL-NEXT:    retq
398   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
399   ret <4 x double> %shuffle
400 }
401
402 define <4 x double> @shuffle_v4f64_4501(<4 x double> %a, <4 x double> %b) {
403 ; AVX1-LABEL: shuffle_v4f64_4501:
404 ; AVX1:       # BB#0:
405 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
406 ; AVX1-NEXT:    retq
407 ;
408 ; AVX2-LABEL: shuffle_v4f64_4501:
409 ; AVX2:       # BB#0:
410 ; AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
411 ; AVX2-NEXT:    retq
412 ;
413 ; AVX512VL-LABEL: shuffle_v4f64_4501:
414 ; AVX512VL:       # BB#0:
415 ; AVX512VL-NEXT:    vinsertf32x4 $1, %xmm0, %ymm1, %ymm0
416 ; AVX512VL-NEXT:    retq
417   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
418   ret <4 x double> %shuffle
419 }
420
421 define <4 x double> @shuffle_v4f64_0167(<4 x double> %a, <4 x double> %b) {
422 ; ALL-LABEL: shuffle_v4f64_0167:
423 ; ALL:       # BB#0:
424 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
425 ; ALL-NEXT:    retq
426   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
427   ret <4 x double> %shuffle
428 }
429
430 define <4 x double> @shuffle_v4f64_1054(<4 x double> %a, <4 x double> %b) {
431 ; AVX1-LABEL: shuffle_v4f64_1054:
432 ; AVX1:       # BB#0:
433 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
434 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
435 ; AVX1-NEXT:    retq
436 ;
437 ; AVX2-LABEL: shuffle_v4f64_1054:
438 ; AVX2:       # BB#0:
439 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
440 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
441 ; AVX2-NEXT:    retq
442 ;
443 ; AVX512VL-LABEL: shuffle_v4f64_1054:
444 ; AVX512VL:       # BB#0:
445 ; AVX512VL-NEXT:    vinsertf32x4 $1, %xmm1, %ymm0, %ymm0
446 ; AVX512VL-NEXT:    vpermilpd $5, %ymm0, %ymm0
447 ; AVX512VL-NEXT:    retq
448   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 5, i32 4>
449   ret <4 x double> %shuffle
450 }
451
452 define <4 x double> @shuffle_v4f64_3254(<4 x double> %a, <4 x double> %b) {
453 ; AVX1-LABEL: shuffle_v4f64_3254:
454 ; AVX1:       # BB#0:
455 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
456 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
457 ; AVX1-NEXT:    retq
458 ;
459 ; AVX2-LABEL: shuffle_v4f64_3254:
460 ; AVX2:       # BB#0:
461 ; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
462 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
463 ; AVX2-NEXT:    retq
464 ;
465 ; AVX512VL-LABEL: shuffle_v4f64_3254:
466 ; AVX512VL:       # BB#0:
467 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
468 ; AVX512VL-NEXT:    vpermilpd $5, %ymm0, %ymm0
469 ; AVX512VL-NEXT:    retq
470   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 5, i32 4>
471   ret <4 x double> %shuffle
472 }
473
474 define <4 x double> @shuffle_v4f64_3276(<4 x double> %a, <4 x double> %b) {
475 ; AVX1-LABEL: shuffle_v4f64_3276:
476 ; AVX1:       # BB#0:
477 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
478 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
479 ; AVX1-NEXT:    retq
480 ;
481 ; AVX2-LABEL: shuffle_v4f64_3276:
482 ; AVX2:       # BB#0:
483 ; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
484 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
485 ; AVX2-NEXT:    retq
486 ;
487 ; AVX512VL-LABEL: shuffle_v4f64_3276:
488 ; AVX512VL:       # BB#0:
489 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
490 ; AVX512VL-NEXT:    vpermilpd $5, %ymm0, %ymm0
491 ; AVX512VL-NEXT:    retq
492   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 7, i32 6>
493   ret <4 x double> %shuffle
494 }
495
496 define <4 x double> @shuffle_v4f64_1076(<4 x double> %a, <4 x double> %b) {
497 ; AVX1-LABEL: shuffle_v4f64_1076:
498 ; AVX1:       # BB#0:
499 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
500 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
501 ; AVX1-NEXT:    retq
502 ;
503 ; AVX2-LABEL: shuffle_v4f64_1076:
504 ; AVX2:       # BB#0:
505 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
506 ; AVX2-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
507 ; AVX2-NEXT:    retq
508 ;
509 ; AVX512VL-LABEL: shuffle_v4f64_1076:
510 ; AVX512VL:       # BB#0:
511 ; AVX512VL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
512 ; AVX512VL-NEXT:    vpermilpd $5, %ymm0, %ymm0
513 ; AVX512VL-NEXT:    retq
514   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6>
515   ret <4 x double> %shuffle
516 }
517
518 define <4 x double> @shuffle_v4f64_0415(<4 x double> %a, <4 x double> %b) {
519 ; AVX1-LABEL: shuffle_v4f64_0415:
520 ; AVX1:       # BB#0:
521 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
522 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
523 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
524 ; AVX1-NEXT:    retq
525 ;
526 ; AVX2-LABEL: shuffle_v4f64_0415:
527 ; AVX2:       # BB#0:
528 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]
529 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
530 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
531 ; AVX2-NEXT:    retq
532 ;
533 ; AVX512VL-LABEL: shuffle_v4f64_0415:
534 ; AVX512VL:       # BB#0:
535 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]
536 ; AVX512VL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
537 ; AVX512VL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
538 ; AVX512VL-NEXT:    retq
539   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
540   ret <4 x double> %shuffle
541 }
542
543 define <4 x double> @shuffle_v4f64_u062(<4 x double> %a, <4 x double> %b) {
544 ; ALL-LABEL: shuffle_v4f64_u062:
545 ; ALL:       # BB#0:
546 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
547 ; ALL-NEXT:    retq
548   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 undef, i32 0, i32 6, i32 2>
549   ret <4 x double> %shuffle
550 }
551
552 define <4 x i64> @shuffle_v4i64_0000(<4 x i64> %a, <4 x i64> %b) {
553 ; AVX1-LABEL: shuffle_v4i64_0000:
554 ; AVX1:       # BB#0:
555 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
556 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
557 ; AVX1-NEXT:    retq
558 ;
559 ; AVX2-LABEL: shuffle_v4i64_0000:
560 ; AVX2:       # BB#0:
561 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
562 ; AVX2-NEXT:    retq
563 ;
564 ; AVX512VL-LABEL: shuffle_v4i64_0000:
565 ; AVX512VL:       # BB#0:
566 ; AVX512VL-NEXT:    vpbroadcastq %xmm0, %ymm0
567 ; AVX512VL-NEXT:    retq
568   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
569   ret <4 x i64> %shuffle
570 }
571
572 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
573 ; AVX1-LABEL: shuffle_v4i64_0001:
574 ; AVX1:       # BB#0:
575 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
576 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
577 ; AVX1-NEXT:    retq
578 ;
579 ; AVX2-LABEL: shuffle_v4i64_0001:
580 ; AVX2:       # BB#0:
581 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,0,1]
582 ; AVX2-NEXT:    retq
583 ;
584 ; AVX512VL-LABEL: shuffle_v4i64_0001:
585 ; AVX512VL:       # BB#0:
586 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,0,1]
587 ; AVX512VL-NEXT:    retq
588   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
589   ret <4 x i64> %shuffle
590 }
591
592 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
593 ; AVX1-LABEL: shuffle_v4i64_0020:
594 ; AVX1:       # BB#0:
595 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
596 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
597 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
598 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
599 ; AVX1-NEXT:    retq
600 ;
601 ; AVX2-LABEL: shuffle_v4i64_0020:
602 ; AVX2:       # BB#0:
603 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,0]
604 ; AVX2-NEXT:    retq
605 ;
606 ; AVX512VL-LABEL: shuffle_v4i64_0020:
607 ; AVX512VL:       # BB#0:
608 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,0]
609 ; AVX512VL-NEXT:    retq
610   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
611   ret <4 x i64> %shuffle
612 }
613
614 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
615 ; AVX1-LABEL: shuffle_v4i64_0112:
616 ; AVX1:       # BB#0:
617 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
618 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1],xmm1[0]
619 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
620 ; AVX1-NEXT:    retq
621 ;
622 ; AVX2-LABEL: shuffle_v4i64_0112:
623 ; AVX2:       # BB#0:
624 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
625 ; AVX2-NEXT:    retq
626 ;
627 ; AVX512VL-LABEL: shuffle_v4i64_0112:
628 ; AVX512VL:       # BB#0:
629 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
630 ; AVX512VL-NEXT:    retq
631   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
632   ret <4 x i64> %shuffle
633 }
634
635 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
636 ; AVX1-LABEL: shuffle_v4i64_0300:
637 ; AVX1:       # BB#0:
638 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
639 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[0,1,2,2]
640 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
641 ; AVX1-NEXT:    retq
642 ;
643 ; AVX2-LABEL: shuffle_v4i64_0300:
644 ; AVX2:       # BB#0:
645 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,0,0]
646 ; AVX2-NEXT:    retq
647 ;
648 ; AVX512VL-LABEL: shuffle_v4i64_0300:
649 ; AVX512VL:       # BB#0:
650 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,0,0]
651 ; AVX512VL-NEXT:    retq
652   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
653   ret <4 x i64> %shuffle
654 }
655
656 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
657 ; AVX1-LABEL: shuffle_v4i64_1000:
658 ; AVX1:       # BB#0:
659 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
660 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
661 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
662 ; AVX1-NEXT:    retq
663 ;
664 ; AVX2-LABEL: shuffle_v4i64_1000:
665 ; AVX2:       # BB#0:
666 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,0,0]
667 ; AVX2-NEXT:    retq
668 ;
669 ; AVX512VL-LABEL: shuffle_v4i64_1000:
670 ; AVX512VL:       # BB#0:
671 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,0,0]
672 ; AVX512VL-NEXT:    retq
673   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
674   ret <4 x i64> %shuffle
675 }
676
677 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
678 ; AVX1-LABEL: shuffle_v4i64_2200:
679 ; AVX1:       # BB#0:
680 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
681 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
682 ; AVX1-NEXT:    retq
683 ;
684 ; AVX2-LABEL: shuffle_v4i64_2200:
685 ; AVX2:       # BB#0:
686 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,0,0]
687 ; AVX2-NEXT:    retq
688 ;
689 ; AVX512VL-LABEL: shuffle_v4i64_2200:
690 ; AVX512VL:       # BB#0:
691 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,0,0]
692 ; AVX512VL-NEXT:    retq
693   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
694   ret <4 x i64> %shuffle
695 }
696
697 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
698 ; AVX1-LABEL: shuffle_v4i64_3330:
699 ; AVX1:       # BB#0:
700 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
701 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
702 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,2]
703 ; AVX1-NEXT:    retq
704 ;
705 ; AVX2-LABEL: shuffle_v4i64_3330:
706 ; AVX2:       # BB#0:
707 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,3,3,0]
708 ; AVX2-NEXT:    retq
709 ;
710 ; AVX512VL-LABEL: shuffle_v4i64_3330:
711 ; AVX512VL:       # BB#0:
712 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,3,3,0]
713 ; AVX512VL-NEXT:    retq
714   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
715   ret <4 x i64> %shuffle
716 }
717
718 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
719 ; AVX1-LABEL: shuffle_v4i64_3210:
720 ; AVX1:       # BB#0:
721 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
722 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
723 ; AVX1-NEXT:    retq
724 ;
725 ; AVX2-LABEL: shuffle_v4i64_3210:
726 ; AVX2:       # BB#0:
727 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,2,1,0]
728 ; AVX2-NEXT:    retq
729 ;
730 ; AVX512VL-LABEL: shuffle_v4i64_3210:
731 ; AVX512VL:       # BB#0:
732 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,2,1,0]
733 ; AVX512VL-NEXT:    retq
734   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
735   ret <4 x i64> %shuffle
736 }
737
738 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
739 ; AVX1-LABEL: shuffle_v4i64_0124:
740 ; AVX1:       # BB#0:
741 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
742 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
743 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3]
744 ; AVX1-NEXT:    retq
745 ;
746 ; AVX2-LABEL: shuffle_v4i64_0124:
747 ; AVX2:       # BB#0:
748 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
749 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
750 ; AVX2-NEXT:    retq
751 ;
752 ; AVX512VL-LABEL: shuffle_v4i64_0124:
753 ; AVX512VL:       # BB#0:
754 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %ymm1
755 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
756 ; AVX512VL-NEXT:    retq
757   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
758   ret <4 x i64> %shuffle
759 }
760
761 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
762 ; AVX1-LABEL: shuffle_v4i64_0142:
763 ; AVX1:       # BB#0:
764 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
765 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,1,2,2]
766 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
767 ; AVX1-NEXT:    retq
768 ;
769 ; AVX2-LABEL: shuffle_v4i64_0142:
770 ; AVX2:       # BB#0:
771 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm1, %ymm1
772 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,2,2]
773 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
774 ; AVX2-NEXT:    retq
775 ;
776 ; AVX512VL-LABEL: shuffle_v4i64_0142:
777 ; AVX512VL:       # BB#0:
778 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm1, %ymm1
779 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,2,2]
780 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
781 ; AVX512VL-NEXT:    retq
782   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
783   ret <4 x i64> %shuffle
784 }
785
786 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
787 ; AVX1-LABEL: shuffle_v4i64_0412:
788 ; AVX1:       # BB#0:
789 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
790 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1],xmm2[0]
791 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
792 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
793 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
794 ; AVX1-NEXT:    retq
795 ;
796 ; AVX2-LABEL: shuffle_v4i64_0412:
797 ; AVX2:       # BB#0:
798 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
799 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
800 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
801 ; AVX2-NEXT:    retq
802 ;
803 ; AVX512VL-LABEL: shuffle_v4i64_0412:
804 ; AVX512VL:       # BB#0:
805 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
806 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %ymm1
807 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
808 ; AVX512VL-NEXT:    retq
809   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
810   ret <4 x i64> %shuffle
811 }
812
813 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
814 ; AVX1-LABEL: shuffle_v4i64_4012:
815 ; AVX1:       # BB#0:
816 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
817 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1],xmm2[0]
818 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
819 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
820 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3]
821 ; AVX1-NEXT:    retq
822 ;
823 ; AVX2-LABEL: shuffle_v4i64_4012:
824 ; AVX2:       # BB#0:
825 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,2]
826 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
827 ; AVX2-NEXT:    retq
828 ;
829 ; AVX512VL-LABEL: shuffle_v4i64_4012:
830 ; AVX512VL:       # BB#0:
831 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,2]
832 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
833 ; AVX512VL-NEXT:    retq
834   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
835   ret <4 x i64> %shuffle
836 }
837
838 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
839 ; AVX1-LABEL: shuffle_v4i64_0145:
840 ; AVX1:       # BB#0:
841 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
842 ; AVX1-NEXT:    retq
843 ;
844 ; AVX2-LABEL: shuffle_v4i64_0145:
845 ; AVX2:       # BB#0:
846 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
847 ; AVX2-NEXT:    retq
848 ;
849 ; AVX512VL-LABEL: shuffle_v4i64_0145:
850 ; AVX512VL:       # BB#0:
851 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
852 ; AVX512VL-NEXT:    retq
853   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
854   ret <4 x i64> %shuffle
855 }
856
857 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
858 ; AVX1-LABEL: shuffle_v4i64_0451:
859 ; AVX1:       # BB#0:
860 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm1[1],xmm0[1]
861 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
862 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
863 ; AVX1-NEXT:    retq
864 ;
865 ; AVX2-LABEL: shuffle_v4i64_0451:
866 ; AVX2:       # BB#0:
867 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
868 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,1,3]
869 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5],ymm0[6,7]
870 ; AVX2-NEXT:    retq
871 ;
872 ; AVX512VL-LABEL: shuffle_v4i64_0451:
873 ; AVX512VL:       # BB#0:
874 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
875 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,1,3]
876 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5],ymm0[6,7]
877 ; AVX512VL-NEXT:    retq
878   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
879   ret <4 x i64> %shuffle
880 }
881
882 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
883 ; AVX1-LABEL: shuffle_v4i64_4501:
884 ; AVX1:       # BB#0:
885 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
886 ; AVX1-NEXT:    retq
887 ;
888 ; AVX2-LABEL: shuffle_v4i64_4501:
889 ; AVX2:       # BB#0:
890 ; AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
891 ; AVX2-NEXT:    retq
892 ;
893 ; AVX512VL-LABEL: shuffle_v4i64_4501:
894 ; AVX512VL:       # BB#0:
895 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm0, %ymm1, %ymm0
896 ; AVX512VL-NEXT:    retq
897   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
898   ret <4 x i64> %shuffle
899 }
900
901 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
902 ; AVX1-LABEL: shuffle_v4i64_4015:
903 ; AVX1:       # BB#0:
904 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
905 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
906 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
907 ; AVX1-NEXT:    retq
908 ;
909 ; AVX2-LABEL: shuffle_v4i64_4015:
910 ; AVX2:       # BB#0:
911 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm1, %ymm1
912 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,3]
913 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5],ymm1[6,7]
914 ; AVX2-NEXT:    retq
915 ;
916 ; AVX512VL-LABEL: shuffle_v4i64_4015:
917 ; AVX512VL:       # BB#0:
918 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm1, %ymm1
919 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,3]
920 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5],ymm1[6,7]
921 ; AVX512VL-NEXT:    retq
922   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
923   ret <4 x i64> %shuffle
924 }
925
926 define <4 x i64> @shuffle_v4i64_2u35(<4 x i64> %a, <4 x i64> %b) {
927 ; AVX1-LABEL: shuffle_v4i64_2u35:
928 ; AVX1:       # BB#0:
929 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
930 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm1 = xmm0[1],xmm1[1]
931 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
932 ; AVX1-NEXT:    retq
933 ;
934 ; AVX2-LABEL: shuffle_v4i64_2u35:
935 ; AVX2:       # BB#0:
936 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
937 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,1,3,1]
938 ; AVX2-NEXT:    retq
939 ;
940 ; AVX512VL-LABEL: shuffle_v4i64_2u35:
941 ; AVX512VL:       # BB#0:
942 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
943 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,1,3,1]
944 ; AVX512VL-NEXT:    retq
945   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 undef, i32 3, i32 5>
946   ret <4 x i64> %shuffle
947 }
948
949 define <4 x i64> @shuffle_v4i64_1251(<4 x i64> %a, <4 x i64> %b) {
950 ; AVX1-LABEL: shuffle_v4i64_1251:
951 ; AVX1:       # BB#0:
952 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
953 ; AVX1-NEXT:    vshufpd {{.*#+}} ymm0 = ymm0[1],ymm2[0],ymm0[2],ymm2[3]
954 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
955 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
956 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
957 ; AVX1-NEXT:    retq
958 ;
959 ; AVX2-LABEL: shuffle_v4i64_1251:
960 ; AVX2:       # BB#0:
961 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3]
962 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,2,2,1]
963 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
964 ; AVX2-NEXT:    retq
965 ;
966 ; AVX512VL-LABEL: shuffle_v4i64_1251:
967 ; AVX512VL:       # BB#0:
968 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3]
969 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,2,2,1]
970 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
971 ; AVX512VL-NEXT:    retq
972   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 2, i32 5, i32 1>
973   ret <4 x i64> %shuffle
974 }
975
976 define <4 x i64> @shuffle_v4i64_1054(<4 x i64> %a, <4 x i64> %b) {
977 ; AVX1-LABEL: shuffle_v4i64_1054:
978 ; AVX1:       # BB#0:
979 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
980 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
981 ; AVX1-NEXT:    retq
982 ;
983 ; AVX2-LABEL: shuffle_v4i64_1054:
984 ; AVX2:       # BB#0:
985 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
986 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
987 ; AVX2-NEXT:    retq
988 ;
989 ; AVX512VL-LABEL: shuffle_v4i64_1054:
990 ; AVX512VL:       # BB#0:
991 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
992 ; AVX512VL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
993 ; AVX512VL-NEXT:    retq
994   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 5, i32 4>
995   ret <4 x i64> %shuffle
996 }
997
998 define <4 x i64> @shuffle_v4i64_3254(<4 x i64> %a, <4 x i64> %b) {
999 ; AVX1-LABEL: shuffle_v4i64_3254:
1000 ; AVX1:       # BB#0:
1001 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
1002 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
1003 ; AVX1-NEXT:    retq
1004 ;
1005 ; AVX2-LABEL: shuffle_v4i64_3254:
1006 ; AVX2:       # BB#0:
1007 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
1008 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1009 ; AVX2-NEXT:    retq
1010 ;
1011 ; AVX512VL-LABEL: shuffle_v4i64_3254:
1012 ; AVX512VL:       # BB#0:
1013 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
1014 ; AVX512VL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1015 ; AVX512VL-NEXT:    retq
1016   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 5, i32 4>
1017   ret <4 x i64> %shuffle
1018 }
1019
1020 define <4 x i64> @shuffle_v4i64_3276(<4 x i64> %a, <4 x i64> %b) {
1021 ; AVX1-LABEL: shuffle_v4i64_3276:
1022 ; AVX1:       # BB#0:
1023 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
1024 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
1025 ; AVX1-NEXT:    retq
1026 ;
1027 ; AVX2-LABEL: shuffle_v4i64_3276:
1028 ; AVX2:       # BB#0:
1029 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
1030 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1031 ; AVX2-NEXT:    retq
1032 ;
1033 ; AVX512VL-LABEL: shuffle_v4i64_3276:
1034 ; AVX512VL:       # BB#0:
1035 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
1036 ; AVX512VL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1037 ; AVX512VL-NEXT:    retq
1038   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 7, i32 6>
1039   ret <4 x i64> %shuffle
1040 }
1041
1042 define <4 x i64> @shuffle_v4i64_1076(<4 x i64> %a, <4 x i64> %b) {
1043 ; AVX1-LABEL: shuffle_v4i64_1076:
1044 ; AVX1:       # BB#0:
1045 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
1046 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
1047 ; AVX1-NEXT:    retq
1048 ;
1049 ; AVX2-LABEL: shuffle_v4i64_1076:
1050 ; AVX2:       # BB#0:
1051 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1052 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1053 ; AVX2-NEXT:    retq
1054 ;
1055 ; AVX512VL-LABEL: shuffle_v4i64_1076:
1056 ; AVX512VL:       # BB#0:
1057 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1058 ; AVX512VL-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
1059 ; AVX512VL-NEXT:    retq
1060   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6>
1061   ret <4 x i64> %shuffle
1062 }
1063
1064 define <4 x i64> @shuffle_v4i64_0415(<4 x i64> %a, <4 x i64> %b) {
1065 ; AVX1-LABEL: shuffle_v4i64_0415:
1066 ; AVX1:       # BB#0:
1067 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
1068 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1069 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1070 ; AVX1-NEXT:    retq
1071 ;
1072 ; AVX2-LABEL: shuffle_v4i64_0415:
1073 ; AVX2:       # BB#0:
1074 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,2,1]
1075 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
1076 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
1077 ; AVX2-NEXT:    retq
1078 ;
1079 ; AVX512VL-LABEL: shuffle_v4i64_0415:
1080 ; AVX512VL:       # BB#0:
1081 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,2,1]
1082 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
1083 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
1084 ; AVX512VL-NEXT:    retq
1085   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
1086   ret <4 x i64> %shuffle
1087 }
1088
1089 define <4 x i64> @shuffle_v4i64_z4z6(<4 x i64> %a) {
1090 ; AVX1-LABEL: shuffle_v4i64_z4z6:
1091 ; AVX1:       # BB#0:
1092 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1093 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
1094 ; AVX1-NEXT:    retq
1095 ;
1096 ; AVX2-LABEL: shuffle_v4i64_z4z6:
1097 ; AVX2:       # BB#0:
1098 ; AVX2-NEXT:    vpslldq {{.*#+}} ymm0 = zero,zero,zero,zero,zero,zero,zero,zero,ymm0[0,1,2,3,4,5,6,7],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,18,19,20,21,22,23]
1099 ; AVX2-NEXT:    retq
1100 ;
1101 ; AVX512VL-LABEL: shuffle_v4i64_z4z6:
1102 ; AVX512VL:       # BB#0:
1103 ; AVX512VL-NEXT:    vpslldq {{.*#+}} ymm0 = zero,zero,zero,zero,zero,zero,zero,zero,ymm0[0,1,2,3,4,5,6,7],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[16,17,18,19,20,21,22,23]
1104 ; AVX512VL-NEXT:    retq
1105   %shuffle = shufflevector <4 x i64> zeroinitializer, <4 x i64> %a, <4 x i32> <i32 0, i32 4, i32 0, i32 6>
1106   ret <4 x i64> %shuffle
1107 }
1108
1109 define <4 x i64> @shuffle_v4i64_5zuz(<4 x i64> %a) {
1110 ; AVX1-LABEL: shuffle_v4i64_5zuz:
1111 ; AVX1:       # BB#0:
1112 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1113 ; AVX1-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
1114 ; AVX1-NEXT:    retq
1115 ;
1116 ; AVX2-LABEL: shuffle_v4i64_5zuz:
1117 ; AVX2:       # BB#0:
1118 ; AVX2-NEXT:    vpsrldq {{.*#+}} ymm0 = ymm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[24,25,26,27,28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero
1119 ; AVX2-NEXT:    retq
1120 ;
1121 ; AVX512VL-LABEL: shuffle_v4i64_5zuz:
1122 ; AVX512VL:       # BB#0:
1123 ; AVX512VL-NEXT:    vpsrldq {{.*#+}} ymm0 = ymm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,ymm0[24,25,26,27,28,29,30,31],zero,zero,zero,zero,zero,zero,zero,zero
1124 ; AVX512VL-NEXT:    retq
1125   %shuffle = shufflevector <4 x i64> zeroinitializer, <4 x i64> %a, <4 x i32> <i32 5, i32 0, i32 undef, i32 0>
1126   ret <4 x i64> %shuffle
1127 }
1128
1129 define <4 x i64> @shuffle_v4i64_40u2(<4 x i64> %a, <4 x i64> %b) {
1130 ; AVX1-LABEL: shuffle_v4i64_40u2:
1131 ; AVX1:       # BB#0:
1132 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
1133 ; AVX1-NEXT:    retq
1134 ;
1135 ; AVX2-LABEL: shuffle_v4i64_40u2:
1136 ; AVX2:       # BB#0:
1137 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
1138 ; AVX2-NEXT:    retq
1139 ;
1140 ; AVX512VL-LABEL: shuffle_v4i64_40u2:
1141 ; AVX512VL:       # BB#0:
1142 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
1143 ; AVX512VL-NEXT:    retq
1144   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 undef, i32 2>
1145   ret <4 x i64> %shuffle
1146 }
1147
1148 define <4 x i64> @stress_test1(<4 x i64> %a, <4 x i64> %b) {
1149 ; ALL-LABEL: stress_test1:
1150 ; ALL:         retq
1151   %c = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 1, i32 1, i32 0>
1152   %d = shufflevector <4 x i64> %c, <4 x i64> undef, <4 x i32> <i32 3, i32 undef, i32 2, i32 undef>
1153   %e = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 3, i32 1, i32 undef>
1154   %f = shufflevector <4 x i64> %d, <4 x i64> %e, <4 x i32> <i32 5, i32 1, i32 1, i32 0>
1155
1156   ret <4 x i64> %f
1157 }
1158
1159 define <4 x i64> @insert_reg_and_zero_v4i64(i64 %a) {
1160 ; ALL-LABEL: insert_reg_and_zero_v4i64:
1161 ; ALL:       # BB#0:
1162 ; ALL-NEXT:    vmovq %rdi, %xmm0
1163 ; ALL-NEXT:    retq
1164   %v = insertelement <4 x i64> undef, i64 %a, i64 0
1165   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1166   ret <4 x i64> %shuffle
1167 }
1168
1169 define <4 x i64> @insert_mem_and_zero_v4i64(i64* %ptr) {
1170 ; AVX1-LABEL: insert_mem_and_zero_v4i64:
1171 ; AVX1:       # BB#0:
1172 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1173 ; AVX1-NEXT:    retq
1174 ;
1175 ; AVX2-LABEL: insert_mem_and_zero_v4i64:
1176 ; AVX2:       # BB#0:
1177 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1178 ; AVX2-NEXT:    retq
1179 ;
1180 ; AVX512VL-LABEL: insert_mem_and_zero_v4i64:
1181 ; AVX512VL:       # BB#0:
1182 ; AVX512VL-NEXT:    vmovq (%rdi), %xmm0
1183 ; AVX512VL-NEXT:    retq
1184   %a = load i64, i64* %ptr
1185   %v = insertelement <4 x i64> undef, i64 %a, i64 0
1186   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1187   ret <4 x i64> %shuffle
1188 }
1189
1190 define <4 x double> @insert_reg_and_zero_v4f64(double %a) {
1191 ; AVX1-LABEL: insert_reg_and_zero_v4f64:
1192 ; AVX1:       # BB#0:
1193 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1194 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
1195 ; AVX1-NEXT:    retq
1196 ;
1197 ; AVX2-LABEL: insert_reg_and_zero_v4f64:
1198 ; AVX2:       # BB#0:
1199 ; AVX2-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
1200 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
1201 ; AVX2-NEXT:    retq
1202 ;
1203 ; AVX512VL-LABEL: insert_reg_and_zero_v4f64:
1204 ; AVX512VL:       # BB#0:
1205 ; AVX512VL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1206 ; AVX512VL-NEXT:    vmovsd %xmm0, %xmm1, %xmm0
1207 ; AVX512VL-NEXT:    retq
1208   %v = insertelement <4 x double> undef, double %a, i32 0
1209   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1210   ret <4 x double> %shuffle
1211 }
1212
1213 define <4 x double> @insert_mem_and_zero_v4f64(double* %ptr) {
1214 ; AVX1-LABEL: insert_mem_and_zero_v4f64:
1215 ; AVX1:       # BB#0:
1216 ; AVX1-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1217 ; AVX1-NEXT:    retq
1218 ;
1219 ; AVX2-LABEL: insert_mem_and_zero_v4f64:
1220 ; AVX2:       # BB#0:
1221 ; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1222 ; AVX2-NEXT:    retq
1223 ;
1224 ; AVX512VL-LABEL: insert_mem_and_zero_v4f64:
1225 ; AVX512VL:       # BB#0:
1226 ; AVX512VL-NEXT:    vmovsd (%rdi), %xmm0
1227 ; AVX512VL-NEXT:    retq
1228   %a = load double, double* %ptr
1229   %v = insertelement <4 x double> undef, double %a, i32 0
1230   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1231   ret <4 x double> %shuffle
1232 }
1233
1234 define <4 x double> @splat_mem_v4f64(double* %ptr) {
1235 ; ALL-LABEL: splat_mem_v4f64:
1236 ; ALL:       # BB#0:
1237 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
1238 ; ALL-NEXT:    retq
1239   %a = load double, double* %ptr
1240   %v = insertelement <4 x double> undef, double %a, i32 0
1241   %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1242   ret <4 x double> %shuffle
1243 }
1244
1245 define <4 x i64> @splat_mem_v4i64(i64* %ptr) {
1246 ; AVX1-LABEL: splat_mem_v4i64:
1247 ; AVX1:       # BB#0:
1248 ; AVX1-NEXT:    vbroadcastsd (%rdi), %ymm0
1249 ; AVX1-NEXT:    retq
1250 ;
1251 ; AVX2-LABEL: splat_mem_v4i64:
1252 ; AVX2:       # BB#0:
1253 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
1254 ; AVX2-NEXT:    retq
1255 ;
1256 ; AVX512VL-LABEL: splat_mem_v4i64:
1257 ; AVX512VL:       # BB#0:
1258 ; AVX512VL-NEXT:    vpbroadcastq (%rdi), %ymm0
1259 ; AVX512VL-NEXT:    retq
1260   %a = load i64, i64* %ptr
1261   %v = insertelement <4 x i64> undef, i64 %a, i64 0
1262   %shuffle = shufflevector <4 x i64> %v, <4 x i64> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1263   ret <4 x i64> %shuffle
1264 }
1265
1266 define <4 x double> @splat_mem_v4f64_2(double* %p) {
1267 ; ALL-LABEL: splat_mem_v4f64_2:
1268 ; ALL:       # BB#0:
1269 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
1270 ; ALL-NEXT:    retq
1271   %1 = load double, double* %p
1272   %2 = insertelement <2 x double> undef, double %1, i32 0
1273   %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> zeroinitializer
1274   ret <4 x double> %3
1275 }
1276
1277 define <4 x double> @splat_v4f64(<2 x double> %r) {
1278 ; AVX1-LABEL: splat_v4f64:
1279 ; AVX1:       # BB#0:
1280 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
1281 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1282 ; AVX1-NEXT:    retq
1283 ;
1284 ; AVX2-LABEL: splat_v4f64:
1285 ; AVX2:       # BB#0:
1286 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
1287 ; AVX2-NEXT:    retq
1288 ;
1289 ; AVX512VL-LABEL: splat_v4f64:
1290 ; AVX512VL:       # BB#0:
1291 ; AVX512VL-NEXT:    vbroadcastsd %xmm0, %ymm0
1292 ; AVX512VL-NEXT:    retq
1293   %1 = shufflevector <2 x double> %r, <2 x double> undef, <4 x i32> zeroinitializer
1294   ret <4 x double> %1
1295 }
1296
1297 define <4 x i64> @splat_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
1298 ; AVX1-LABEL: splat_mem_v4i64_from_v2i64:
1299 ; AVX1:       # BB#0:
1300 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
1301 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1302 ; AVX1-NEXT:    retq
1303 ;
1304 ; AVX2-LABEL: splat_mem_v4i64_from_v2i64:
1305 ; AVX2:       # BB#0:
1306 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
1307 ; AVX2-NEXT:    retq
1308 ;
1309 ; AVX512VL-LABEL: splat_mem_v4i64_from_v2i64:
1310 ; AVX512VL:       # BB#0:
1311 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %xmm0
1312 ; AVX512VL-NEXT:    vpbroadcastq %xmm0, %ymm0
1313 ; AVX512VL-NEXT:    retq
1314   %v = load <2 x i64>, <2 x i64>* %ptr
1315   %shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1316   ret <4 x i64> %shuffle
1317 }
1318
1319 define <4 x double> @splat_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
1320 ; AVX1-LABEL: splat_mem_v4f64_from_v2f64:
1321 ; AVX1:       # BB#0:
1322 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
1323 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1324 ; AVX1-NEXT:    retq
1325 ;
1326 ; AVX2-LABEL: splat_mem_v4f64_from_v2f64:
1327 ; AVX2:       # BB#0:
1328 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
1329 ; AVX2-NEXT:    retq
1330 ;
1331 ; AVX512VL-LABEL: splat_mem_v4f64_from_v2f64:
1332 ; AVX512VL:       # BB#0:
1333 ; AVX512VL-NEXT:    vbroadcastsd (%rdi), %ymm0
1334 ; AVX512VL-NEXT:    retq
1335   %v = load <2 x double>, <2 x double>* %ptr
1336   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1337   ret <4 x double> %shuffle
1338 }
1339
1340 define <4 x i64> @splat128_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
1341 ; AVX1-LABEL: splat128_mem_v4i64_from_v2i64:
1342 ; AVX1:       # BB#0:
1343 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
1344 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1345 ; AVX1-NEXT:    retq
1346 ;
1347 ; AVX2-LABEL: splat128_mem_v4i64_from_v2i64:
1348 ; AVX2:       # BB#0:
1349 ; AVX2-NEXT:    vmovaps (%rdi), %xmm0
1350 ; AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1351 ; AVX2-NEXT:    retq
1352 ;
1353 ; AVX512VL-LABEL: splat128_mem_v4i64_from_v2i64:
1354 ; AVX512VL:       # BB#0:
1355 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %xmm0
1356 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm0, %ymm0, %ymm0
1357 ; AVX512VL-NEXT:    retq
1358   %v = load <2 x i64>, <2 x i64>* %ptr
1359   %shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
1360   ret <4 x i64> %shuffle
1361 }
1362
1363 define <4 x double> @splat128_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
1364 ; AVX1-LABEL: splat128_mem_v4f64_from_v2f64:
1365 ; AVX1:       # BB#0:
1366 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
1367 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1368 ; AVX1-NEXT:    retq
1369 ;
1370 ; AVX2-LABEL: splat128_mem_v4f64_from_v2f64:
1371 ; AVX2:       # BB#0:
1372 ; AVX2-NEXT:    vmovaps (%rdi), %xmm0
1373 ; AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1374 ; AVX2-NEXT:    retq
1375 ;
1376 ; AVX512VL-LABEL: splat128_mem_v4f64_from_v2f64:
1377 ; AVX512VL:       # BB#0:
1378 ; AVX512VL-NEXT:    vmovapd (%rdi), %xmm0
1379 ; AVX512VL-NEXT:    vinsertf32x4 $1, %xmm0, %ymm0, %ymm0
1380 ; AVX512VL-NEXT:    retq
1381   %v = load <2 x double>, <2 x double>* %ptr
1382   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
1383   ret <4 x double> %shuffle
1384 }
1385
1386 define <4 x double> @bitcast_v4f64_0426(<4 x double> %a, <4 x double> %b) {
1387 ; AVX1-LABEL: bitcast_v4f64_0426:
1388 ; AVX1:       # BB#0:
1389 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1390 ; AVX1-NEXT:    retq
1391 ;
1392 ; AVX2-LABEL: bitcast_v4f64_0426:
1393 ; AVX2:       # BB#0:
1394 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1395 ; AVX2-NEXT:    retq
1396 ;
1397 ; AVX512VL-LABEL: bitcast_v4f64_0426:
1398 ; AVX512VL:       # BB#0:
1399 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1400 ; AVX512VL-NEXT:    retq
1401   %shuffle64 = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
1402   %bitcast32 = bitcast <4 x double> %shuffle64 to <8 x float>
1403   %shuffle32 = shufflevector <8 x float> %bitcast32, <8 x float> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
1404   %bitcast16 = bitcast <8 x float> %shuffle32 to <16 x i16>
1405   %shuffle16 = shufflevector <16 x i16> %bitcast16, <16 x i16> undef, <16 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5, i32 10, i32 11, i32 8, i32 9, i32 14, i32 15, i32 12, i32 13>
1406   %bitcast64 = bitcast <16 x i16> %shuffle16 to <4 x double>
1407   ret <4 x double> %bitcast64
1408 }
1409
1410 define <4 x i64> @concat_v4i64_0167(<4 x i64> %a0, <4 x i64> %a1) {
1411 ; AVX1-LABEL: concat_v4i64_0167:
1412 ; AVX1:       # BB#0:
1413 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
1414 ; AVX1-NEXT:    retq
1415 ;
1416 ; AVX2-LABEL: concat_v4i64_0167:
1417 ; AVX2:       # BB#0:
1418 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1419 ; AVX2-NEXT:    retq
1420 ;
1421 ; AVX512VL-LABEL: concat_v4i64_0167:
1422 ; AVX512VL:       # BB#0:
1423 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1424 ; AVX512VL-NEXT:    retq
1425   %a0lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 0, i32 1>
1426   %a1hi = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 6, i32 7>
1427   %shuffle64 = shufflevector <2 x i64> %a0lo, <2 x i64> %a1hi, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1428   ret <4 x i64> %shuffle64
1429 }
1430
1431 define <4 x i64> @concat_v4i64_0145_bc(<4 x i64> %a0, <4 x i64> %a1) {
1432 ; AVX1-LABEL: concat_v4i64_0145_bc:
1433 ; AVX1:       # BB#0:
1434 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1435 ; AVX1-NEXT:    retq
1436 ;
1437 ; AVX2-LABEL: concat_v4i64_0145_bc:
1438 ; AVX2:       # BB#0:
1439 ; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1440 ; AVX2-NEXT:    retq
1441 ;
1442 ; AVX512VL-LABEL: concat_v4i64_0145_bc:
1443 ; AVX512VL:       # BB#0:
1444 ; AVX512VL-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1445 ; AVX512VL-NEXT:    retq
1446   %a0lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 0, i32 1>
1447   %a1lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 4, i32 5>
1448   %bc0lo = bitcast <2 x i64> %a0lo to <4 x i32>
1449   %bc1lo = bitcast <2 x i64> %a1lo to <4 x i32>
1450   %shuffle32 = shufflevector <4 x i32> %bc0lo, <4 x i32> %bc1lo, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1451   %shuffle64 = bitcast <8 x i32> %shuffle32 to <4 x i64>
1452   ret <4 x i64> %shuffle64
1453 }
1454
1455 define <4 x i64> @insert_dup_mem_v4i64(i64* %ptr) {
1456 ; AVX1-LABEL: insert_dup_mem_v4i64:
1457 ; AVX1:       # BB#0:
1458 ; AVX1-NEXT:    vbroadcastsd (%rdi), %ymm0
1459 ; AVX1-NEXT:    retq
1460 ;
1461 ; AVX2-LABEL: insert_dup_mem_v4i64:
1462 ; AVX2:       # BB#0:
1463 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
1464 ; AVX2-NEXT:    retq
1465 ;
1466 ; AVX512VL-LABEL: insert_dup_mem_v4i64:
1467 ; AVX512VL:       # BB#0:
1468 ; AVX512VL-NEXT:    vpbroadcastq (%rdi), %ymm0
1469 ; AVX512VL-NEXT:    retq
1470   %tmp = load i64, i64* %ptr, align 1
1471   %tmp1 = insertelement <2 x i64> undef, i64 %tmp, i32 0
1472   %tmp2 = shufflevector <2 x i64> %tmp1, <2 x i64> undef, <4 x i32> zeroinitializer
1473   ret <4 x i64> %tmp2
1474 }