[x86] Rework all of the 128-bit vector shuffle tests with my handy test
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-128-v2.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx -x86-experimental-vector-shuffle-lowering | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6
7 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
8 target triple = "x86_64-unknown-unknown"
9
10 define <2 x i64> @shuffle_v2i64_00(<2 x i64> %a, <2 x i64> %b) {
11 ; SSE-LABEL: shuffle_v2i64_00:
12 ; SSE:       # BB#0:
13 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
14 ; SSE-NEXT:    retq
15 ;
16 ; AVX-LABEL: shuffle_v2i64_00:
17 ; AVX:       # BB#0:
18 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
19 ; AVX-NEXT:    retq
20   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0>
21   ret <2 x i64> %shuffle
22 }
23 define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) {
24 ; SSE-LABEL: shuffle_v2i64_10:
25 ; SSE:       # BB#0:
26 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
27 ; SSE-NEXT:    retq
28 ;
29 ; AVX-LABEL: shuffle_v2i64_10:
30 ; AVX:       # BB#0:
31 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
32 ; AVX-NEXT:    retq
33   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0>
34   ret <2 x i64> %shuffle
35 }
36 define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) {
37 ; SSE-LABEL: shuffle_v2i64_11:
38 ; SSE:       # BB#0:
39 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
40 ; SSE-NEXT:    retq
41 ;
42 ; AVX-LABEL: shuffle_v2i64_11:
43 ; AVX:       # BB#0:
44 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
45 ; AVX-NEXT:    retq
46   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1>
47   ret <2 x i64> %shuffle
48 }
49 define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) {
50 ; SSE-LABEL: shuffle_v2i64_22:
51 ; SSE:       # BB#0:
52 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
53 ; SSE-NEXT:    retq
54 ;
55 ; AVX-LABEL: shuffle_v2i64_22:
56 ; AVX:       # BB#0:
57 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
58 ; AVX-NEXT:    retq
59   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2>
60   ret <2 x i64> %shuffle
61 }
62 define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) {
63 ; SSE-LABEL: shuffle_v2i64_32:
64 ; SSE:       # BB#0:
65 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
66 ; SSE-NEXT:    retq
67 ;
68 ; AVX-LABEL: shuffle_v2i64_32:
69 ; AVX:       # BB#0:
70 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
71 ; AVX-NEXT:    retq
72   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2>
73   ret <2 x i64> %shuffle
74 }
75 define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) {
76 ; SSE-LABEL: shuffle_v2i64_33:
77 ; SSE:       # BB#0:
78 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
79 ; SSE-NEXT:    retq
80 ;
81 ; AVX-LABEL: shuffle_v2i64_33:
82 ; AVX:       # BB#0:
83 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
84 ; AVX-NEXT:    retq
85   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3>
86   ret <2 x i64> %shuffle
87 }
88
89 define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) {
90 ; SSE2-LABEL: shuffle_v2f64_00:
91 ; SSE2:       # BB#0:
92 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
93 ; SSE2-NEXT:    retq
94 ;
95 ; SSE3-LABEL: shuffle_v2f64_00:
96 ; SSE3:       # BB#0:
97 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
98 ; SSE3-NEXT:    retq
99 ;
100 ; SSSE3-LABEL: shuffle_v2f64_00:
101 ; SSSE3:       # BB#0:
102 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
103 ; SSSE3-NEXT:    retq
104 ;
105 ; SSE41-LABEL: shuffle_v2f64_00:
106 ; SSE41:       # BB#0:
107 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
108 ; SSE41-NEXT:    retq
109 ;
110 ; AVX-LABEL: shuffle_v2f64_00:
111 ; AVX:       # BB#0:
112 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
113 ; AVX-NEXT:    retq
114   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
115   ret <2 x double> %shuffle
116 }
117 define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) {
118 ; SSE-LABEL: shuffle_v2f64_10:
119 ; SSE:       # BB#0:
120 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
121 ; SSE-NEXT:    retq
122 ;
123 ; AVX-LABEL: shuffle_v2f64_10:
124 ; AVX:       # BB#0:
125 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
126 ; AVX-NEXT:    retq
127   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0>
128   ret <2 x double> %shuffle
129 }
130 define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) {
131 ; SSE-LABEL: shuffle_v2f64_11:
132 ; SSE:       # BB#0:
133 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
134 ; SSE-NEXT:    retq
135 ;
136 ; AVX-LABEL: shuffle_v2f64_11:
137 ; AVX:       # BB#0:
138 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
139 ; AVX-NEXT:    retq
140   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1>
141   ret <2 x double> %shuffle
142 }
143 define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) {
144 ; SSE2-LABEL: shuffle_v2f64_22:
145 ; SSE2:       # BB#0:
146 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
147 ; SSE2-NEXT:    movaps %xmm1, %xmm0
148 ; SSE2-NEXT:    retq
149 ;
150 ; SSE3-LABEL: shuffle_v2f64_22:
151 ; SSE3:       # BB#0:
152 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
153 ; SSE3-NEXT:    movapd %xmm1, %xmm0
154 ; SSE3-NEXT:    retq
155 ;
156 ; SSSE3-LABEL: shuffle_v2f64_22:
157 ; SSSE3:       # BB#0:
158 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
159 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
160 ; SSSE3-NEXT:    retq
161 ;
162 ; SSE41-LABEL: shuffle_v2f64_22:
163 ; SSE41:       # BB#0:
164 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
165 ; SSE41-NEXT:    movapd %xmm1, %xmm0
166 ; SSE41-NEXT:    retq
167 ;
168 ; AVX-LABEL: shuffle_v2f64_22:
169 ; AVX:       # BB#0:
170 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0,0]
171 ; AVX-NEXT:    retq
172   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2>
173   ret <2 x double> %shuffle
174 }
175 define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) {
176 ; SSE-LABEL: shuffle_v2f64_32:
177 ; SSE:       # BB#0:
178 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
179 ; SSE-NEXT:    retq
180 ;
181 ; AVX-LABEL: shuffle_v2f64_32:
182 ; AVX:       # BB#0:
183 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]
184 ; AVX-NEXT:    retq
185   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2>
186   ret <2 x double> %shuffle
187 }
188 define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) {
189 ; SSE-LABEL: shuffle_v2f64_33:
190 ; SSE:       # BB#0:
191 ; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
192 ; SSE-NEXT:    movaps %xmm1, %xmm0
193 ; SSE-NEXT:    retq
194 ;
195 ; AVX-LABEL: shuffle_v2f64_33:
196 ; AVX:       # BB#0:
197 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm1[1,1]
198 ; AVX-NEXT:    retq
199   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3>
200   ret <2 x double> %shuffle
201 }
202 define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) {
203 ; SSE2-LABEL: shuffle_v2f64_03:
204 ; SSE2:       # BB#0:
205 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
206 ; SSE2-NEXT:    retq
207 ;
208 ; SSE3-LABEL: shuffle_v2f64_03:
209 ; SSE3:       # BB#0:
210 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
211 ; SSE3-NEXT:    retq
212 ;
213 ; SSSE3-LABEL: shuffle_v2f64_03:
214 ; SSSE3:       # BB#0:
215 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
216 ; SSSE3-NEXT:    retq
217 ;
218 ; SSE41-LABEL: shuffle_v2f64_03:
219 ; SSE41:       # BB#0:
220 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
221 ; SSE41-NEXT:    retq
222 ;
223 ; AVX-LABEL: shuffle_v2f64_03:
224 ; AVX:       # BB#0:
225 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
226 ; AVX-NEXT:    retq
227   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
228   ret <2 x double> %shuffle
229 }
230 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
231 ; SSE2-LABEL: shuffle_v2f64_21:
232 ; SSE2:       # BB#0:
233 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
234 ; SSE2-NEXT:    movapd %xmm1, %xmm0
235 ; SSE2-NEXT:    retq
236 ;
237 ; SSE3-LABEL: shuffle_v2f64_21:
238 ; SSE3:       # BB#0:
239 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
240 ; SSE3-NEXT:    movapd %xmm1, %xmm0
241 ; SSE3-NEXT:    retq
242 ;
243 ; SSSE3-LABEL: shuffle_v2f64_21:
244 ; SSSE3:       # BB#0:
245 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
246 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
247 ; SSSE3-NEXT:    retq
248 ;
249 ; SSE41-LABEL: shuffle_v2f64_21:
250 ; SSE41:       # BB#0:
251 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
252 ; SSE41-NEXT:    movapd %xmm1, %xmm0
253 ; SSE41-NEXT:    retq
254 ;
255 ; AVX-LABEL: shuffle_v2f64_21:
256 ; AVX:       # BB#0:
257 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
258 ; AVX-NEXT:    retq
259   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>
260   ret <2 x double> %shuffle
261 }
262
263
264 define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {
265 ; SSE-LABEL: shuffle_v2i64_02:
266 ; SSE:       # BB#0:
267 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
268 ; SSE-NEXT:    retq
269 ;
270 ; AVX-LABEL: shuffle_v2i64_02:
271 ; AVX:       # BB#0:
272 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
273 ; AVX-NEXT:    retq
274   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
275   ret <2 x i64> %shuffle
276 }
277 define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
278 ; SSE-LABEL: shuffle_v2i64_02_copy:
279 ; SSE:       # BB#0:
280 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
281 ; SSE-NEXT:    movdqa %xmm1, %xmm0
282 ; SSE-NEXT:    retq
283 ;
284 ; AVX-LABEL: shuffle_v2i64_02_copy:
285 ; AVX:       # BB#0:
286 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm2[0]
287 ; AVX-NEXT:    retq
288   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
289   ret <2 x i64> %shuffle
290 }
291 define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {
292 ; SSE2-LABEL: shuffle_v2i64_03:
293 ; SSE2:       # BB#0:
294 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
295 ; SSE2-NEXT:    retq
296 ;
297 ; SSE3-LABEL: shuffle_v2i64_03:
298 ; SSE3:       # BB#0:
299 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
300 ; SSE3-NEXT:    retq
301 ;
302 ; SSSE3-LABEL: shuffle_v2i64_03:
303 ; SSSE3:       # BB#0:
304 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
305 ; SSSE3-NEXT:    retq
306 ;
307 ; SSE41-LABEL: shuffle_v2i64_03:
308 ; SSE41:       # BB#0:
309 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
310 ; SSE41-NEXT:    retq
311 ;
312 ; AVX-LABEL: shuffle_v2i64_03:
313 ; AVX:       # BB#0:
314 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
315 ; AVX-NEXT:    retq
316   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
317   ret <2 x i64> %shuffle
318 }
319 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
320 ; SSE2-LABEL: shuffle_v2i64_03_copy:
321 ; SSE2:       # BB#0:
322 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
323 ; SSE2-NEXT:    movapd %xmm1, %xmm0
324 ; SSE2-NEXT:    retq
325 ;
326 ; SSE3-LABEL: shuffle_v2i64_03_copy:
327 ; SSE3:       # BB#0:
328 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
329 ; SSE3-NEXT:    movapd %xmm1, %xmm0
330 ; SSE3-NEXT:    retq
331 ;
332 ; SSSE3-LABEL: shuffle_v2i64_03_copy:
333 ; SSSE3:       # BB#0:
334 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
335 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
336 ; SSSE3-NEXT:    retq
337 ;
338 ; SSE41-LABEL: shuffle_v2i64_03_copy:
339 ; SSE41:       # BB#0:
340 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
341 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
342 ; SSE41-NEXT:    retq
343 ;
344 ; AVX-LABEL: shuffle_v2i64_03_copy:
345 ; AVX:       # BB#0:
346 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7]
347 ; AVX-NEXT:    retq
348   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
349   ret <2 x i64> %shuffle
350 }
351 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
352 ; SSE2-LABEL: shuffle_v2i64_12:
353 ; SSE2:       # BB#0:
354 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
355 ; SSE2-NEXT:    retq
356 ;
357 ; SSE3-LABEL: shuffle_v2i64_12:
358 ; SSE3:       # BB#0:
359 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
360 ; SSE3-NEXT:    retq
361 ;
362 ; SSSE3-LABEL: shuffle_v2i64_12:
363 ; SSSE3:       # BB#0:
364 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
365 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
366 ; SSSE3-NEXT:    retq
367 ;
368 ; SSE41-LABEL: shuffle_v2i64_12:
369 ; SSE41:       # BB#0:
370 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
371 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
372 ; SSE41-NEXT:    retq
373 ;
374 ; AVX-LABEL: shuffle_v2i64_12:
375 ; AVX:       # BB#0:
376 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
377 ; AVX-NEXT:    retq
378   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
379   ret <2 x i64> %shuffle
380 }
381 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
382 ; SSE2-LABEL: shuffle_v2i64_12_copy:
383 ; SSE2:       # BB#0:
384 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
385 ; SSE2-NEXT:    movapd %xmm1, %xmm0
386 ; SSE2-NEXT:    retq
387 ;
388 ; SSE3-LABEL: shuffle_v2i64_12_copy:
389 ; SSE3:       # BB#0:
390 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
391 ; SSE3-NEXT:    movapd %xmm1, %xmm0
392 ; SSE3-NEXT:    retq
393 ;
394 ; SSSE3-LABEL: shuffle_v2i64_12_copy:
395 ; SSSE3:       # BB#0:
396 ; SSSE3-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
397 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
398 ; SSSE3-NEXT:    retq
399 ;
400 ; SSE41-LABEL: shuffle_v2i64_12_copy:
401 ; SSE41:       # BB#0:
402 ; SSE41-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
403 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
404 ; SSE41-NEXT:    retq
405 ;
406 ; AVX-LABEL: shuffle_v2i64_12_copy:
407 ; AVX:       # BB#0:
408 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
409 ; AVX-NEXT:    retq
410   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
411   ret <2 x i64> %shuffle
412 }
413 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
414 ; SSE-LABEL: shuffle_v2i64_13:
415 ; SSE:       # BB#0:
416 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
417 ; SSE-NEXT:    retq
418 ;
419 ; AVX-LABEL: shuffle_v2i64_13:
420 ; AVX:       # BB#0:
421 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
422 ; AVX-NEXT:    retq
423   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
424   ret <2 x i64> %shuffle
425 }
426 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
427 ; SSE-LABEL: shuffle_v2i64_13_copy:
428 ; SSE:       # BB#0:
429 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1]
430 ; SSE-NEXT:    movdqa %xmm1, %xmm0
431 ; SSE-NEXT:    retq
432 ;
433 ; AVX-LABEL: shuffle_v2i64_13_copy:
434 ; AVX:       # BB#0:
435 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1]
436 ; AVX-NEXT:    retq
437   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
438   ret <2 x i64> %shuffle
439 }
440 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
441 ; SSE-LABEL: shuffle_v2i64_20:
442 ; SSE:       # BB#0:
443 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
444 ; SSE-NEXT:    movdqa %xmm1, %xmm0
445 ; SSE-NEXT:    retq
446 ;
447 ; AVX-LABEL: shuffle_v2i64_20:
448 ; AVX:       # BB#0:
449 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
450 ; AVX-NEXT:    retq
451   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
452   ret <2 x i64> %shuffle
453 }
454 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
455 ; SSE-LABEL: shuffle_v2i64_20_copy:
456 ; SSE:       # BB#0:
457 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
458 ; SSE-NEXT:    movdqa %xmm2, %xmm0
459 ; SSE-NEXT:    retq
460 ;
461 ; AVX-LABEL: shuffle_v2i64_20_copy:
462 ; AVX:       # BB#0:
463 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0]
464 ; AVX-NEXT:    retq
465   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
466   ret <2 x i64> %shuffle
467 }
468 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
469 ; SSE2-LABEL: shuffle_v2i64_21:
470 ; SSE2:       # BB#0:
471 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
472 ; SSE2-NEXT:    movapd %xmm1, %xmm0
473 ; SSE2-NEXT:    retq
474 ;
475 ; SSE3-LABEL: shuffle_v2i64_21:
476 ; SSE3:       # BB#0:
477 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
478 ; SSE3-NEXT:    movapd %xmm1, %xmm0
479 ; SSE3-NEXT:    retq
480 ;
481 ; SSSE3-LABEL: shuffle_v2i64_21:
482 ; SSSE3:       # BB#0:
483 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
484 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
485 ; SSSE3-NEXT:    retq
486 ;
487 ; SSE41-LABEL: shuffle_v2i64_21:
488 ; SSE41:       # BB#0:
489 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
490 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
491 ; SSE41-NEXT:    retq
492 ;
493 ; AVX-LABEL: shuffle_v2i64_21:
494 ; AVX:       # BB#0:
495 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
496 ; AVX-NEXT:    retq
497   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
498   ret <2 x i64> %shuffle
499 }
500 define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
501 ; SSE2-LABEL: shuffle_v2i64_21_copy:
502 ; SSE2:       # BB#0:
503 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
504 ; SSE2-NEXT:    movapd %xmm2, %xmm0
505 ; SSE2-NEXT:    retq
506 ;
507 ; SSE3-LABEL: shuffle_v2i64_21_copy:
508 ; SSE3:       # BB#0:
509 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
510 ; SSE3-NEXT:    movapd %xmm2, %xmm0
511 ; SSE3-NEXT:    retq
512 ;
513 ; SSSE3-LABEL: shuffle_v2i64_21_copy:
514 ; SSSE3:       # BB#0:
515 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
516 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
517 ; SSSE3-NEXT:    retq
518 ;
519 ; SSE41-LABEL: shuffle_v2i64_21_copy:
520 ; SSE41:       # BB#0:
521 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
522 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
523 ; SSE41-NEXT:    retq
524 ;
525 ; AVX-LABEL: shuffle_v2i64_21_copy:
526 ; AVX:       # BB#0:
527 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm1[4,5,6,7]
528 ; AVX-NEXT:    retq
529   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
530   ret <2 x i64> %shuffle
531 }
532 define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {
533 ; SSE2-LABEL: shuffle_v2i64_30:
534 ; SSE2:       # BB#0:
535 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
536 ; SSE2-NEXT:    movapd %xmm1, %xmm0
537 ; SSE2-NEXT:    retq
538 ;
539 ; SSE3-LABEL: shuffle_v2i64_30:
540 ; SSE3:       # BB#0:
541 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
542 ; SSE3-NEXT:    movapd %xmm1, %xmm0
543 ; SSE3-NEXT:    retq
544 ;
545 ; SSSE3-LABEL: shuffle_v2i64_30:
546 ; SSSE3:       # BB#0:
547 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
548 ; SSSE3-NEXT:    retq
549 ;
550 ; SSE41-LABEL: shuffle_v2i64_30:
551 ; SSE41:       # BB#0:
552 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
553 ; SSE41-NEXT:    retq
554 ;
555 ; AVX-LABEL: shuffle_v2i64_30:
556 ; AVX:       # BB#0:
557 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
558 ; AVX-NEXT:    retq
559   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
560   ret <2 x i64> %shuffle
561 }
562 define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
563 ; SSE2-LABEL: shuffle_v2i64_30_copy:
564 ; SSE2:       # BB#0:
565 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
566 ; SSE2-NEXT:    movapd %xmm2, %xmm0
567 ; SSE2-NEXT:    retq
568 ;
569 ; SSE3-LABEL: shuffle_v2i64_30_copy:
570 ; SSE3:       # BB#0:
571 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
572 ; SSE3-NEXT:    movapd %xmm2, %xmm0
573 ; SSE3-NEXT:    retq
574 ;
575 ; SSSE3-LABEL: shuffle_v2i64_30_copy:
576 ; SSSE3:       # BB#0:
577 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
578 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
579 ; SSSE3-NEXT:    retq
580 ;
581 ; SSE41-LABEL: shuffle_v2i64_30_copy:
582 ; SSE41:       # BB#0:
583 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
584 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
585 ; SSE41-NEXT:    retq
586 ;
587 ; AVX-LABEL: shuffle_v2i64_30_copy:
588 ; AVX:       # BB#0:
589 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
590 ; AVX-NEXT:    retq
591   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
592   ret <2 x i64> %shuffle
593 }
594 define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {
595 ; SSE-LABEL: shuffle_v2i64_31:
596 ; SSE:       # BB#0:
597 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
598 ; SSE-NEXT:    movdqa %xmm1, %xmm0
599 ; SSE-NEXT:    retq
600 ;
601 ; AVX-LABEL: shuffle_v2i64_31:
602 ; AVX:       # BB#0:
603 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
604 ; AVX-NEXT:    retq
605   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
606   ret <2 x i64> %shuffle
607 }
608 define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
609 ; SSE-LABEL: shuffle_v2i64_31_copy:
610 ; SSE:       # BB#0:
611 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]
612 ; SSE-NEXT:    movdqa %xmm2, %xmm0
613 ; SSE-NEXT:    retq
614 ;
615 ; AVX-LABEL: shuffle_v2i64_31_copy:
616 ; AVX:       # BB#0:
617 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm2[1],xmm1[1]
618 ; AVX-NEXT:    retq
619   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
620   ret <2 x i64> %shuffle
621 }
622
623
624 define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {
625 ; SSE-LABEL: insert_reg_and_zero_v2i64:
626 ; SSE:       # BB#0:
627 ; SSE-NEXT:    movd %rdi, %xmm0
628 ; SSE-NEXT:    retq
629 ;
630 ; AVX-LABEL: insert_reg_and_zero_v2i64:
631 ; AVX:       # BB#0:
632 ; AVX-NEXT:    vmovq %rdi, %xmm0
633 ; AVX-NEXT:    retq
634   %v = insertelement <2 x i64> undef, i64 %a, i32 0
635   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
636   ret <2 x i64> %shuffle
637 }
638
639 define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) {
640 ; SSE-LABEL: insert_mem_and_zero_v2i64:
641 ; SSE:       # BB#0:
642 ; SSE-NEXT:    movq (%rdi), %xmm0
643 ; SSE-NEXT:    retq
644 ;
645 ; AVX-LABEL: insert_mem_and_zero_v2i64:
646 ; AVX:       # BB#0:
647 ; AVX-NEXT:    vmovq (%rdi), %xmm0
648 ; AVX-NEXT:    retq
649   %a = load i64* %ptr
650   %v = insertelement <2 x i64> undef, i64 %a, i32 0
651   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
652   ret <2 x i64> %shuffle
653 }
654
655 define <2 x double> @insert_reg_and_zero_v2f64(double %a) {
656 ; SSE-LABEL: insert_reg_and_zero_v2f64:
657 ; SSE:       # BB#0:
658 ; SSE-NEXT:    movq %xmm0, %xmm0
659 ; SSE-NEXT:    retq
660 ;
661 ; AVX-LABEL: insert_reg_and_zero_v2f64:
662 ; AVX:       # BB#0:
663 ; AVX-NEXT:    vmovq %xmm0, %xmm0
664 ; AVX-NEXT:    retq
665   %v = insertelement <2 x double> undef, double %a, i32 0
666   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
667   ret <2 x double> %shuffle
668 }
669
670 define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) {
671 ; SSE-LABEL: insert_mem_and_zero_v2f64:
672 ; SSE:       # BB#0:
673 ; SSE-NEXT:    movsd (%rdi), %xmm0
674 ; SSE-NEXT:    retq
675 ;
676 ; AVX-LABEL: insert_mem_and_zero_v2f64:
677 ; AVX:       # BB#0:
678 ; AVX-NEXT:    vmovsd (%rdi), %xmm0
679 ; AVX-NEXT:    retq
680   %a = load double* %ptr
681   %v = insertelement <2 x double> undef, double %a, i32 0
682   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
683   ret <2 x double> %shuffle
684 }
685
686 define <2 x double> @insert_dup_reg_v2f64(double %a) {
687 ; FIXME: We should match movddup for SSE3 and higher here.
688 ;
689 ; SSE2-LABEL: insert_dup_reg_v2f64:
690 ; SSE2:       # BB#0:
691 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
692 ; SSE2-NEXT:    retq
693 ;
694 ; SSE3-LABEL: insert_dup_reg_v2f64:
695 ; SSE3:       # BB#0:
696 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
697 ; SSE3-NEXT:    retq
698 ;
699 ; SSSE3-LABEL: insert_dup_reg_v2f64:
700 ; SSSE3:       # BB#0:
701 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
702 ; SSSE3-NEXT:    retq
703 ;
704 ; SSE41-LABEL: insert_dup_reg_v2f64:
705 ; SSE41:       # BB#0:
706 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
707 ; SSE41-NEXT:    retq
708 ;
709 ; AVX-LABEL: insert_dup_reg_v2f64:
710 ; AVX:       # BB#0:
711 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
712 ; AVX-NEXT:    retq
713   %v = insertelement <2 x double> undef, double %a, i32 0
714   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
715   ret <2 x double> %shuffle
716 }
717 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
718 ; SSE2-LABEL: insert_dup_mem_v2f64:
719 ; SSE2:       # BB#0:
720 ; SSE2-NEXT:    movsd (%rdi), %xmm0
721 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
722 ; SSE2-NEXT:    retq
723 ;
724 ; SSE3-LABEL: insert_dup_mem_v2f64:
725 ; SSE3:       # BB#0:
726 ; SSE3-NEXT:    movddup (%rdi), %xmm0
727 ; SSE3-NEXT:    retq
728 ;
729 ; SSSE3-LABEL: insert_dup_mem_v2f64:
730 ; SSSE3:       # BB#0:
731 ; SSSE3-NEXT:    movddup (%rdi), %xmm0
732 ; SSSE3-NEXT:    retq
733 ;
734 ; SSE41-LABEL: insert_dup_mem_v2f64:
735 ; SSE41:       # BB#0:
736 ; SSE41-NEXT:    movddup (%rdi), %xmm0
737 ; SSE41-NEXT:    retq
738 ;
739 ; AVX-LABEL: insert_dup_mem_v2f64:
740 ; AVX:       # BB#0:
741 ; AVX-NEXT:    vmovddup (%rdi), %xmm0
742 ; AVX-NEXT:    retq
743   %a = load double* %ptr
744   %v = insertelement <2 x double> undef, double %a, i32 0
745   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
746   ret <2 x double> %shuffle
747 }
748
749 define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) {
750 ; SSE-LABEL: shuffle_mem_v2f64_10:
751 ; SSE:       # BB#0:
752 ; SSE-NEXT:    movapd (%rdi), %xmm0
753 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
754 ; SSE-NEXT:    retq
755 ;
756 ; AVX-LABEL: shuffle_mem_v2f64_10:
757 ; AVX:       # BB#0:
758 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = mem[1,0]
759 ; AVX-NEXT:    retq
760   %a = load <2 x double>* %ptr
761   %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0>
762   ret <2 x double> %shuffle
763 }