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