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