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