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