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