OSDN Git Service

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