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