[x86] Teach the new vector shuffle lowering how to lower 128-bit
[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 ; AVX1-LABEL: shuffle_v2i64_00:
18 ; AVX1:       # BB#0:
19 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
20 ; AVX1-NEXT:    retq
21 ;
22 ; AVX2-LABEL: shuffle_v2i64_00:
23 ; AVX2:       # BB#0:
24 ; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
25 ; AVX2-NEXT:    retq
26   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0>
27   ret <2 x i64> %shuffle
28 }
29 define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) {
30 ; SSE-LABEL: shuffle_v2i64_10:
31 ; SSE:       # BB#0:
32 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
33 ; SSE-NEXT:    retq
34 ;
35 ; AVX-LABEL: shuffle_v2i64_10:
36 ; AVX:       # BB#0:
37 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
38 ; AVX-NEXT:    retq
39   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0>
40   ret <2 x i64> %shuffle
41 }
42 define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) {
43 ; SSE-LABEL: shuffle_v2i64_11:
44 ; SSE:       # BB#0:
45 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
46 ; SSE-NEXT:    retq
47 ;
48 ; AVX-LABEL: shuffle_v2i64_11:
49 ; AVX:       # BB#0:
50 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
51 ; AVX-NEXT:    retq
52   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1>
53   ret <2 x i64> %shuffle
54 }
55 define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) {
56 ; SSE-LABEL: shuffle_v2i64_22:
57 ; SSE:       # BB#0:
58 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
59 ; SSE-NEXT:    retq
60 ;
61 ; AVX1-LABEL: shuffle_v2i64_22:
62 ; AVX1:       # BB#0:
63 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]
64 ; AVX1-NEXT:    retq
65 ;
66 ; AVX2-LABEL: shuffle_v2i64_22:
67 ; AVX2:       # BB#0:
68 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm0
69 ; AVX2-NEXT:    retq
70   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2>
71   ret <2 x i64> %shuffle
72 }
73 define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) {
74 ; SSE-LABEL: shuffle_v2i64_32:
75 ; SSE:       # BB#0:
76 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
77 ; SSE-NEXT:    retq
78 ;
79 ; AVX-LABEL: shuffle_v2i64_32:
80 ; AVX:       # BB#0:
81 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
82 ; AVX-NEXT:    retq
83   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2>
84   ret <2 x i64> %shuffle
85 }
86 define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) {
87 ; SSE-LABEL: shuffle_v2i64_33:
88 ; SSE:       # BB#0:
89 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
90 ; SSE-NEXT:    retq
91 ;
92 ; AVX-LABEL: shuffle_v2i64_33:
93 ; AVX:       # BB#0:
94 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
95 ; AVX-NEXT:    retq
96   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3>
97   ret <2 x i64> %shuffle
98 }
99
100 define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) {
101 ; SSE2-LABEL: shuffle_v2f64_00:
102 ; SSE2:       # BB#0:
103 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
104 ; SSE2-NEXT:    retq
105 ;
106 ; SSE3-LABEL: shuffle_v2f64_00:
107 ; SSE3:       # BB#0:
108 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
109 ; SSE3-NEXT:    retq
110 ;
111 ; SSSE3-LABEL: shuffle_v2f64_00:
112 ; SSSE3:       # BB#0:
113 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
114 ; SSSE3-NEXT:    retq
115 ;
116 ; SSE41-LABEL: shuffle_v2f64_00:
117 ; SSE41:       # BB#0:
118 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
119 ; SSE41-NEXT:    retq
120 ;
121 ; AVX-LABEL: shuffle_v2f64_00:
122 ; AVX:       # BB#0:
123 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
124 ; AVX-NEXT:    retq
125   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>
126   ret <2 x double> %shuffle
127 }
128 define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) {
129 ; SSE-LABEL: shuffle_v2f64_10:
130 ; SSE:       # BB#0:
131 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
132 ; SSE-NEXT:    retq
133 ;
134 ; AVX-LABEL: shuffle_v2f64_10:
135 ; AVX:       # BB#0:
136 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
137 ; AVX-NEXT:    retq
138   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0>
139   ret <2 x double> %shuffle
140 }
141 define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) {
142 ; SSE-LABEL: shuffle_v2f64_11:
143 ; SSE:       # BB#0:
144 ; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
145 ; SSE-NEXT:    retq
146 ;
147 ; AVX-LABEL: shuffle_v2f64_11:
148 ; AVX:       # BB#0:
149 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm0[1,1]
150 ; AVX-NEXT:    retq
151   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1>
152   ret <2 x double> %shuffle
153 }
154 define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) {
155 ; SSE2-LABEL: shuffle_v2f64_22:
156 ; SSE2:       # BB#0:
157 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
158 ; SSE2-NEXT:    movaps %xmm1, %xmm0
159 ; SSE2-NEXT:    retq
160 ;
161 ; SSE3-LABEL: shuffle_v2f64_22:
162 ; SSE3:       # BB#0:
163 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
164 ; SSE3-NEXT:    movapd %xmm1, %xmm0
165 ; SSE3-NEXT:    retq
166 ;
167 ; SSSE3-LABEL: shuffle_v2f64_22:
168 ; SSSE3:       # BB#0:
169 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
170 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
171 ; SSSE3-NEXT:    retq
172 ;
173 ; SSE41-LABEL: shuffle_v2f64_22:
174 ; SSE41:       # BB#0:
175 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0,0]
176 ; SSE41-NEXT:    movapd %xmm1, %xmm0
177 ; SSE41-NEXT:    retq
178 ;
179 ; AVX-LABEL: shuffle_v2f64_22:
180 ; AVX:       # BB#0:
181 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0,0]
182 ; AVX-NEXT:    retq
183   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2>
184   ret <2 x double> %shuffle
185 }
186 define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) {
187 ; SSE-LABEL: shuffle_v2f64_32:
188 ; SSE:       # BB#0:
189 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
190 ; SSE-NEXT:    retq
191 ;
192 ; AVX-LABEL: shuffle_v2f64_32:
193 ; AVX:       # BB#0:
194 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm1[1,0]
195 ; AVX-NEXT:    retq
196   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2>
197   ret <2 x double> %shuffle
198 }
199 define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) {
200 ; SSE-LABEL: shuffle_v2f64_33:
201 ; SSE:       # BB#0:
202 ; SSE-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
203 ; SSE-NEXT:    movaps %xmm1, %xmm0
204 ; SSE-NEXT:    retq
205 ;
206 ; AVX-LABEL: shuffle_v2f64_33:
207 ; AVX:       # BB#0:
208 ; AVX-NEXT:    vmovhlps {{.*#+}} xmm0 = xmm1[1,1]
209 ; AVX-NEXT:    retq
210   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3>
211   ret <2 x double> %shuffle
212 }
213 define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) {
214 ; SSE2-LABEL: shuffle_v2f64_03:
215 ; SSE2:       # BB#0:
216 ; SSE2-NEXT:    movsd %xmm0, %xmm1
217 ; SSE2-NEXT:    movaps %xmm1, %xmm0
218 ; SSE2-NEXT:    retq
219 ;
220 ; SSE3-LABEL: shuffle_v2f64_03:
221 ; SSE3:       # BB#0:
222 ; SSE3-NEXT:    movsd %xmm0, %xmm1
223 ; SSE3-NEXT:    movaps %xmm1, %xmm0
224 ; SSE3-NEXT:    retq
225 ;
226 ; SSSE3-LABEL: shuffle_v2f64_03:
227 ; SSSE3:       # BB#0:
228 ; SSSE3-NEXT:    movsd %xmm0, %xmm1
229 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
230 ; SSSE3-NEXT:    retq
231 ;
232 ; SSE41-LABEL: shuffle_v2f64_03:
233 ; SSE41:       # BB#0:
234 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
235 ; SSE41-NEXT:    retq
236 ;
237 ; AVX-LABEL: shuffle_v2f64_03:
238 ; AVX:       # BB#0:
239 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
240 ; AVX-NEXT:    retq
241   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
242   ret <2 x double> %shuffle
243 }
244 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
245 ; SSE2-LABEL: shuffle_v2f64_21:
246 ; SSE2:       # BB#0:
247 ; SSE2-NEXT:    movsd %xmm1, %xmm0
248 ; SSE2-NEXT:    retq
249 ;
250 ; SSE3-LABEL: shuffle_v2f64_21:
251 ; SSE3:       # BB#0:
252 ; SSE3-NEXT:    movsd %xmm1, %xmm0
253 ; SSE3-NEXT:    retq
254 ;
255 ; SSSE3-LABEL: shuffle_v2f64_21:
256 ; SSSE3:       # BB#0:
257 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
258 ; SSSE3-NEXT:    retq
259 ;
260 ; SSE41-LABEL: shuffle_v2f64_21:
261 ; SSE41:       # BB#0:
262 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
263 ; SSE41-NEXT:    movapd %xmm1, %xmm0
264 ; SSE41-NEXT:    retq
265 ;
266 ; AVX-LABEL: shuffle_v2f64_21:
267 ; AVX:       # BB#0:
268 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
269 ; AVX-NEXT:    retq
270   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>
271   ret <2 x double> %shuffle
272 }
273
274
275 define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {
276 ; SSE-LABEL: shuffle_v2i64_02:
277 ; SSE:       # BB#0:
278 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
279 ; SSE-NEXT:    retq
280 ;
281 ; AVX-LABEL: shuffle_v2i64_02:
282 ; AVX:       # BB#0:
283 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
284 ; AVX-NEXT:    retq
285   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
286   ret <2 x i64> %shuffle
287 }
288 define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
289 ; SSE-LABEL: shuffle_v2i64_02_copy:
290 ; SSE:       # BB#0:
291 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
292 ; SSE-NEXT:    movdqa %xmm1, %xmm0
293 ; SSE-NEXT:    retq
294 ;
295 ; AVX-LABEL: shuffle_v2i64_02_copy:
296 ; AVX:       # BB#0:
297 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm2[0]
298 ; AVX-NEXT:    retq
299   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
300   ret <2 x i64> %shuffle
301 }
302 define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {
303 ; SSE2-LABEL: shuffle_v2i64_03:
304 ; SSE2:       # BB#0:
305 ; SSE2-NEXT:    movsd %xmm0, %xmm1
306 ; SSE2-NEXT:    movaps %xmm1, %xmm0
307 ; SSE2-NEXT:    retq
308 ;
309 ; SSE3-LABEL: shuffle_v2i64_03:
310 ; SSE3:       # BB#0:
311 ; SSE3-NEXT:    movsd %xmm0, %xmm1
312 ; SSE3-NEXT:    movaps %xmm1, %xmm0
313 ; SSE3-NEXT:    retq
314 ;
315 ; SSSE3-LABEL: shuffle_v2i64_03:
316 ; SSSE3:       # BB#0:
317 ; SSSE3-NEXT:    movsd %xmm0, %xmm1
318 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
319 ; SSSE3-NEXT:    retq
320 ;
321 ; SSE41-LABEL: shuffle_v2i64_03:
322 ; SSE41:       # BB#0:
323 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
324 ; SSE41-NEXT:    retq
325 ;
326 ; AVX1-LABEL: shuffle_v2i64_03:
327 ; AVX1:       # BB#0:
328 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
329 ; AVX1-NEXT:    retq
330 ;
331 ; AVX2-LABEL: shuffle_v2i64_03:
332 ; AVX2:       # BB#0:
333 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
334 ; AVX2-NEXT:    retq
335   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
336   ret <2 x i64> %shuffle
337 }
338 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
339 ; SSE2-LABEL: shuffle_v2i64_03_copy:
340 ; SSE2:       # BB#0:
341 ; SSE2-NEXT:    movsd %xmm1, %xmm2
342 ; SSE2-NEXT:    movaps %xmm2, %xmm0
343 ; SSE2-NEXT:    retq
344 ;
345 ; SSE3-LABEL: shuffle_v2i64_03_copy:
346 ; SSE3:       # BB#0:
347 ; SSE3-NEXT:    movsd %xmm1, %xmm2
348 ; SSE3-NEXT:    movaps %xmm2, %xmm0
349 ; SSE3-NEXT:    retq
350 ;
351 ; SSSE3-LABEL: shuffle_v2i64_03_copy:
352 ; SSSE3:       # BB#0:
353 ; SSSE3-NEXT:    movsd %xmm1, %xmm2
354 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
355 ; SSSE3-NEXT:    retq
356 ;
357 ; SSE41-LABEL: shuffle_v2i64_03_copy:
358 ; SSE41:       # BB#0:
359 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
360 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
361 ; SSE41-NEXT:    retq
362 ;
363 ; AVX1-LABEL: shuffle_v2i64_03_copy:
364 ; AVX1:       # BB#0:
365 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7]
366 ; AVX1-NEXT:    retq
367 ;
368 ; AVX2-LABEL: shuffle_v2i64_03_copy:
369 ; AVX2:       # BB#0:
370 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3]
371 ; AVX2-NEXT:    retq
372   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
373   ret <2 x i64> %shuffle
374 }
375 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
376 ; SSE2-LABEL: shuffle_v2i64_12:
377 ; SSE2:       # BB#0:
378 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
379 ; SSE2-NEXT:    retq
380 ;
381 ; SSE3-LABEL: shuffle_v2i64_12:
382 ; SSE3:       # BB#0:
383 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
384 ; SSE3-NEXT:    retq
385 ;
386 ; SSSE3-LABEL: shuffle_v2i64_12:
387 ; SSSE3:       # BB#0:
388 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
389 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
390 ; SSSE3-NEXT:    retq
391 ;
392 ; SSE41-LABEL: shuffle_v2i64_12:
393 ; SSE41:       # BB#0:
394 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
395 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
396 ; SSE41-NEXT:    retq
397 ;
398 ; AVX-LABEL: shuffle_v2i64_12:
399 ; AVX:       # BB#0:
400 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
401 ; AVX-NEXT:    retq
402   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
403   ret <2 x i64> %shuffle
404 }
405 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
406 ; SSE2-LABEL: shuffle_v2i64_12_copy:
407 ; SSE2:       # BB#0:
408 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
409 ; SSE2-NEXT:    movapd %xmm1, %xmm0
410 ; SSE2-NEXT:    retq
411 ;
412 ; SSE3-LABEL: shuffle_v2i64_12_copy:
413 ; SSE3:       # BB#0:
414 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
415 ; SSE3-NEXT:    movapd %xmm1, %xmm0
416 ; SSE3-NEXT:    retq
417 ;
418 ; SSSE3-LABEL: shuffle_v2i64_12_copy:
419 ; SSSE3:       # BB#0:
420 ; SSSE3-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
421 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
422 ; SSSE3-NEXT:    retq
423 ;
424 ; SSE41-LABEL: shuffle_v2i64_12_copy:
425 ; SSE41:       # BB#0:
426 ; SSE41-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
427 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
428 ; SSE41-NEXT:    retq
429 ;
430 ; AVX-LABEL: shuffle_v2i64_12_copy:
431 ; AVX:       # BB#0:
432 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
433 ; AVX-NEXT:    retq
434   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
435   ret <2 x i64> %shuffle
436 }
437 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
438 ; SSE-LABEL: shuffle_v2i64_13:
439 ; SSE:       # BB#0:
440 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
441 ; SSE-NEXT:    retq
442 ;
443 ; AVX-LABEL: shuffle_v2i64_13:
444 ; AVX:       # BB#0:
445 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
446 ; AVX-NEXT:    retq
447   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
448   ret <2 x i64> %shuffle
449 }
450 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
451 ; SSE-LABEL: shuffle_v2i64_13_copy:
452 ; SSE:       # BB#0:
453 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1]
454 ; SSE-NEXT:    movdqa %xmm1, %xmm0
455 ; SSE-NEXT:    retq
456 ;
457 ; AVX-LABEL: shuffle_v2i64_13_copy:
458 ; AVX:       # BB#0:
459 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1]
460 ; AVX-NEXT:    retq
461   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
462   ret <2 x i64> %shuffle
463 }
464 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
465 ; SSE-LABEL: shuffle_v2i64_20:
466 ; SSE:       # BB#0:
467 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
468 ; SSE-NEXT:    movdqa %xmm1, %xmm0
469 ; SSE-NEXT:    retq
470 ;
471 ; AVX-LABEL: shuffle_v2i64_20:
472 ; AVX:       # BB#0:
473 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
474 ; AVX-NEXT:    retq
475   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
476   ret <2 x i64> %shuffle
477 }
478 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
479 ; SSE-LABEL: shuffle_v2i64_20_copy:
480 ; SSE:       # BB#0:
481 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
482 ; SSE-NEXT:    movdqa %xmm2, %xmm0
483 ; SSE-NEXT:    retq
484 ;
485 ; AVX-LABEL: shuffle_v2i64_20_copy:
486 ; AVX:       # BB#0:
487 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0]
488 ; AVX-NEXT:    retq
489   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
490   ret <2 x i64> %shuffle
491 }
492 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
493 ; SSE2-LABEL: shuffle_v2i64_21:
494 ; SSE2:       # BB#0:
495 ; SSE2-NEXT:    movsd %xmm1, %xmm0
496 ; SSE2-NEXT:    retq
497 ;
498 ; SSE3-LABEL: shuffle_v2i64_21:
499 ; SSE3:       # BB#0:
500 ; SSE3-NEXT:    movsd %xmm1, %xmm0
501 ; SSE3-NEXT:    retq
502 ;
503 ; SSSE3-LABEL: shuffle_v2i64_21:
504 ; SSSE3:       # BB#0:
505 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
506 ; SSSE3-NEXT:    retq
507 ;
508 ; SSE41-LABEL: shuffle_v2i64_21:
509 ; SSE41:       # BB#0:
510 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
511 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
512 ; SSE41-NEXT:    retq
513 ;
514 ; AVX1-LABEL: shuffle_v2i64_21:
515 ; AVX1:       # BB#0:
516 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
517 ; AVX1-NEXT:    retq
518 ;
519 ; AVX2-LABEL: shuffle_v2i64_21:
520 ; AVX2:       # BB#0:
521 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
522 ; AVX2-NEXT:    retq
523   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
524   ret <2 x i64> %shuffle
525 }
526 define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
527 ; SSE2-LABEL: shuffle_v2i64_21_copy:
528 ; SSE2:       # BB#0:
529 ; SSE2-NEXT:    movsd %xmm2, %xmm1
530 ; SSE2-NEXT:    movaps %xmm1, %xmm0
531 ; SSE2-NEXT:    retq
532 ;
533 ; SSE3-LABEL: shuffle_v2i64_21_copy:
534 ; SSE3:       # BB#0:
535 ; SSE3-NEXT:    movsd %xmm2, %xmm1
536 ; SSE3-NEXT:    movaps %xmm1, %xmm0
537 ; SSE3-NEXT:    retq
538 ;
539 ; SSSE3-LABEL: shuffle_v2i64_21_copy:
540 ; SSSE3:       # BB#0:
541 ; SSSE3-NEXT:    movsd %xmm2, %xmm1
542 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
543 ; SSSE3-NEXT:    retq
544 ;
545 ; SSE41-LABEL: shuffle_v2i64_21_copy:
546 ; SSE41:       # BB#0:
547 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
548 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
549 ; SSE41-NEXT:    retq
550 ;
551 ; AVX1-LABEL: shuffle_v2i64_21_copy:
552 ; AVX1:       # BB#0:
553 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm1[4,5,6,7]
554 ; AVX1-NEXT:    retq
555 ;
556 ; AVX2-LABEL: shuffle_v2i64_21_copy:
557 ; AVX2:       # BB#0:
558 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3]
559 ; AVX2-NEXT:    retq
560   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
561   ret <2 x i64> %shuffle
562 }
563 define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {
564 ; SSE2-LABEL: shuffle_v2i64_30:
565 ; SSE2:       # BB#0:
566 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
567 ; SSE2-NEXT:    movapd %xmm1, %xmm0
568 ; SSE2-NEXT:    retq
569 ;
570 ; SSE3-LABEL: shuffle_v2i64_30:
571 ; SSE3:       # BB#0:
572 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
573 ; SSE3-NEXT:    movapd %xmm1, %xmm0
574 ; SSE3-NEXT:    retq
575 ;
576 ; SSSE3-LABEL: shuffle_v2i64_30:
577 ; SSSE3:       # BB#0:
578 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
579 ; SSSE3-NEXT:    retq
580 ;
581 ; SSE41-LABEL: shuffle_v2i64_30:
582 ; SSE41:       # BB#0:
583 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
584 ; SSE41-NEXT:    retq
585 ;
586 ; AVX-LABEL: shuffle_v2i64_30:
587 ; AVX:       # BB#0:
588 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
589 ; AVX-NEXT:    retq
590   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
591   ret <2 x i64> %shuffle
592 }
593 define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
594 ; SSE2-LABEL: shuffle_v2i64_30_copy:
595 ; SSE2:       # BB#0:
596 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
597 ; SSE2-NEXT:    movapd %xmm2, %xmm0
598 ; SSE2-NEXT:    retq
599 ;
600 ; SSE3-LABEL: shuffle_v2i64_30_copy:
601 ; SSE3:       # BB#0:
602 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
603 ; SSE3-NEXT:    movapd %xmm2, %xmm0
604 ; SSE3-NEXT:    retq
605 ;
606 ; SSSE3-LABEL: shuffle_v2i64_30_copy:
607 ; SSSE3:       # BB#0:
608 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
609 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
610 ; SSSE3-NEXT:    retq
611 ;
612 ; SSE41-LABEL: shuffle_v2i64_30_copy:
613 ; SSE41:       # BB#0:
614 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
615 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
616 ; SSE41-NEXT:    retq
617 ;
618 ; AVX-LABEL: shuffle_v2i64_30_copy:
619 ; AVX:       # BB#0:
620 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
621 ; AVX-NEXT:    retq
622   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
623   ret <2 x i64> %shuffle
624 }
625 define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {
626 ; SSE-LABEL: shuffle_v2i64_31:
627 ; SSE:       # BB#0:
628 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
629 ; SSE-NEXT:    movdqa %xmm1, %xmm0
630 ; SSE-NEXT:    retq
631 ;
632 ; AVX-LABEL: shuffle_v2i64_31:
633 ; AVX:       # BB#0:
634 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
635 ; AVX-NEXT:    retq
636   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
637   ret <2 x i64> %shuffle
638 }
639 define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
640 ; SSE-LABEL: shuffle_v2i64_31_copy:
641 ; SSE:       # BB#0:
642 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]
643 ; SSE-NEXT:    movdqa %xmm2, %xmm0
644 ; SSE-NEXT:    retq
645 ;
646 ; AVX-LABEL: shuffle_v2i64_31_copy:
647 ; AVX:       # BB#0:
648 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm2[1],xmm1[1]
649 ; AVX-NEXT:    retq
650   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
651   ret <2 x i64> %shuffle
652 }
653
654 define <2 x i64> @shuffle_v2i64_0z(<2 x i64> %a) {
655 ; SSE-LABEL: shuffle_v2i64_0z:
656 ; SSE:       # BB#0:
657 ; SSE-NEXT:    movq %xmm0, %xmm0
658 ; SSE-NEXT:    retq
659 ;
660 ; AVX-LABEL: shuffle_v2i64_0z:
661 ; AVX:       # BB#0:
662 ; AVX-NEXT:    vmovq %xmm0, %xmm0
663 ; AVX-NEXT:    retq
664   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
665   ret <2 x i64> %shuffle
666 }
667
668 define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) {
669 ; SSE-LABEL: shuffle_v2i64_1z:
670 ; SSE:       # BB#0:
671 ; SSE-NEXT:    pxor %xmm1, %xmm1
672 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
673 ; SSE-NEXT:    retq
674 ;
675 ; AVX-LABEL: shuffle_v2i64_1z:
676 ; AVX:       # BB#0:
677 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
678 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
679 ; AVX-NEXT:    retq
680   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3>
681   ret <2 x i64> %shuffle
682 }
683
684 define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) {
685 ; SSE-LABEL: shuffle_v2i64_z0:
686 ; SSE:       # BB#0:
687 ; SSE-NEXT:    movq %xmm0, %xmm0
688 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
689 ; SSE-NEXT:    retq
690 ;
691 ; AVX-LABEL: shuffle_v2i64_z0:
692 ; AVX:       # BB#0:
693 ; AVX-NEXT:    vmovq %xmm0, %xmm0
694 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
695 ; AVX-NEXT:    retq
696   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0>
697   ret <2 x i64> %shuffle
698 }
699
700 define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) {
701 ; SSE2-LABEL: shuffle_v2i64_z1:
702 ; SSE2:       # BB#0:
703 ; SSE2-NEXT:    xorps %xmm1, %xmm1
704 ; SSE2-NEXT:    movsd %xmm1, %xmm0
705 ; SSE2-NEXT:    retq
706 ;
707 ; SSE3-LABEL: shuffle_v2i64_z1:
708 ; SSE3:       # BB#0:
709 ; SSE3-NEXT:    xorps %xmm1, %xmm1
710 ; SSE3-NEXT:    movsd %xmm1, %xmm0
711 ; SSE3-NEXT:    retq
712 ;
713 ; SSSE3-LABEL: shuffle_v2i64_z1:
714 ; SSSE3:       # BB#0:
715 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
716 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
717 ; SSSE3-NEXT:    retq
718 ;
719 ; SSE41-LABEL: shuffle_v2i64_z1:
720 ; SSE41:       # BB#0:
721 ; SSE41-NEXT:    pxor %xmm1, %xmm1
722 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
723 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
724 ; SSE41-NEXT:    retq
725 ;
726 ; AVX1-LABEL: shuffle_v2i64_z1:
727 ; AVX1:       # BB#0:
728 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
729 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
730 ; AVX1-NEXT:    retq
731 ;
732 ; AVX2-LABEL: shuffle_v2i64_z1:
733 ; AVX2:       # BB#0:
734 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
735 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
736 ; AVX2-NEXT:    retq
737   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1>
738   ret <2 x i64> %shuffle
739 }
740
741 define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) {
742 ; SSE-LABEL: shuffle_v2f64_0z:
743 ; SSE:       # BB#0:
744 ; SSE-NEXT:    movq %xmm0, %xmm0
745 ; SSE-NEXT:    retq
746 ;
747 ; AVX-LABEL: shuffle_v2f64_0z:
748 ; AVX:       # BB#0:
749 ; AVX-NEXT:    vmovq %xmm0, %xmm0
750 ; AVX-NEXT:    retq
751   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
752   ret <2 x double> %shuffle
753 }
754
755 define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) {
756 ; SSE-LABEL: shuffle_v2f64_1z:
757 ; SSE:       # BB#0:
758 ; SSE-NEXT:    xorpd %xmm1, %xmm1
759 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
760 ; SSE-NEXT:    retq
761 ;
762 ; AVX-LABEL: shuffle_v2f64_1z:
763 ; AVX:       # BB#0:
764 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
765 ; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
766 ; AVX-NEXT:    retq
767   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>
768   ret <2 x double> %shuffle
769 }
770
771 define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) {
772 ; SSE-LABEL: shuffle_v2f64_z0:
773 ; SSE:       # BB#0:
774 ; SSE-NEXT:    xorpd %xmm1, %xmm1
775 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
776 ; SSE-NEXT:    movapd %xmm1, %xmm0
777 ; SSE-NEXT:    retq
778 ;
779 ; AVX-LABEL: shuffle_v2f64_z0:
780 ; AVX:       # BB#0:
781 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
782 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
783 ; AVX-NEXT:    retq
784   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0>
785   ret <2 x double> %shuffle
786 }
787
788 define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) {
789 ; SSE2-LABEL: shuffle_v2f64_z1:
790 ; SSE2:       # BB#0:
791 ; SSE2-NEXT:    xorps %xmm1, %xmm1
792 ; SSE2-NEXT:    movsd %xmm1, %xmm0
793 ; SSE2-NEXT:    retq
794 ;
795 ; SSE3-LABEL: shuffle_v2f64_z1:
796 ; SSE3:       # BB#0:
797 ; SSE3-NEXT:    xorps %xmm1, %xmm1
798 ; SSE3-NEXT:    movsd %xmm1, %xmm0
799 ; SSE3-NEXT:    retq
800 ;
801 ; SSSE3-LABEL: shuffle_v2f64_z1:
802 ; SSSE3:       # BB#0:
803 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
804 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
805 ; SSSE3-NEXT:    retq
806 ;
807 ; SSE41-LABEL: shuffle_v2f64_z1:
808 ; SSE41:       # BB#0:
809 ; SSE41-NEXT:    xorpd %xmm1, %xmm1
810 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
811 ; SSE41-NEXT:    movapd %xmm1, %xmm0
812 ; SSE41-NEXT:    retq
813 ;
814 ; AVX-LABEL: shuffle_v2f64_z1:
815 ; AVX:       # BB#0:
816 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
817 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
818 ; AVX-NEXT:    retq
819   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>
820   ret <2 x double> %shuffle
821 }
822
823 define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {
824 ; SSE-LABEL: insert_reg_and_zero_v2i64:
825 ; SSE:       # BB#0:
826 ; SSE-NEXT:    movd %rdi, %xmm0
827 ; SSE-NEXT:    retq
828 ;
829 ; AVX-LABEL: insert_reg_and_zero_v2i64:
830 ; AVX:       # BB#0:
831 ; AVX-NEXT:    vmovq %rdi, %xmm0
832 ; AVX-NEXT:    retq
833   %v = insertelement <2 x i64> undef, i64 %a, i32 0
834   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
835   ret <2 x i64> %shuffle
836 }
837
838 define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) {
839 ; SSE-LABEL: insert_mem_and_zero_v2i64:
840 ; SSE:       # BB#0:
841 ; SSE-NEXT:    movq (%rdi), %xmm0
842 ; SSE-NEXT:    retq
843 ;
844 ; AVX-LABEL: insert_mem_and_zero_v2i64:
845 ; AVX:       # BB#0:
846 ; AVX-NEXT:    vmovq (%rdi), %xmm0
847 ; AVX-NEXT:    retq
848   %a = load i64* %ptr
849   %v = insertelement <2 x i64> undef, i64 %a, i32 0
850   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
851   ret <2 x i64> %shuffle
852 }
853
854 define <2 x double> @insert_reg_and_zero_v2f64(double %a) {
855 ; SSE-LABEL: insert_reg_and_zero_v2f64:
856 ; SSE:       # BB#0:
857 ; SSE-NEXT:    movq %xmm0, %xmm0
858 ; SSE-NEXT:    retq
859 ;
860 ; AVX-LABEL: insert_reg_and_zero_v2f64:
861 ; AVX:       # BB#0:
862 ; AVX-NEXT:    vmovq %xmm0, %xmm0
863 ; AVX-NEXT:    retq
864   %v = insertelement <2 x double> undef, double %a, i32 0
865   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
866   ret <2 x double> %shuffle
867 }
868
869 define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) {
870 ; SSE-LABEL: insert_mem_and_zero_v2f64:
871 ; SSE:       # BB#0:
872 ; SSE-NEXT:    movsd (%rdi), %xmm0
873 ; SSE-NEXT:    retq
874 ;
875 ; AVX-LABEL: insert_mem_and_zero_v2f64:
876 ; AVX:       # BB#0:
877 ; AVX-NEXT:    vmovsd (%rdi), %xmm0
878 ; AVX-NEXT:    retq
879   %a = load double* %ptr
880   %v = insertelement <2 x double> undef, double %a, i32 0
881   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
882   ret <2 x double> %shuffle
883 }
884
885 define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) {
886 ; SSE2-LABEL: insert_reg_lo_v2i64:
887 ; SSE2:       # BB#0:
888 ; SSE2-NEXT:    movd %rdi, %xmm1
889 ; SSE2-NEXT:    movsd %xmm1, %xmm0
890 ; SSE2-NEXT:    retq
891 ;
892 ; SSE3-LABEL: insert_reg_lo_v2i64:
893 ; SSE3:       # BB#0:
894 ; SSE3-NEXT:    movd %rdi, %xmm1
895 ; SSE3-NEXT:    movsd %xmm1, %xmm0
896 ; SSE3-NEXT:    retq
897 ;
898 ; SSSE3-LABEL: insert_reg_lo_v2i64:
899 ; SSSE3:       # BB#0:
900 ; SSSE3-NEXT:    movd %rdi, %xmm1
901 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
902 ; SSSE3-NEXT:    retq
903 ;
904 ; SSE41-LABEL: insert_reg_lo_v2i64:
905 ; SSE41:       # BB#0:
906 ; SSE41-NEXT:    movd %rdi, %xmm1
907 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
908 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
909 ; SSE41-NEXT:    retq
910 ;
911 ; AVX1-LABEL: insert_reg_lo_v2i64:
912 ; AVX1:       # BB#0:
913 ; AVX1-NEXT:    vmovq %rdi, %xmm1
914 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
915 ; AVX1-NEXT:    retq
916 ;
917 ; AVX2-LABEL: insert_reg_lo_v2i64:
918 ; AVX2:       # BB#0:
919 ; AVX2-NEXT:    vmovq %rdi, %xmm1
920 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
921 ; AVX2-NEXT:    retq
922   %v = insertelement <2 x i64> undef, i64 %a, i32 0
923   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
924   ret <2 x i64> %shuffle
925 }
926
927 define <2 x i64> @insert_mem_lo_v2i64(i64* %ptr, <2 x i64> %b) {
928 ; SSE2-LABEL: insert_mem_lo_v2i64:
929 ; SSE2:       # BB#0:
930 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
931 ; SSE2-NEXT:    retq
932 ;
933 ; SSE3-LABEL: insert_mem_lo_v2i64:
934 ; SSE3:       # BB#0:
935 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
936 ; SSE3-NEXT:    retq
937 ;
938 ; SSSE3-LABEL: insert_mem_lo_v2i64:
939 ; SSSE3:       # BB#0:
940 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
941 ; SSSE3-NEXT:    retq
942 ;
943 ; SSE41-LABEL: insert_mem_lo_v2i64:
944 ; SSE41:       # BB#0:
945 ; SSE41-NEXT:    movq (%rdi), %xmm1
946 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
947 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
948 ; SSE41-NEXT:    retq
949 ;
950 ; AVX1-LABEL: insert_mem_lo_v2i64:
951 ; AVX1:       # BB#0:
952 ; AVX1-NEXT:    vmovq (%rdi), %xmm1
953 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
954 ; AVX1-NEXT:    retq
955 ;
956 ; AVX2-LABEL: insert_mem_lo_v2i64:
957 ; AVX2:       # BB#0:
958 ; AVX2-NEXT:    vmovq (%rdi), %xmm1
959 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
960 ; AVX2-NEXT:    retq
961   %a = load i64* %ptr
962   %v = insertelement <2 x i64> undef, i64 %a, i32 0
963   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
964   ret <2 x i64> %shuffle
965 }
966
967 define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) {
968 ; SSE-LABEL: insert_reg_hi_v2i64:
969 ; SSE:       # BB#0:
970 ; SSE-NEXT:    movd %rdi, %xmm1
971 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
972 ; SSE-NEXT:    retq
973 ;
974 ; AVX-LABEL: insert_reg_hi_v2i64:
975 ; AVX:       # BB#0:
976 ; AVX-NEXT:    vmovq %rdi, %xmm1
977 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
978 ; AVX-NEXT:    retq
979   %v = insertelement <2 x i64> undef, i64 %a, i32 0
980   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
981   ret <2 x i64> %shuffle
982 }
983
984 define <2 x i64> @insert_mem_hi_v2i64(i64* %ptr, <2 x i64> %b) {
985 ; SSE-LABEL: insert_mem_hi_v2i64:
986 ; SSE:       # BB#0:
987 ; SSE-NEXT:    movq (%rdi), %xmm1
988 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
989 ; SSE-NEXT:    retq
990 ;
991 ; AVX-LABEL: insert_mem_hi_v2i64:
992 ; AVX:       # BB#0:
993 ; AVX-NEXT:    vmovq (%rdi), %xmm1
994 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
995 ; AVX-NEXT:    retq
996   %a = load i64* %ptr
997   %v = insertelement <2 x i64> undef, i64 %a, i32 0
998   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
999   ret <2 x i64> %shuffle
1000 }
1001
1002 define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) {
1003 ; SSE-LABEL: insert_reg_lo_v2f64:
1004 ; SSE:       # BB#0:
1005 ; SSE-NEXT:    movsd %xmm0, %xmm1
1006 ; SSE-NEXT:    movaps %xmm1, %xmm0
1007 ; SSE-NEXT:    retq
1008 ;
1009 ; AVX-LABEL: insert_reg_lo_v2f64:
1010 ; AVX:       # BB#0:
1011 ; AVX-NEXT:    vmovsd %xmm0, %xmm1, %xmm0
1012 ; AVX-NEXT:    retq
1013   %v = insertelement <2 x double> undef, double %a, i32 0
1014   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1015   ret <2 x double> %shuffle
1016 }
1017
1018 define <2 x double> @insert_mem_lo_v2f64(double* %ptr, <2 x double> %b) {
1019 ; SSE-LABEL: insert_mem_lo_v2f64:
1020 ; SSE:       # BB#0:
1021 ; SSE-NEXT:    movlpd (%rdi), %xmm0
1022 ; SSE-NEXT:    retq
1023 ;
1024 ; AVX-LABEL: insert_mem_lo_v2f64:
1025 ; AVX:       # BB#0:
1026 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
1027 ; AVX-NEXT:    retq
1028   %a = load double* %ptr
1029   %v = insertelement <2 x double> undef, double %a, i32 0
1030   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1031   ret <2 x double> %shuffle
1032 }
1033
1034 define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) {
1035 ; SSE-LABEL: insert_reg_hi_v2f64:
1036 ; SSE:       # BB#0:
1037 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1038 ; SSE-NEXT:    movapd %xmm1, %xmm0
1039 ; SSE-NEXT:    retq
1040 ;
1041 ; AVX-LABEL: insert_reg_hi_v2f64:
1042 ; AVX:       # BB#0:
1043 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1044 ; AVX-NEXT:    retq
1045   %v = insertelement <2 x double> undef, double %a, i32 0
1046   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1047   ret <2 x double> %shuffle
1048 }
1049
1050 define <2 x double> @insert_mem_hi_v2f64(double* %ptr, <2 x double> %b) {
1051 ; SSE-LABEL: insert_mem_hi_v2f64:
1052 ; SSE:       # BB#0:
1053 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1054 ; SSE-NEXT:    retq
1055 ;
1056 ; AVX-LABEL: insert_mem_hi_v2f64:
1057 ; AVX:       # BB#0:
1058 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1059 ; AVX-NEXT:    retq
1060   %a = load double* %ptr
1061   %v = insertelement <2 x double> undef, double %a, i32 0
1062   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1063   ret <2 x double> %shuffle
1064 }
1065
1066 define <2 x double> @insert_dup_reg_v2f64(double %a) {
1067 ; FIXME: We should match movddup for SSE3 and higher here.
1068 ;
1069 ; SSE2-LABEL: insert_dup_reg_v2f64:
1070 ; SSE2:       # BB#0:
1071 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1072 ; SSE2-NEXT:    retq
1073 ;
1074 ; SSE3-LABEL: insert_dup_reg_v2f64:
1075 ; SSE3:       # BB#0:
1076 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1077 ; SSE3-NEXT:    retq
1078 ;
1079 ; SSSE3-LABEL: insert_dup_reg_v2f64:
1080 ; SSSE3:       # BB#0:
1081 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1082 ; SSSE3-NEXT:    retq
1083 ;
1084 ; SSE41-LABEL: insert_dup_reg_v2f64:
1085 ; SSE41:       # BB#0:
1086 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1087 ; SSE41-NEXT:    retq
1088 ;
1089 ; AVX-LABEL: insert_dup_reg_v2f64:
1090 ; AVX:       # BB#0:
1091 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1092 ; AVX-NEXT:    retq
1093   %v = insertelement <2 x double> undef, double %a, i32 0
1094   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1095   ret <2 x double> %shuffle
1096 }
1097 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
1098 ; SSE2-LABEL: insert_dup_mem_v2f64:
1099 ; SSE2:       # BB#0:
1100 ; SSE2-NEXT:    movsd (%rdi), %xmm0
1101 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1102 ; SSE2-NEXT:    retq
1103 ;
1104 ; SSE3-LABEL: insert_dup_mem_v2f64:
1105 ; SSE3:       # BB#0:
1106 ; SSE3-NEXT:    movddup (%rdi), %xmm0
1107 ; SSE3-NEXT:    retq
1108 ;
1109 ; SSSE3-LABEL: insert_dup_mem_v2f64:
1110 ; SSSE3:       # BB#0:
1111 ; SSSE3-NEXT:    movddup (%rdi), %xmm0
1112 ; SSSE3-NEXT:    retq
1113 ;
1114 ; SSE41-LABEL: insert_dup_mem_v2f64:
1115 ; SSE41:       # BB#0:
1116 ; SSE41-NEXT:    movddup (%rdi), %xmm0
1117 ; SSE41-NEXT:    retq
1118 ;
1119 ; AVX-LABEL: insert_dup_mem_v2f64:
1120 ; AVX:       # BB#0:
1121 ; AVX-NEXT:    vmovddup (%rdi), %xmm0
1122 ; AVX-NEXT:    retq
1123   %a = load double* %ptr
1124   %v = insertelement <2 x double> undef, double %a, i32 0
1125   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1126   ret <2 x double> %shuffle
1127 }
1128
1129 define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) {
1130 ; SSE-LABEL: shuffle_mem_v2f64_10:
1131 ; SSE:       # BB#0:
1132 ; SSE-NEXT:    movapd (%rdi), %xmm0
1133 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1134 ; SSE-NEXT:    retq
1135 ;
1136 ; AVX-LABEL: shuffle_mem_v2f64_10:
1137 ; AVX:       # BB#0:
1138 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = mem[1,0]
1139 ; AVX-NEXT:    retq
1140   %a = load <2 x double>* %ptr
1141   %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1142   ret <2 x double> %shuffle
1143 }