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