[x86] Teach the new vector shuffle lowering a fancier way to lower
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-256-v4.ll
1 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
2 ; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
3
4 target triple = "x86_64-unknown-unknown"
5
6 define <4 x double> @shuffle_v4f64_0001(<4 x double> %a, <4 x double> %b) {
7 ; ALL-LABEL: @shuffle_v4f64_0001
8 ; ALL:       # BB#0:
9 ; ALL-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm0[0,0]
10 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
11 ; ALL-NEXT:    retq
12   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
13   ret <4 x double> %shuffle
14 }
15
16 define <4 x double> @shuffle_v4f64_0020(<4 x double> %a, <4 x double> %b) {
17 ; ALL-LABEL: @shuffle_v4f64_0020
18 ; ALL:       # BB#0:
19 ; ALL-NEXT:    vextractf128 $1, %ymm0, %xmm1
20 ; ALL-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
21 ; ALL-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
22 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
23 ; ALL-NEXT:    retq
24   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
25   ret <4 x double> %shuffle
26 }
27
28 define <4 x double> @shuffle_v4f64_0300(<4 x double> %a, <4 x double> %b) {
29 ; ALL-LABEL: @shuffle_v4f64_0300
30 ; ALL:       # BB#0:
31 ; ALL-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
32 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,1,2,2]
33 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
34 ; ALL-NEXT:    retq
35   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
36   ret <4 x double> %shuffle
37 }
38
39 define <4 x double> @shuffle_v4f64_1000(<4 x double> %a, <4 x double> %b) {
40 ; ALL-LABEL: @shuffle_v4f64_1000
41 ; ALL:       # BB#0:
42 ; ALL-NEXT:    vpermilpd {{.*}} # xmm1 = xmm0[1,0]
43 ; ALL-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
44 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
45 ; ALL-NEXT:    retq
46   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
47   ret <4 x double> %shuffle
48 }
49
50 define <4 x double> @shuffle_v4f64_2200(<4 x double> %a, <4 x double> %b) {
51 ; ALL-LABEL: @shuffle_v4f64_2200
52 ; ALL:       # BB#0:
53 ; ALL-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
54 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
55 ; ALL-NEXT:    retq
56   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
57   ret <4 x double> %shuffle
58 }
59
60 define <4 x double> @shuffle_v4f64_3330(<4 x double> %a, <4 x double> %b) {
61 ; ALL-LABEL: @shuffle_v4f64_3330
62 ; ALL:       # BB#0:
63 ; ALL-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
64 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[1,1,2,2]
65 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,3,2]
66 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
67 ; ALL-NEXT:    retq
68   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
69   ret <4 x double> %shuffle
70 }
71
72 define <4 x double> @shuffle_v4f64_3210(<4 x double> %a, <4 x double> %b) {
73 ; ALL-LABEL: @shuffle_v4f64_3210
74 ; ALL:       # BB#0:
75 ; ALL-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
76 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
77 ; ALL-NEXT:    retq
78   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
79   ret <4 x double> %shuffle
80 }
81
82 define <4 x double> @shuffle_v4f64_0023(<4 x double> %a, <4 x double> %b) {
83 ; ALL-LABEL: @shuffle_v4f64_0023
84 ; ALL:       # BB#0:
85 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,3]
86 ; ALL-NEXT:    retq
87   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
88   ret <4 x double> %shuffle
89 }
90
91 define <4 x double> @shuffle_v4f64_0022(<4 x double> %a, <4 x double> %b) {
92 ; ALL-LABEL: @shuffle_v4f64_0022
93 ; ALL:       # BB#0:
94 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
95 ; ALL-NEXT:    retq
96   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
97   ret <4 x double> %shuffle
98 }
99
100 define <4 x double> @shuffle_v4f64_1032(<4 x double> %a, <4 x double> %b) {
101 ; ALL-LABEL: @shuffle_v4f64_1032
102 ; ALL:       # BB#0:
103 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
104 ; ALL-NEXT:    retq
105   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
106   ret <4 x double> %shuffle
107 }
108
109 define <4 x double> @shuffle_v4f64_1133(<4 x double> %a, <4 x double> %b) {
110 ; ALL-LABEL: @shuffle_v4f64_1133
111 ; ALL:       # BB#0:
112 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,1,3,3]
113 ; ALL-NEXT:    retq
114   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 1, i32 3, i32 3>
115   ret <4 x double> %shuffle
116 }
117
118 define <4 x double> @shuffle_v4f64_1023(<4 x double> %a, <4 x double> %b) {
119 ; ALL-LABEL: @shuffle_v4f64_1023
120 ; ALL:       # BB#0:
121 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,2,3]
122 ; ALL-NEXT:    retq
123   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
124   ret <4 x double> %shuffle
125 }
126
127 define <4 x double> @shuffle_v4f64_1022(<4 x double> %a, <4 x double> %b) {
128 ; ALL-LABEL: @shuffle_v4f64_1022
129 ; ALL:       # BB#0:
130 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,2,2]
131 ; ALL-NEXT:    retq
132   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 0, i32 2, i32 2>
133   ret <4 x double> %shuffle
134 }
135
136 define <4 x double> @shuffle_v4f64_0423(<4 x double> %a, <4 x double> %b) {
137 ; ALL-LABEL: @shuffle_v4f64_0423
138 ; ALL:       # BB#0:
139 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,0,2,2]
140 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
141 ; ALL-NEXT:    retq
142   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 3>
143   ret <4 x double> %shuffle
144 }
145
146 define <4 x double> @shuffle_v4f64_0462(<4 x double> %a, <4 x double> %b) {
147 ; ALL-LABEL: @shuffle_v4f64_0462
148 ; ALL:       # BB#0:
149 ; ALL-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,0,2,2]
150 ; ALL-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
151 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2],ymm0[3]
152 ; ALL-NEXT:    retq
153   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 6, i32 2>
154   ret <4 x double> %shuffle
155 }
156
157 define <4 x double> @shuffle_v4f64_0426(<4 x double> %a, <4 x double> %b) {
158 ; ALL-LABEL: @shuffle_v4f64_0426
159 ; ALL:       # BB#0:
160 ; ALL-NEXT:    vunpcklpd {{.*}} # ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
161 ; ALL-NEXT:    retq
162   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
163   ret <4 x double> %shuffle
164 }
165
166 define <4 x double> @shuffle_v4f64_1537(<4 x double> %a, <4 x double> %b) {
167 ; ALL-LABEL: @shuffle_v4f64_1537
168 ; ALL:       # BB#0:
169 ; ALL-NEXT:    vunpckhpd {{.*}} # ymm0 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
170 ; ALL-NEXT:    retq
171   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
172   ret <4 x double> %shuffle
173 }
174
175 define <4 x double> @shuffle_v4f64_4062(<4 x double> %a, <4 x double> %b) {
176 ; ALL-LABEL: @shuffle_v4f64_4062
177 ; ALL:       # BB#0:
178 ; ALL-NEXT:    vunpcklpd {{.*}} # ymm0 = ymm1[0],ymm0[0],ymm1[2],ymm0[2]
179 ; ALL-NEXT:    retq
180   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
181   ret <4 x double> %shuffle
182 }
183
184 define <4 x double> @shuffle_v4f64_5173(<4 x double> %a, <4 x double> %b) {
185 ; ALL-LABEL: @shuffle_v4f64_5173
186 ; ALL:       # BB#0:
187 ; ALL-NEXT:    vunpckhpd {{.*}} # ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]
188 ; ALL-NEXT:    retq
189   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 7, i32 3>
190   ret <4 x double> %shuffle
191 }
192
193 define <4 x double> @shuffle_v4f64_5163(<4 x double> %a, <4 x double> %b) {
194 ; ALL-LABEL: @shuffle_v4f64_5163
195 ; ALL:       # BB#0:
196 ; ALL-NEXT:    vshufpd {{.*}} # ymm0 = ymm1[1],ymm0[1],ymm1[2],ymm0[3]
197 ; ALL-NEXT:    retq
198   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 5, i32 1, i32 6, i32 3>
199   ret <4 x double> %shuffle
200 }
201
202 define <4 x double> @shuffle_v4f64_0527(<4 x double> %a, <4 x double> %b) {
203 ; ALL-LABEL: @shuffle_v4f64_0527
204 ; ALL:       # BB#0:
205 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
206 ; ALL-NEXT:    retq
207   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
208   ret <4 x double> %shuffle
209 }
210
211 define <4 x double> @shuffle_v4f64_4163(<4 x double> %a, <4 x double> %b) {
212 ; ALL-LABEL: @shuffle_v4f64_4163
213 ; ALL:       # BB#0:
214 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3]
215 ; ALL-NEXT:    retq
216   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
217   ret <4 x double> %shuffle
218 }
219
220 define <4 x double> @shuffle_v4f64_0145(<4 x double> %a, <4 x double> %b) {
221 ; ALL-LABEL: @shuffle_v4f64_0145
222 ; ALL:       # BB#0:
223 ; ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
224 ; ALL-NEXT:    retq
225   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
226   ret <4 x double> %shuffle
227 }
228
229 define <4 x double> @shuffle_v4f64_4501(<4 x double> %a, <4 x double> %b) {
230 ; ALL-LABEL: @shuffle_v4f64_4501
231 ; ALL:       # BB#0:
232 ; ALL-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
233 ; ALL-NEXT:    retq
234   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
235   ret <4 x double> %shuffle
236 }
237
238 define <4 x double> @shuffle_v4f64_0167(<4 x double> %a, <4 x double> %b) {
239 ; ALL-LABEL: @shuffle_v4f64_0167
240 ; ALL:       # BB#0:
241 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3]
242 ; ALL-NEXT:    retq
243   %shuffle = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
244   ret <4 x double> %shuffle
245 }
246
247 define <4 x i64> @shuffle_v4i64_0001(<4 x i64> %a, <4 x i64> %b) {
248 ; AVX1-LABEL: @shuffle_v4i64_0001
249 ; AVX1:       # BB#0:
250 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm0[0,0]
251 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
252 ; AVX1-NEXT:    retq
253 ;
254 ; AVX2-LABEL: @shuffle_v4i64_0001
255 ; AVX2:       # BB#0:
256 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,0,1]
257 ; AVX2-NEXT:    retq
258   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
259   ret <4 x i64> %shuffle
260 }
261
262 define <4 x i64> @shuffle_v4i64_0020(<4 x i64> %a, <4 x i64> %b) {
263 ; AVX1-LABEL: @shuffle_v4i64_0020
264 ; AVX1:       # BB#0:
265 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
266 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0],xmm0[0]
267 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
268 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
269 ; AVX1-NEXT:    retq
270 ;
271 ; AVX2-LABEL: @shuffle_v4i64_0020
272 ; AVX2:       # BB#0:
273 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,2,0]
274 ; AVX2-NEXT:    retq
275   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 0, i32 2, i32 0>
276   ret <4 x i64> %shuffle
277 }
278
279 define <4 x i64> @shuffle_v4i64_0112(<4 x i64> %a, <4 x i64> %b) {
280 ; AVX1-LABEL: @shuffle_v4i64_0112
281 ; AVX1:       # BB#0:
282 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
283 ; AVX1-NEXT:    vshufpd {{.*}} # xmm1 = xmm0[1],xmm1[0]
284 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
285 ; AVX1-NEXT:    retq
286 ;
287 ; AVX2-LABEL: @shuffle_v4i64_0112
288 ; AVX2:       # BB#0:
289 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,2]
290 ; AVX2-NEXT:    retq
291   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 1, i32 2>
292   ret <4 x i64> %shuffle
293 }
294
295 define <4 x i64> @shuffle_v4i64_0300(<4 x i64> %a, <4 x i64> %b) {
296 ; AVX1-LABEL: @shuffle_v4i64_0300
297 ; AVX1:       # BB#0:
298 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
299 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[0,1,2,2]
300 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
301 ; AVX1-NEXT:    retq
302 ;
303 ; AVX2-LABEL: @shuffle_v4i64_0300
304 ; AVX2:       # BB#0:
305 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,3,0,0]
306 ; AVX2-NEXT:    retq
307   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 3, i32 0, i32 0>
308   ret <4 x i64> %shuffle
309 }
310
311 define <4 x i64> @shuffle_v4i64_1000(<4 x i64> %a, <4 x i64> %b) {
312 ; AVX1-LABEL: @shuffle_v4i64_1000
313 ; AVX1:       # BB#0:
314 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm0[1,0]
315 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
316 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
317 ; AVX1-NEXT:    retq
318 ;
319 ; AVX2-LABEL: @shuffle_v4i64_1000
320 ; AVX2:       # BB#0:
321 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[1,0,0,0]
322 ; AVX2-NEXT:    retq
323   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 0, i32 0>
324   ret <4 x i64> %shuffle
325 }
326
327 define <4 x i64> @shuffle_v4i64_2200(<4 x i64> %a, <4 x i64> %b) {
328 ; AVX1-LABEL: @shuffle_v4i64_2200
329 ; AVX1:       # BB#0:
330 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
331 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,2,2]
332 ; AVX1-NEXT:    retq
333 ;
334 ; AVX2-LABEL: @shuffle_v4i64_2200
335 ; AVX2:       # BB#0:
336 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[2,2,0,0]
337 ; AVX2-NEXT:    retq
338   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 2, i32 2, i32 0, i32 0>
339   ret <4 x i64> %shuffle
340 }
341
342 define <4 x i64> @shuffle_v4i64_3330(<4 x i64> %a, <4 x i64> %b) {
343 ; AVX1-LABEL: @shuffle_v4i64_3330
344 ; AVX1:       # BB#0:
345 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm1 = ymm0[2,3,0,1]
346 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm1 = ymm1[1,1,2,2]
347 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[0,0,3,2]
348 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
349 ; AVX1-NEXT:    retq
350 ;
351 ; AVX2-LABEL: @shuffle_v4i64_3330
352 ; AVX2:       # BB#0:
353 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,3,3,0]
354 ; AVX2-NEXT:    retq
355   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 3, i32 3, i32 0>
356   ret <4 x i64> %shuffle
357 }
358
359 define <4 x i64> @shuffle_v4i64_3210(<4 x i64> %a, <4 x i64> %b) {
360 ; AVX1-LABEL: @shuffle_v4i64_3210
361 ; AVX1:       # BB#0:
362 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm0[2,3,0,1]
363 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,0,3,2]
364 ; AVX1-NEXT:    retq
365 ;
366 ; AVX2-LABEL: @shuffle_v4i64_3210
367 ; AVX2:       # BB#0:
368 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,2,1,0]
369 ; AVX2-NEXT:    retq
370   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
371   ret <4 x i64> %shuffle
372 }
373
374 define <4 x i64> @shuffle_v4i64_0124(<4 x i64> %a, <4 x i64> %b) {
375 ; AVX1-LABEL: @shuffle_v4i64_0124
376 ; AVX1:       # BB#0:
377 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
378 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0,0]
379 ; AVX1-NEXT:    vblendpd {{.*}} # xmm1 = xmm2[0],xmm1[1]
380 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
381 ; AVX1-NEXT:    retq
382 ;
383 ; AVX2-LABEL: @shuffle_v4i64_0124
384 ; AVX2:       # BB#0:
385 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,2,0]
386 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
387 ; AVX2-NEXT:    retq
388   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 4>
389   ret <4 x i64> %shuffle
390 }
391
392 define <4 x i64> @shuffle_v4i64_0142(<4 x i64> %a, <4 x i64> %b) {
393 ; AVX1-LABEL: @shuffle_v4i64_0142
394 ; AVX1:       # BB#0:
395 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
396 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm2 = xmm2[0,0]
397 ; AVX1-NEXT:    vblendpd {{.*}} # xmm1 = xmm1[0],xmm2[1]
398 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
399 ; AVX1-NEXT:    retq
400 ;
401 ; AVX2-LABEL: @shuffle_v4i64_0142
402 ; AVX2:       # BB#0:
403 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,0,3]
404 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,2,2]
405 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3],ymm1[4,5],ymm0[6,7]
406 ; AVX2-NEXT:    retq
407   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
408   ret <4 x i64> %shuffle
409 }
410
411 define <4 x i64> @shuffle_v4i64_0412(<4 x i64> %a, <4 x i64> %b) {
412 ; AVX1-LABEL: @shuffle_v4i64_0412
413 ; AVX1:       # BB#0:
414 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
415 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
416 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0,0]
417 ; AVX1-NEXT:    vblendpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
418 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
419 ; AVX1-NEXT:    retq
420 ;
421 ; AVX2-LABEL: @shuffle_v4i64_0412
422 ; AVX2:       # BB#0:
423 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[0,1,0,1,4,5,4,5]
424 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,2]
425 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5,6,7]
426 ; AVX2-NEXT:    retq
427   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 1, i32 2>
428   ret <4 x i64> %shuffle
429 }
430
431 define <4 x i64> @shuffle_v4i64_4012(<4 x i64> %a, <4 x i64> %b) {
432 ; AVX1-LABEL: @shuffle_v4i64_4012
433 ; AVX1:       # BB#0:
434 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
435 ; AVX1-NEXT:    vshufpd {{.*}} # xmm2 = xmm0[1],xmm2[0]
436 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
437 ; AVX1-NEXT:    vblendpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
438 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
439 ; AVX1-NEXT:    retq
440 ;
441 ; AVX2-LABEL: @shuffle_v4i64_4012
442 ; AVX2:       # BB#0:
443 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,1,2]
444 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
445 ; AVX2-NEXT:    retq
446   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
447   ret <4 x i64> %shuffle
448 }
449
450 define <4 x i64> @shuffle_v4i64_0145(<4 x i64> %a, <4 x i64> %b) {
451 ; AVX1-LABEL: @shuffle_v4i64_0145
452 ; AVX1:       # BB#0:
453 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
454 ; AVX1-NEXT:    retq
455 ;
456 ; AVX2-LABEL: @shuffle_v4i64_0145
457 ; AVX2:       # BB#0:
458 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,0,1]
459 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
460 ; AVX2-NEXT:    retq
461   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
462   ret <4 x i64> %shuffle
463 }
464
465 define <4 x i64> @shuffle_v4i64_0451(<4 x i64> %a, <4 x i64> %b) {
466 ; AVX1-LABEL: @shuffle_v4i64_0451
467 ; AVX1:       # BB#0:
468 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm2 = xmm1[1,0]
469 ; AVX1-NEXT:    vblendpd {{.*}} # xmm2 = xmm2[0],xmm0[1]
470 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm1 = xmm1[0,0]
471 ; AVX1-NEXT:    vblendpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
472 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
473 ; AVX1-NEXT:    retq
474 ;
475 ; AVX2-LABEL: @shuffle_v4i64_0451
476 ; AVX2:       # BB#0:
477 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,0,1,3]
478 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,2,1]
479 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5],ymm0[6,7]
480 ; AVX2-NEXT:    retq
481   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 0, i32 4, i32 5, i32 1>
482   ret <4 x i64> %shuffle
483 }
484
485 define <4 x i64> @shuffle_v4i64_4501(<4 x i64> %a, <4 x i64> %b) {
486 ; AVX1-LABEL: @shuffle_v4i64_4501
487 ; AVX1:       # BB#0:
488 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
489 ; AVX1-NEXT:    retq
490 ;
491 ; AVX2-LABEL: @shuffle_v4i64_4501
492 ; AVX2:       # BB#0:
493 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,0,1]
494 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
495 ; AVX2-NEXT:    retq
496   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 5, i32 0, i32 1>
497   ret <4 x i64> %shuffle
498 }
499
500 define <4 x i64> @shuffle_v4i64_4015(<4 x i64> %a, <4 x i64> %b) {
501 ; AVX1-LABEL: @shuffle_v4i64_4015
502 ; AVX1:       # BB#0:
503 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm2 = xmm0[1,0]
504 ; AVX1-NEXT:    vblendpd {{.*}} # xmm2 = xmm2[0],xmm1[1]
505 ; AVX1-NEXT:    vunpcklpd {{.*}} # xmm0 = xmm0[0,0]
506 ; AVX1-NEXT:    vblendpd {{.*}} # xmm0 = xmm1[0],xmm0[1]
507 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
508 ; AVX1-NEXT:    retq
509 ;
510 ; AVX2-LABEL: @shuffle_v4i64_4015
511 ; AVX2:       # BB#0:
512 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[0,1,2,1]
513 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,0,1,3]
514 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5],ymm1[6,7]
515 ; AVX2-NEXT:    retq
516   %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 0, i32 1, i32 5>
517   ret <4 x i64> %shuffle
518 }
519
520 define <4 x i64> @stress_test1(<4 x i64> %a, <4 x i64> %b) {
521 ; AVX1-LABEL: @stress_test1
522 ; AVX1:       # BB#0:
523 ; AVX1-NEXT:    vperm2f128 {{.*}} # ymm0 = ymm1[2,3,0,1]
524 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm2 = ymm0[1,0,3,2]
525 ; AVX1-NEXT:    vblendpd {{.*}} # ymm1 = ymm2[0],ymm1[1],ymm2[2,3]
526 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
527 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm1[1,0]
528 ; AVX1-NEXT:    vpermilpd {{.*}} # ymm0 = ymm0[1,1,3,2]
529 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm0 = xmm0[1,0]
530 ; AVX1-NEXT:    vblendpd {{.*}} # xmm0 = xmm0[0],xmm1[1]
531 ; AVX1-NEXT:    vpermilpd {{.*}} # xmm1 = xmm1[1,0]
532 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
533 ; AVX1-NEXT:    retq
534 ;
535 ; AVX2-LABEL: @stress_test1
536 ; AVX2:       # BB#0:
537 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm1[3,1,1,0]
538 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[3,1,2,3]
539 ; AVX2-NEXT:    vpermq {{.*}} # ymm1 = ymm1[3,3,1,3]
540 ; AVX2-NEXT:    vpshufd {{.*}} # ymm1 = ymm1[2,3,2,3,6,7,6,7]
541 ; AVX2-NEXT:    vpermq {{.*}} # ymm0 = ymm0[0,1,1,0]
542 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm1[0,1],ymm0[2,3,4,5,6,7]
543 ; AVX2-NEXT:    retq
544   %c = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 1, i32 1, i32 0>
545   %d = shufflevector <4 x i64> %c, <4 x i64> undef, <4 x i32> <i32 3, i32 undef, i32 2, i32 undef>
546   %e = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> <i32 3, i32 3, i32 1, i32 undef>
547   %f = shufflevector <4 x i64> %d, <4 x i64> %e, <4 x i32> <i32 5, i32 1, i32 1, i32 0>
548
549   ret <4 x i64> %f
550 }
551
552 define <4 x i64> @insert_reg_and_zero_v4i64(i64 %a) {
553 ; AVX1-LABEL: @insert_reg_and_zero_v4i64
554 ; AVX1:       # BB#0:
555 ; AVX1-NEXT:    vmovq %rdi, %xmm0
556 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
557 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
558 ; AVX1-NEXT:    retq
559 ;
560 ; AVX2-LABEL: @insert_reg_and_zero_v4i64
561 ; AVX2:       # BB#0:
562 ; AVX2-NEXT:    vmovq %rdi, %xmm0
563 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
564 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
565 ; AVX2-NEXT:    retq
566   %v = insertelement <4 x i64> undef, i64 %a, i64 0
567   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
568   ret <4 x i64> %shuffle
569 }
570
571 define <4 x i64> @insert_mem_and_zero_v4i64(i64* %ptr) {
572 ; AVX1-LABEL: @insert_mem_and_zero_v4i64
573 ; AVX1:       # BB#0:
574 ; AVX1-NEXT:    vmovq (%rdi), %xmm0
575 ; AVX1-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
576 ; AVX1-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
577 ; AVX1-NEXT:    retq
578 ;
579 ; AVX2-LABEL: @insert_mem_and_zero_v4i64
580 ; AVX2:       # BB#0:
581 ; AVX2-NEXT:    vmovq (%rdi), %xmm0
582 ; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
583 ; AVX2-NEXT:    vpblendd {{.*}} # ymm0 = ymm0[0,1],ymm1[2,3,4,5,6,7]
584 ; AVX2-NEXT:    retq
585   %a = load i64* %ptr
586   %v = insertelement <4 x i64> undef, i64 %a, i64 0
587   %shuffle = shufflevector <4 x i64> %v, <4 x i64> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
588   ret <4 x i64> %shuffle
589 }
590
591 define <4 x double> @insert_reg_and_zero_v4f64(double %a) {
592 ; ALL-LABEL: @insert_reg_and_zero_v4f64
593 ; ALL:       # BB#0:
594 ; ALL:         vxorpd %ymm1, %ymm1, %ymm1
595 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
596 ; ALL-NEXT:    retq
597   %v = insertelement <4 x double> undef, double %a, i32 0
598   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
599   ret <4 x double> %shuffle
600 }
601
602 define <4 x double> @insert_mem_and_zero_v4f64(double* %ptr) {
603 ; ALL-LABEL: @insert_mem_and_zero_v4f64
604 ; ALL:       # BB#0:
605 ; ALL-NEXT:    vmovsd (%rdi), %xmm0
606 ; ALL-NEXT:    vxorpd %ymm1, %ymm1, %ymm1
607 ; ALL-NEXT:    vblendpd {{.*}} # ymm0 = ymm0[0],ymm1[1,2,3]
608 ; ALL-NEXT:    retq
609   %a = load double* %ptr
610   %v = insertelement <4 x double> undef, double %a, i32 0
611   %shuffle = shufflevector <4 x double> %v, <4 x double> zeroinitializer, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
612   ret <4 x double> %shuffle
613 }