[WinEH] Only generate UnwindHelp slot for MSVCXX
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v4.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3 ; RUN: llc < %s -mcpu=knl -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512VL
4
5 target triple = "x86_64-unknown-unknown"
6
7 define <4 x double> @shuffle_v4f64_0000(<4 x double> %a, <4 x double> %b) {
8 ; AVX1-LABEL: shuffle_v4f64_0000:
9 ; AVX1:       # BB#0:
10 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
11 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
12 ; AVX1-NEXT:    retq
13 ;
14 ; AVX2-LABEL: shuffle_v4f64_0000:
15 ; AVX2:       # BB#0:
16 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
17 ; AVX2-NEXT:    retq
18   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
19   ret <4 x double> %shuffle
20 }
21
22 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
23 ; AVX1-LABEL: shuffle_v4f64_0001:
24 ; AVX1:       # BB#0:
25 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
26 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
27 ; AVX1-NEXT:    retq
28 ;
29 ; AVX2-LABEL: shuffle_v4f64_0001:
30 ; AVX2:       # BB#0:
31 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,0,1]
32 ; AVX2-NEXT:    retq
33   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
34   ret <4 x double> %shuffle
35 }
36
37 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
38 ; AVX1-LABEL: shuffle_v4f64_0020:
39 ; AVX1:       # BB#0:
40 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
41 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
42 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
43 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
44 ; AVX1-NEXT:    retq
45 ;
46 ; AVX2-LABEL: shuffle_v4f64_0020:
47 ; AVX2:       # BB#0:
48 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,0]
49 ; AVX2-NEXT:    retq
50   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
51   ret <4 x double> %shuffle
52 }
53
54 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
55 ; AVX1-LABEL: shuffle_v4f64_0300:
56 ; AVX1:       # BB#0:
57 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
58 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[0,1,2,2]
59 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
60 ; AVX1-NEXT:    retq
61 ;
62 ; AVX2-LABEL: shuffle_v4f64_0300:
63 ; AVX2:       # BB#0:
64 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,0,0]
65 ; AVX2-NEXT:    retq
66   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
67   ret <4 x double> %shuffle
68 }
69
70 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
71 ; AVX1-LABEL: shuffle_v4f64_1000:
72 ; AVX1:       # BB#0:
73 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
74 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
75 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
76 ; AVX1-NEXT:    retq
77 ;
78 ; AVX2-LABEL: shuffle_v4f64_1000:
79 ; AVX2:       # BB#0:
80 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[1,0,0,0]
81 ; AVX2-NEXT:    retq
82   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
83   ret <4 x double> %shuffle
84 }
85
86 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
87 ; AVX1-LABEL: shuffle_v4f64_2200:
88 ; AVX1:       # BB#0:
89 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
90 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
91 ; AVX1-NEXT:    retq
92 ;
93 ; AVX2-LABEL: shuffle_v4f64_2200:
94 ; AVX2:       # BB#0:
95 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[2,2,0,0]
96 ; AVX2-NEXT:    retq
97   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
98   ret <4 x double> %shuffle
99 }
100
101 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
102 ; AVX1-LABEL: shuffle_v4f64_3330:
103 ; AVX1:       # BB#0:
104 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
105 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
106 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,2]
107 ; AVX1-NEXT:    retq
108 ;
109 ; AVX2-LABEL: shuffle_v4f64_3330:
110 ; AVX2:       # BB#0:
111 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,3,3,0]
112 ; AVX2-NEXT:    retq
113   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
114   ret <4 x double> %shuffle
115 }
116
117 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
118 ; AVX1-LABEL: shuffle_v4f64_3210:
119 ; AVX1:       # BB#0:
120 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
121 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
122 ; AVX1-NEXT:    retq
123 ;
124 ; AVX2-LABEL: shuffle_v4f64_3210:
125 ; AVX2:       # BB#0:
126 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[3,2,1,0]
127 ; AVX2-NEXT:    retq
128   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
129   ret <4 x double> %shuffle
130 }
131
132 define <4 x double> @shuffle_v4f64_0023(<4 x double> %a, <4 x double> %b) {
133 ; ALL-LABEL: shuffle_v4f64_0023:
134 ; ALL:       # BB#0:
135 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,0,2,3]
136 ; ALL-NEXT:    retq
137
138 ; AVX512VL-LABEL: shuffle_v4f64_0023:
139 ; AVX512VL:       # BB#0:
140 ; AVX512VL-NEXT:    vpermilpd $8, %ymm0, %ymm0
141 ; AVX512VL-NEXT:    retq
142   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
143   ret <4 x double> %shuffle
144 }
145
146 define <4 x double> @shuffle_v4f64_0022(<4 x double> %a, <4 x double> %b) {
147 ; ALL-LABEL: shuffle_v4f64_0022:
148 ; ALL:       # BB#0:
149 ; ALL-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
150 ; ALL-NEXT:    retq
151   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
152   ret <4 x double> %shuffle
153 }
154
155 define <4 x double> @shuffle_v4f64_1032(<4 x double> %a, <4 x double> %b) {
156 ; ALL-LABEL: shuffle_v4f64_1032:
157 ; ALL:       # BB#0:
158 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
159 ; ALL-NEXT:    retq
160   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
161   ret <4 x double> %shuffle
162 }
163
164 define <4 x double> @shuffle_v4f64_1133(<4 x double> %a, <4 x double> %b) {
165 ; ALL-LABEL: shuffle_v4f64_1133:
166 ; ALL:       # BB#0:
167 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,3]
168 ; ALL-NEXT:    retq
169   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
170   ret <4 x double> %shuffle
171 }
172
173 define <4 x double> @shuffle_v4f64_1023(<4 x double> %a, <4 x double> %b) {
174 ; ALL-LABEL: shuffle_v4f64_1023:
175 ; ALL:       # BB#0:
176 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,3]
177 ; ALL-NEXT:    retq
178   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
179   ret <4 x double> %shuffle
180 }
181
182 define <4 x double> @shuffle_v4f64_1022(<4 x double> %a, <4 x double> %b) {
183 ; ALL-LABEL: shuffle_v4f64_1022:
184 ; ALL:       # BB#0:
185 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,2,2]
186 ; ALL-NEXT:    retq
187   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 2>
188   ret <4 x double> %shuffle
189 }
190
191 define <4 x double> @shuffle_v4f64_0423(<4 x double> %a, <4 x double> %b) {
192 ; AVX1-LABEL: shuffle_v4f64_0423:
193 ; AVX1:       # BB#0:
194 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
195 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
196 ; AVX1-NEXT:    retq
197 ;
198 ; AVX2-LABEL: shuffle_v4f64_0423:
199 ; AVX2:       # BB#0:
200 ; AVX2-NEXT:    vbroadcastsd %xmm1, %ymm1
201 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
202 ; AVX2-NEXT:    retq
203   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
204   ret <4 x double> %shuffle
205 }
206
207 define <4 x double> @shuffle_v4f64_0462(<4 x double> %a, <4 x double> %b) {
208 ; ALL-LABEL: shuffle_v4f64_0462:
209 ; ALL:       # BB#0:
210 ; ALL-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
211 ; ALL-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
212 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2],ymm0[3]
213 ; ALL-NEXT:    retq
214   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 6, i32 2>
215   ret <4 x double> %shuffle
216 }
217
218 define <4 x double> @shuffle_v4f64_0426(<4 x double> %a, <4 x double> %b) {
219 ; ALL-LABEL: shuffle_v4f64_0426:
220 ; ALL:       # BB#0:
221 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
222 ; ALL-NEXT:    retq
223   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
224   ret <4 x double> %shuffle
225 }
226
227 define <4 x double> @shuffle_v4f64_1537(<4 x double> %a, <4 x double> %b) {
228 ; ALL-LABEL: shuffle_v4f64_1537:
229 ; ALL:       # BB#0:
230 ; ALL-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
231 ; ALL-NEXT:    retq
232   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
233   ret <4 x double> %shuffle
234 }
235
236 define <4 x double> @shuffle_v4f64_4062(<4 x double> %a, <4 x double> %b) {
237 ; ALL-LABEL: shuffle_v4f64_4062:
238 ; ALL:       # BB#0:
239 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
240 ; ALL-NEXT:    retq
241   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
242   ret <4 x double> %shuffle
243 }
244
245 define <4 x double> @shuffle_v4f64_5173(<4 x double> %a, <4 x double> %b) {
246 ; ALL-LABEL: shuffle_v4f64_5173:
247 ; ALL:       # BB#0:
248 ; ALL-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
249 ; ALL-NEXT:    retq
250   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 7, i32 3>
251   ret <4 x double> %shuffle
252 }
253
254 define <4 x double> @shuffle_v4f64_5163(<4 x double> %a, <4 x double> %b) {
255 ; ALL-LABEL: shuffle_v4f64_5163:
256 ; ALL:       # BB#0:
257 ; ALL-NEXT:    vshufpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[2],ymm0[3]
258 ; ALL-NEXT:    retq
259   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 6, i32 3>
260   ret <4 x double> %shuffle
261 }
262
263 define <4 x double> @shuffle_v4f64_0527(<4 x double> %a, <4 x double> %b) {
264 ; ALL-LABEL: shuffle_v4f64_0527:
265 ; ALL:       # BB#0:
266 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
267 ; ALL-NEXT:    retq
268   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
269   ret <4 x double> %shuffle
270 }
271
272 define <4 x double> @shuffle_v4f64_4163(<4 x double> %a, <4 x double> %b) {
273 ; ALL-LABEL: shuffle_v4f64_4163:
274 ; ALL:       # BB#0:
275 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]
276 ; ALL-NEXT:    retq
277   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
278   ret <4 x double> %shuffle
279 }
280
281 define <4 x double> @shuffle_v4f64_0145(<4 x double> %a, <4 x double> %b) {
282 ; ALL-LABEL: shuffle_v4f64_0145:
283 ; ALL:       # BB#0:
284 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
285 ; ALL-NEXT:    retq
286   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
287   ret <4 x double> %shuffle
288 }
289
290 define <4 x double> @shuffle_v4f64_4501(<4 x double> %a, <4 x double> %b) {
291 ; ALL-LABEL: shuffle_v4f64_4501:
292 ; ALL:       # BB#0:
293 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
294 ; ALL-NEXT:    retq
295   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
296   ret <4 x double> %shuffle
297 }
298
299 define <4 x double> @shuffle_v4f64_0167(<4 x double> %a, <4 x double> %b) {
300 ; ALL-LABEL: shuffle_v4f64_0167:
301 ; ALL:       # BB#0:
302 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
303 ; ALL-NEXT:    retq
304   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
305   ret <4 x double> %shuffle
306 }
307
308 define <4 x double> @shuffle_v4f64_1054(<4 x double> %a, <4 x double> %b) {
309 ; ALL-LABEL: shuffle_v4f64_1054:
310 ; ALL:       # BB#0:
311 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
312 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
313 ; ALL-NEXT:    retq
314   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 5, i32 4>
315   ret <4 x double> %shuffle
316 }
317
318 define <4 x double> @shuffle_v4f64_3254(<4 x double> %a, <4 x double> %b) {
319 ; ALL-LABEL: shuffle_v4f64_3254:
320 ; ALL:       # BB#0:
321 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
322 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
323 ; ALL-NEXT:    retq
324   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 5, i32 4>
325   ret <4 x double> %shuffle
326 }
327
328 define <4 x double> @shuffle_v4f64_3276(<4 x double> %a, <4 x double> %b) {
329 ; ALL-LABEL: shuffle_v4f64_3276:
330 ; ALL:       # BB#0:
331 ; ALL-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
332 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
333 ; ALL-NEXT:    retq
334   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 7, i32 6>
335   ret <4 x double> %shuffle
336 }
337
338 define <4 x double> @shuffle_v4f64_1076(<4 x double> %a, <4 x double> %b) {
339 ; ALL-LABEL: shuffle_v4f64_1076:
340 ; ALL:       # BB#0:
341 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
342 ; ALL-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
343 ; ALL-NEXT:    retq
344   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6>
345   ret <4 x double> %shuffle
346 }
347
348 define <4 x double> @shuffle_v4f64_0415(<4 x double> %a, <4 x double> %b) {
349 ; AVX1-LABEL: shuffle_v4f64_0415:
350 ; AVX1:       # BB#0:
351 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
352 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
353 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
354 ; AVX1-NEXT:    retq
355 ;
356 ; AVX2-LABEL: shuffle_v4f64_0415:
357 ; AVX2:       # BB#0:
358 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,0,2,1]
359 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,1,3]
360 ; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
361 ; AVX2-NEXT:    retq
362   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
363   ret <4 x double> %shuffle
364 }
365
366 define <4 x double> @shuffle_v4f64_u062(<4 x double> %a, <4 x double> %b) {
367 ; ALL-LABEL: shuffle_v4f64_u062:
368 ; ALL:       # BB#0:
369 ; ALL-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
370 ; ALL-NEXT:    retq
371   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 undef, i32 0, i32 6, i32 2>
372   ret <4 x double> %shuffle
373 }
374
375 define <4 x i64> @shuffle_v4i64_0000(<4 x i64> %a, <4 x i64> %b) {
376 ; AVX1-LABEL: shuffle_v4i64_0000:
377 ; AVX1:       # BB#0:
378 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
379 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
380 ; AVX1-NEXT:    retq
381 ;
382 ; AVX2-LABEL: shuffle_v4i64_0000:
383 ; AVX2:       # BB#0:
384 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
385 ; AVX2-NEXT:    retq
386   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
387   ret <4 x i64> %shuffle
388 }
389
390 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
391 ; AVX1-LABEL: shuffle_v4i64_0001:
392 ; AVX1:       # BB#0:
393 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
394 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
395 ; AVX1-NEXT:    retq
396 ;
397 ; AVX2-LABEL: shuffle_v4i64_0001:
398 ; AVX2:       # BB#0:
399 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,0,1]
400 ; AVX2-NEXT:    retq
401   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
402   ret <4 x i64> %shuffle
403 }
404
405 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
406 ; AVX1-LABEL: shuffle_v4i64_0020:
407 ; AVX1:       # BB#0:
408 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
409 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
410 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
411 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
412 ; AVX1-NEXT:    retq
413 ;
414 ; AVX2-LABEL: shuffle_v4i64_0020:
415 ; AVX2:       # BB#0:
416 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,0]
417 ; AVX2-NEXT:    retq
418   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
419   ret <4 x i64> %shuffle
420 }
421
422 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
423 ; AVX1-LABEL: shuffle_v4i64_0112:
424 ; AVX1:       # BB#0:
425 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
426 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1],xmm1[0]
427 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
428 ; AVX1-NEXT:    retq
429 ;
430 ; AVX2-LABEL: shuffle_v4i64_0112:
431 ; AVX2:       # BB#0:
432 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
433 ; AVX2-NEXT:    retq
434   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
435   ret <4 x i64> %shuffle
436 }
437
438 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
439 ; AVX1-LABEL: shuffle_v4i64_0300:
440 ; AVX1:       # BB#0:
441 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
442 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm1 = ymm1[0,1,2,2]
443 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
444 ; AVX1-NEXT:    retq
445 ;
446 ; AVX2-LABEL: shuffle_v4i64_0300:
447 ; AVX2:       # BB#0:
448 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,0,0]
449 ; AVX2-NEXT:    retq
450   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
451   ret <4 x i64> %shuffle
452 }
453
454 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
455 ; AVX1-LABEL: shuffle_v4i64_1000:
456 ; AVX1:       # BB#0:
457 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
458 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
459 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
460 ; AVX1-NEXT:    retq
461 ;
462 ; AVX2-LABEL: shuffle_v4i64_1000:
463 ; AVX2:       # BB#0:
464 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,0,0,0]
465 ; AVX2-NEXT:    retq
466   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
467   ret <4 x i64> %shuffle
468 }
469
470 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
471 ; AVX1-LABEL: shuffle_v4i64_2200:
472 ; AVX1:       # BB#0:
473 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
474 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm0 = ymm0[0,0,2,2]
475 ; AVX1-NEXT:    retq
476 ;
477 ; AVX2-LABEL: shuffle_v4i64_2200:
478 ; AVX2:       # BB#0:
479 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,2,0,0]
480 ; AVX2-NEXT:    retq
481   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
482   ret <4 x i64> %shuffle
483 }
484
485 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
486 ; AVX1-LABEL: shuffle_v4i64_3330:
487 ; AVX1:       # BB#0:
488 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
489 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
490 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,1,3,2]
491 ; AVX1-NEXT:    retq
492 ;
493 ; AVX2-LABEL: shuffle_v4i64_3330:
494 ; AVX2:       # BB#0:
495 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,3,3,0]
496 ; AVX2-NEXT:    retq
497   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
498   ret <4 x i64> %shuffle
499 }
500
501 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
502 ; AVX1-LABEL: shuffle_v4i64_3210:
503 ; AVX1:       # BB#0:
504 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,0,1]
505 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
506 ; AVX1-NEXT:    retq
507 ;
508 ; AVX2-LABEL: shuffle_v4i64_3210:
509 ; AVX2:       # BB#0:
510 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,2,1,0]
511 ; AVX2-NEXT:    retq
512   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
513   ret <4 x i64> %shuffle
514 }
515
516 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
517 ; AVX1-LABEL: shuffle_v4i64_0124:
518 ; AVX1:       # BB#0:
519 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
520 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
521 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1,2],ymm1[3]
522 ; AVX1-NEXT:    retq
523 ;
524 ; AVX2-LABEL: shuffle_v4i64_0124:
525 ; AVX2:       # BB#0:
526 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
527 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
528 ; AVX2-NEXT:    retq
529   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
530   ret <4 x i64> %shuffle
531 }
532
533 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
534 ; AVX1-LABEL: shuffle_v4i64_0142:
535 ; AVX1:       # BB#0:
536 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
537 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[0,1,2,2]
538 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
539 ; AVX1-NEXT:    retq
540 ;
541 ; AVX2-LABEL: shuffle_v4i64_0142:
542 ; AVX2:       # BB#0:
543 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm1, %ymm1
544 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,2,2]
545 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
546 ; AVX2-NEXT:    retq
547   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
548   ret <4 x i64> %shuffle
549 }
550
551 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
552 ; AVX1-LABEL: shuffle_v4i64_0412:
553 ; AVX1:       # BB#0:
554 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
555 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1],xmm2[0]
556 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
557 ; AVX1-NEXT:    vmovddup {{.*#+}} ymm1 = ymm1[0,0,2,2]
558 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
559 ; AVX1-NEXT:    retq
560 ;
561 ; AVX2-LABEL: shuffle_v4i64_0412:
562 ; AVX2:       # BB#0:
563 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,2]
564 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
565 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
566 ; AVX2-NEXT:    retq
567   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
568   ret <4 x i64> %shuffle
569 }
570
571 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
572 ; AVX1-LABEL: shuffle_v4i64_4012:
573 ; AVX1:       # BB#0:
574 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
575 ; AVX1-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1],xmm2[0]
576 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
577 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
578 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1,2,3]
579 ; AVX1-NEXT:    retq
580 ;
581 ; AVX2-LABEL: shuffle_v4i64_4012:
582 ; AVX2:       # BB#0:
583 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,2]
584 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
585 ; AVX2-NEXT:    retq
586   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
587   ret <4 x i64> %shuffle
588 }
589
590 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
591 ; ALL-LABEL: shuffle_v4i64_0145:
592 ; ALL:       # BB#0:
593 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
594 ; ALL-NEXT:    retq
595   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
596   ret <4 x i64> %shuffle
597 }
598
599 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
600 ; AVX1-LABEL: shuffle_v4i64_0451:
601 ; AVX1:       # BB#0:
602 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm1[1],xmm0[1]
603 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
604 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
605 ; AVX1-NEXT:    retq
606 ;
607 ; AVX2-LABEL: shuffle_v4i64_0451:
608 ; AVX2:       # BB#0:
609 ; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm0, %ymm0
610 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,1,3]
611 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3,4,5],ymm0[6,7]
612 ; AVX2-NEXT:    retq
613   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
614   ret <4 x i64> %shuffle
615 }
616
617 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
618 ; ALL-LABEL: shuffle_v4i64_4501:
619 ; ALL:       # BB#0:
620 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
621 ; ALL-NEXT:    retq
622   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
623   ret <4 x i64> %shuffle
624 }
625
626 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
627 ; AVX1-LABEL: shuffle_v4i64_4015:
628 ; AVX1:       # BB#0:
629 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
630 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
631 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
632 ; AVX1-NEXT:    retq
633 ;
634 ; AVX2-LABEL: shuffle_v4i64_4015:
635 ; AVX2:       # BB#0:
636 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm1, %ymm1
637 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,1,3]
638 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3,4,5],ymm1[6,7]
639 ; AVX2-NEXT:    retq
640   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
641   ret <4 x i64> %shuffle
642 }
643
644 define <4 x i64> @shuffle_v4i64_2u35(<4 x i64> %a, <4 x i64> %b) {
645 ; AVX1-LABEL: shuffle_v4i64_2u35:
646 ; AVX1:       # BB#0:
647 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
648 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm1 = xmm0[1],xmm1[1]
649 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
650 ; AVX1-NEXT:    retq
651 ;
652 ; AVX2-LABEL: shuffle_v4i64_2u35:
653 ; AVX2:       # BB#0:
654 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
655 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[2,1,3,1]
656 ; AVX2-NEXT:    retq
657   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 undef, i32 3, i32 5>
658   ret <4 x i64> %shuffle
659 }
660
661 define <4 x i64> @shuffle_v4i64_1251(<4 x i64> %a, <4 x i64> %b) {
662 ; AVX1-LABEL: shuffle_v4i64_1251:
663 ; AVX1:       # BB#0:
664 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,0,1]
665 ; AVX1-NEXT:    vshufpd {{.*#+}} ymm0 = ymm0[1],ymm2[0],ymm0[2],ymm2[3]
666 ; AVX1-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm1[1,0]
667 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
668 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2],ymm0[3]
669 ; AVX1-NEXT:    retq
670 ;
671 ; AVX2-LABEL: shuffle_v4i64_1251:
672 ; AVX2:       # BB#0:
673 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3]
674 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[1,2,2,1]
675 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
676 ; AVX2-NEXT:    retq
677   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 2, i32 5, i32 1>
678   ret <4 x i64> %shuffle
679 }
680
681 define <4 x i64> @shuffle_v4i64_1054(<4 x i64> %a, <4 x i64> %b) {
682 ; AVX1-LABEL: shuffle_v4i64_1054:
683 ; AVX1:       # BB#0:
684 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
685 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
686 ; AVX1-NEXT:    retq
687 ;
688 ; AVX2-LABEL: shuffle_v4i64_1054:
689 ; AVX2:       # BB#0:
690 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
691 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
692 ; AVX2-NEXT:    retq
693   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 5, i32 4>
694   ret <4 x i64> %shuffle
695 }
696
697 define <4 x i64> @shuffle_v4i64_3254(<4 x i64> %a, <4 x i64> %b) {
698 ; AVX1-LABEL: shuffle_v4i64_3254:
699 ; AVX1:       # BB#0:
700 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
701 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
702 ; AVX1-NEXT:    retq
703 ;
704 ; AVX2-LABEL: shuffle_v4i64_3254:
705 ; AVX2:       # BB#0:
706 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[0,1]
707 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
708 ; AVX2-NEXT:    retq
709   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 5, i32 4>
710   ret <4 x i64> %shuffle
711 }
712
713 define <4 x i64> @shuffle_v4i64_3276(<4 x i64> %a, <4 x i64> %b) {
714 ; AVX1-LABEL: shuffle_v4i64_3276:
715 ; AVX1:       # BB#0:
716 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
717 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
718 ; AVX1-NEXT:    retq
719 ;
720 ; AVX2-LABEL: shuffle_v4i64_3276:
721 ; AVX2:       # BB#0:
722 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]
723 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
724 ; AVX2-NEXT:    retq
725   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 7, i32 6>
726   ret <4 x i64> %shuffle
727 }
728
729 define <4 x i64> @shuffle_v4i64_1076(<4 x i64> %a, <4 x i64> %b) {
730 ; AVX1-LABEL: shuffle_v4i64_1076:
731 ; AVX1:       # BB#0:
732 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
733 ; AVX1-NEXT:    vpermilpd {{.*#+}} ymm0 = ymm0[1,0,3,2]
734 ; AVX1-NEXT:    retq
735 ;
736 ; AVX2-LABEL: shuffle_v4i64_1076:
737 ; AVX2:       # BB#0:
738 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
739 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[2,3,0,1,6,7,4,5]
740 ; AVX2-NEXT:    retq
741   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6>
742   ret <4 x i64> %shuffle
743 }
744
745 define <4 x i64> @shuffle_v4i64_0415(<4 x i64> %a, <4 x i64> %b) {
746 ; AVX1-LABEL: shuffle_v4i64_0415:
747 ; AVX1:       # BB#0:
748 ; AVX1-NEXT:    vunpckhpd {{.*#+}} xmm2 = xmm0[1],xmm1[1]
749 ; AVX1-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
750 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
751 ; AVX1-NEXT:    retq
752 ;
753 ; AVX2-LABEL: shuffle_v4i64_0415:
754 ; AVX2:       # BB#0:
755 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,0,2,1]
756 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3]
757 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
758 ; AVX2-NEXT:    retq
759   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
760   ret <4 x i64> %shuffle
761 }
762
763 define <4 x i64> @shuffle_v4i64_z4z6(<4 x i64> %a) {
764 ; AVX1-LABEL: shuffle_v4i64_z4z6:
765 ; AVX1:       # BB#0:
766 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
767 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
768 ; AVX1-NEXT:    retq
769 ;
770 ; AVX2-LABEL: shuffle_v4i64_z4z6:
771 ; AVX2:       # BB#0:
772 ; 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]
773 ; AVX2-NEXT:    retq
774   %shuffle = shufflevector <4 x i64> zeroinitializer, <4 x i64> %a, <4 x i32> <i32 0, i32 4, i32 0, i32 6>
775   ret <4 x i64> %shuffle
776 }
777
778 define <4 x i64> @shuffle_v4i64_5zuz(<4 x i64> %a) {
779 ; AVX1-LABEL: shuffle_v4i64_5zuz:
780 ; AVX1:       # BB#0:
781 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
782 ; AVX1-NEXT:    vunpckhpd {{.*#+}} ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
783 ; AVX1-NEXT:    retq
784 ;
785 ; AVX2-LABEL: shuffle_v4i64_5zuz:
786 ; AVX2:       # BB#0:
787 ; 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
788 ; AVX2-NEXT:    retq
789   %shuffle = shufflevector <4 x i64> zeroinitializer, <4 x i64> %a, <4 x i32> <i32 5, i32 0, i32 undef, i32 0>
790   ret <4 x i64> %shuffle
791 }
792
793 define <4 x i64> @shuffle_v4i64_40u2(<4 x i64> %a, <4 x i64> %b) {
794 ; AVX1-LABEL: shuffle_v4i64_40u2:
795 ; AVX1:       # BB#0:
796 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
797 ; AVX1-NEXT:    retq
798 ;
799 ; AVX2-LABEL: shuffle_v4i64_40u2:
800 ; AVX2:       # BB#0:
801 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
802 ; AVX2-NEXT:    retq
803   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 undef, i32 2>
804   ret <4 x i64> %shuffle
805 }
806
807 define <4 x i64> @stress_test1(<4 x i64> %a, <4 x i64> %b) {
808 ; ALL-LABEL: stress_test1:
809 ; ALL:         retq
810   %c = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 1, i32 1, i32 0>
811   %d = shufflevector <4 x i64> %c, <4 x i64> undef, <4 x i32> <i32 3, i32 undef, i32 2, i32 undef>
812   %e = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 3, i32 1, i32 undef>
813   %f = shufflevector <4 x i64> %d, <4 x i64> %e, <4 x i32> <i32 5, i32 1, i32 1, i32 0>
814
815   ret <4 x i64> %f
816 }
817
818 define <4 x i64> @insert_reg_and_zero_v4i64(i64 %a) {
819 ; ALL-LABEL: insert_reg_and_zero_v4i64:
820 ; ALL:       # BB#0:
821 ; ALL-NEXT:    vmovq %rdi, %xmm0
822 ; ALL-NEXT:    retq
823   %v = insertelement <4 x i64> undef, i64 %a, i64 0
824   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
825   ret <4 x i64> %shuffle
826 }
827
828 define <4 x i64> @insert_mem_and_zero_v4i64(i64* %ptr) {
829 ; ALL-LABEL: insert_mem_and_zero_v4i64:
830 ; ALL:       # BB#0:
831 ; ALL-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
832 ; ALL-NEXT:    retq
833   %a = load i64, i64* %ptr
834   %v = insertelement <4 x i64> undef, i64 %a, i64 0
835   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
836   ret <4 x i64> %shuffle
837 }
838
839 define <4 x double> @insert_reg_and_zero_v4f64(double %a) {
840 ; ALL-LABEL: insert_reg_and_zero_v4f64:
841 ; ALL:       # BB#0:
842 ; ALL-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
843 ; ALL-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
844 ; ALL-NEXT:    retq
845   %v = insertelement <4 x double> undef, double %a, i32 0
846   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
847   ret <4 x double> %shuffle
848 }
849
850 define <4 x double> @insert_mem_and_zero_v4f64(double* %ptr) {
851 ; ALL-LABEL: insert_mem_and_zero_v4f64:
852 ; ALL:       # BB#0:
853 ; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
854 ; ALL-NEXT:    retq
855   %a = load double, double* %ptr
856   %v = insertelement <4 x double> undef, double %a, i32 0
857   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
858   ret <4 x double> %shuffle
859 }
860
861 define <4 x double> @splat_mem_v4f64(double* %ptr) {
862 ; ALL-LABEL: splat_mem_v4f64:
863 ; ALL:       # BB#0:
864 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
865 ; ALL-NEXT:    retq
866   %a = load double, double* %ptr
867   %v = insertelement <4 x double> undef, double %a, i32 0
868   %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
869   ret <4 x double> %shuffle
870 }
871
872 define <4 x i64> @splat_mem_v4i64(i64* %ptr) {
873 ; ALL-LABEL: splat_mem_v4i64:
874 ; ALL:       # BB#0:
875 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
876 ; ALL-NEXT:    retq
877   %a = load i64, i64* %ptr
878   %v = insertelement <4 x i64> undef, i64 %a, i64 0
879   %shuffle = shufflevector <4 x i64> %v, <4 x i64> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
880   ret <4 x i64> %shuffle
881 }
882
883 define <4 x double> @splat_mem_v4f64_2(double* %p) {
884 ; ALL-LABEL: splat_mem_v4f64_2:
885 ; ALL:       # BB#0:
886 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
887 ; ALL-NEXT:    retq
888   %1 = load double, double* %p
889   %2 = insertelement <2 x double> undef, double %1, i32 0
890   %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> zeroinitializer
891   ret <4 x double> %3
892 }
893
894 define <4 x double> @splat_v4f64(<2 x double> %r) {
895 ; AVX1-LABEL: splat_v4f64:
896 ; AVX1:       # BB#0:
897 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
898 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
899 ; AVX1-NEXT:    retq
900 ;
901 ; AVX2-LABEL: splat_v4f64:
902 ; AVX2:       # BB#0:
903 ; AVX2-NEXT:    vbroadcastsd %xmm0, %ymm0
904 ; AVX2-NEXT:    retq
905   %1 = shufflevector <2 x double> %r, <2 x double> undef, <4 x i32> zeroinitializer
906   ret <4 x double> %1
907 }
908
909 define <4 x i64> @splat_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
910 ; AVX1-LABEL: splat_mem_v4i64_from_v2i64:
911 ; AVX1:       # BB#0:
912 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
913 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
914 ; AVX1-NEXT:    retq
915 ;
916 ; AVX2-LABEL: splat_mem_v4i64_from_v2i64:
917 ; AVX2:       # BB#0:
918 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
919 ; AVX2-NEXT:    retq
920   %v = load <2 x i64>, <2 x i64>* %ptr
921   %shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
922   ret <4 x i64> %shuffle
923 }
924
925 define <4 x double> @splat_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
926 ; AVX1-LABEL: splat_mem_v4f64_from_v2f64:
927 ; AVX1:       # BB#0:
928 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
929 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
930 ; AVX1-NEXT:    retq
931 ;
932 ; AVX2-LABEL: splat_mem_v4f64_from_v2f64:
933 ; AVX2:       # BB#0:
934 ; AVX2-NEXT:    vbroadcastsd (%rdi), %ymm0
935 ; AVX2-NEXT:    retq
936   %v = load <2 x double>, <2 x double>* %ptr
937   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
938   ret <4 x double> %shuffle
939 }
940
941 define <4 x i64> @splat128_mem_v4i64_from_v2i64(<2 x i64>* %ptr) {
942 ; ALL-LABEL: splat128_mem_v4i64_from_v2i64:
943 ; ALL:       # BB#0:
944 ; ALL-NEXT:    vmovaps (%rdi), %xmm0
945 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
946 ; ALL-NEXT:    retq
947   %v = load <2 x i64>, <2 x i64>* %ptr
948   %shuffle = shufflevector <2 x i64> %v, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
949   ret <4 x i64> %shuffle
950 }
951
952 define <4 x double> @splat128_mem_v4f64_from_v2f64(<2 x double>* %ptr) {
953 ; ALL-LABEL: splat128_mem_v4f64_from_v2f64:
954 ; ALL:       # BB#0:
955 ; ALL-NEXT:    vmovaps (%rdi), %xmm0
956 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
957 ; ALL-NEXT:    retq
958   %v = load <2 x double>, <2 x double>* %ptr
959   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
960   ret <4 x double> %shuffle
961 }
962
963 define <4 x double> @bitcast_v4f64_0426(<4 x double> %a, <4 x double> %b) {
964 ; AVX1-LABEL: bitcast_v4f64_0426:
965 ; AVX1:       # BB#0:
966 ; AVX1-NEXT:    vunpcklpd {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
967 ; AVX1-NEXT:    retq
968 ;
969 ; AVX2-LABEL: bitcast_v4f64_0426:
970 ; AVX2:       # BB#0:
971 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
972 ; AVX2-NEXT:    retq
973   %shuffle64 = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
974   %bitcast32 = bitcast <4 x double> %shuffle64 to <8 x float>
975   %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>
976   %bitcast16 = bitcast <8 x float> %shuffle32 to <16 x i16>
977   %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>
978   %bitcast64 = bitcast <16 x i16> %shuffle16 to <4 x double>
979   ret <4 x double> %bitcast64
980 }
981
982 define <4 x i64> @concat_v4i64_0167(<4 x i64> %a0, <4 x i64> %a1) {
983 ; AVX1-LABEL: concat_v4i64_0167:
984 ; AVX1:       # BB#0:
985 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3]
986 ; AVX1-NEXT:    retq
987 ;
988 ; AVX2-LABEL: concat_v4i64_0167:
989 ; AVX2:       # BB#0:
990 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
991 ; AVX2-NEXT:    retq
992   %a0lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 0, i32 1>
993   %a1hi = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 6, i32 7>
994   %shuffle64 = shufflevector <2 x i64> %a0lo, <2 x i64> %a1hi, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
995   ret <4 x i64> %shuffle64
996 }
997
998 define <4 x i64> @concat_v4i64_0145_bc(<4 x i64> %a0, <4 x i64> %a1) {
999 ; ALL-LABEL: concat_v4i64_0145_bc:
1000 ; ALL:       # BB#0:
1001 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1002 ; ALL-NEXT:    retq
1003   %a0lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 0, i32 1>
1004   %a1lo = shufflevector <4 x i64> %a0, <4 x i64> %a1, <2 x i32> <i32 4, i32 5>
1005   %bc0lo = bitcast <2 x i64> %a0lo to <4 x i32>
1006   %bc1lo = bitcast <2 x i64> %a1lo to <4 x i32>
1007   %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>
1008   %shuffle64 = bitcast <8 x i32> %shuffle32 to <4 x i64>
1009   ret <4 x i64> %shuffle64
1010 }
1011
1012 define <4 x i64> @insert_dup_mem_v4i64(i64* %ptr) {
1013 ; ALL-LABEL: insert_dup_mem_v4i64:
1014 ; ALL:       # BB#0:
1015 ; ALL-NEXT:    vbroadcastsd (%rdi), %ymm0
1016 ; ALL-NEXT:    retq
1017   %tmp = load i64, i64* %ptr, align 1
1018   %tmp1 = insertelement <2 x i64> undef, i64 %tmp, i32 0
1019   %tmp2 = shufflevector <2 x i64> %tmp1, <2 x i64> undef, <4 x i32> zeroinitializer
1020   ret <4 x i64> %tmp2
1021 }