1fc1b287ef7b75269daf14163033c2c6a85a2149
[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:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
217 ; SSE2-NEXT:    retq
218 ;
219 ; SSE3-LABEL: shuffle_v2f64_03:
220 ; SSE3:       # BB#0:
221 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
222 ; SSE3-NEXT:    retq
223 ;
224 ; SSSE3-LABEL: shuffle_v2f64_03:
225 ; SSSE3:       # BB#0:
226 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
227 ; SSSE3-NEXT:    retq
228 ;
229 ; SSE41-LABEL: shuffle_v2f64_03:
230 ; SSE41:       # BB#0:
231 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
232 ; SSE41-NEXT:    retq
233 ;
234 ; AVX-LABEL: shuffle_v2f64_03:
235 ; AVX:       # BB#0:
236 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
237 ; AVX-NEXT:    retq
238   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
239   ret <2 x double> %shuffle
240 }
241 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
242 ; SSE2-LABEL: shuffle_v2f64_21:
243 ; SSE2:       # BB#0:
244 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
245 ; SSE2-NEXT:    movapd %xmm1, %xmm0
246 ; SSE2-NEXT:    retq
247 ;
248 ; SSE3-LABEL: shuffle_v2f64_21:
249 ; SSE3:       # BB#0:
250 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
251 ; SSE3-NEXT:    movapd %xmm1, %xmm0
252 ; SSE3-NEXT:    retq
253 ;
254 ; SSSE3-LABEL: shuffle_v2f64_21:
255 ; SSSE3:       # BB#0:
256 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
257 ; SSSE3-NEXT:    movapd %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:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
306 ; SSE2-NEXT:    retq
307 ;
308 ; SSE3-LABEL: shuffle_v2i64_03:
309 ; SSE3:       # BB#0:
310 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
311 ; SSE3-NEXT:    retq
312 ;
313 ; SSSE3-LABEL: shuffle_v2i64_03:
314 ; SSSE3:       # BB#0:
315 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
316 ; SSSE3-NEXT:    retq
317 ;
318 ; SSE41-LABEL: shuffle_v2i64_03:
319 ; SSE41:       # BB#0:
320 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
321 ; SSE41-NEXT:    retq
322 ;
323 ; AVX1-LABEL: shuffle_v2i64_03:
324 ; AVX1:       # BB#0:
325 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
326 ; AVX1-NEXT:    retq
327 ;
328 ; AVX2-LABEL: shuffle_v2i64_03:
329 ; AVX2:       # BB#0:
330 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
331 ; AVX2-NEXT:    retq
332   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
333   ret <2 x i64> %shuffle
334 }
335 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
336 ; SSE2-LABEL: shuffle_v2i64_03_copy:
337 ; SSE2:       # BB#0:
338 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
339 ; SSE2-NEXT:    movapd %xmm1, %xmm0
340 ; SSE2-NEXT:    retq
341 ;
342 ; SSE3-LABEL: shuffle_v2i64_03_copy:
343 ; SSE3:       # BB#0:
344 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
345 ; SSE3-NEXT:    movapd %xmm1, %xmm0
346 ; SSE3-NEXT:    retq
347 ;
348 ; SSSE3-LABEL: shuffle_v2i64_03_copy:
349 ; SSSE3:       # BB#0:
350 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
351 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
352 ; SSSE3-NEXT:    retq
353 ;
354 ; SSE41-LABEL: shuffle_v2i64_03_copy:
355 ; SSE41:       # BB#0:
356 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
357 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
358 ; SSE41-NEXT:    retq
359 ;
360 ; AVX1-LABEL: shuffle_v2i64_03_copy:
361 ; AVX1:       # BB#0:
362 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7]
363 ; AVX1-NEXT:    retq
364 ;
365 ; AVX2-LABEL: shuffle_v2i64_03_copy:
366 ; AVX2:       # BB#0:
367 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3]
368 ; AVX2-NEXT:    retq
369   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
370   ret <2 x i64> %shuffle
371 }
372 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
373 ; SSE2-LABEL: shuffle_v2i64_12:
374 ; SSE2:       # BB#0:
375 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
376 ; SSE2-NEXT:    retq
377 ;
378 ; SSE3-LABEL: shuffle_v2i64_12:
379 ; SSE3:       # BB#0:
380 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
381 ; SSE3-NEXT:    retq
382 ;
383 ; SSSE3-LABEL: shuffle_v2i64_12:
384 ; SSSE3:       # BB#0:
385 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
386 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
387 ; SSSE3-NEXT:    retq
388 ;
389 ; SSE41-LABEL: shuffle_v2i64_12:
390 ; SSE41:       # BB#0:
391 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
392 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
393 ; SSE41-NEXT:    retq
394 ;
395 ; AVX-LABEL: shuffle_v2i64_12:
396 ; AVX:       # BB#0:
397 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
398 ; AVX-NEXT:    retq
399   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
400   ret <2 x i64> %shuffle
401 }
402 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
403 ; SSE2-LABEL: shuffle_v2i64_12_copy:
404 ; SSE2:       # BB#0:
405 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
406 ; SSE2-NEXT:    movapd %xmm1, %xmm0
407 ; SSE2-NEXT:    retq
408 ;
409 ; SSE3-LABEL: shuffle_v2i64_12_copy:
410 ; SSE3:       # BB#0:
411 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
412 ; SSE3-NEXT:    movapd %xmm1, %xmm0
413 ; SSE3-NEXT:    retq
414 ;
415 ; SSSE3-LABEL: shuffle_v2i64_12_copy:
416 ; SSSE3:       # BB#0:
417 ; SSSE3-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
418 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
419 ; SSSE3-NEXT:    retq
420 ;
421 ; SSE41-LABEL: shuffle_v2i64_12_copy:
422 ; SSE41:       # BB#0:
423 ; SSE41-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
424 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
425 ; SSE41-NEXT:    retq
426 ;
427 ; AVX-LABEL: shuffle_v2i64_12_copy:
428 ; AVX:       # BB#0:
429 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
430 ; AVX-NEXT:    retq
431   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
432   ret <2 x i64> %shuffle
433 }
434 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
435 ; SSE-LABEL: shuffle_v2i64_13:
436 ; SSE:       # BB#0:
437 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
438 ; SSE-NEXT:    retq
439 ;
440 ; AVX-LABEL: shuffle_v2i64_13:
441 ; AVX:       # BB#0:
442 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
443 ; AVX-NEXT:    retq
444   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
445   ret <2 x i64> %shuffle
446 }
447 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
448 ; SSE-LABEL: shuffle_v2i64_13_copy:
449 ; SSE:       # BB#0:
450 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1]
451 ; SSE-NEXT:    movdqa %xmm1, %xmm0
452 ; SSE-NEXT:    retq
453 ;
454 ; AVX-LABEL: shuffle_v2i64_13_copy:
455 ; AVX:       # BB#0:
456 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1]
457 ; AVX-NEXT:    retq
458   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
459   ret <2 x i64> %shuffle
460 }
461 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
462 ; SSE-LABEL: shuffle_v2i64_20:
463 ; SSE:       # BB#0:
464 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
465 ; SSE-NEXT:    movdqa %xmm1, %xmm0
466 ; SSE-NEXT:    retq
467 ;
468 ; AVX-LABEL: shuffle_v2i64_20:
469 ; AVX:       # BB#0:
470 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
471 ; AVX-NEXT:    retq
472   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
473   ret <2 x i64> %shuffle
474 }
475 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
476 ; SSE-LABEL: shuffle_v2i64_20_copy:
477 ; SSE:       # BB#0:
478 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
479 ; SSE-NEXT:    movdqa %xmm2, %xmm0
480 ; SSE-NEXT:    retq
481 ;
482 ; AVX-LABEL: shuffle_v2i64_20_copy:
483 ; AVX:       # BB#0:
484 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0]
485 ; AVX-NEXT:    retq
486   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
487   ret <2 x i64> %shuffle
488 }
489 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
490 ; SSE2-LABEL: shuffle_v2i64_21:
491 ; SSE2:       # BB#0:
492 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
493 ; SSE2-NEXT:    movapd %xmm1, %xmm0
494 ; SSE2-NEXT:    retq
495 ;
496 ; SSE3-LABEL: shuffle_v2i64_21:
497 ; SSE3:       # BB#0:
498 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
499 ; SSE3-NEXT:    movapd %xmm1, %xmm0
500 ; SSE3-NEXT:    retq
501 ;
502 ; SSSE3-LABEL: shuffle_v2i64_21:
503 ; SSSE3:       # BB#0:
504 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
505 ; SSSE3-NEXT:    movapd %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:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
530 ; SSE2-NEXT:    movapd %xmm2, %xmm0
531 ; SSE2-NEXT:    retq
532 ;
533 ; SSE3-LABEL: shuffle_v2i64_21_copy:
534 ; SSE3:       # BB#0:
535 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
536 ; SSE3-NEXT:    movapd %xmm2, %xmm0
537 ; SSE3-NEXT:    retq
538 ;
539 ; SSSE3-LABEL: shuffle_v2i64_21_copy:
540 ; SSSE3:       # BB#0:
541 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[0],xmm1[1]
542 ; SSSE3-NEXT:    movapd %xmm2, %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 ; SSE2-LABEL: shuffle_v2i64_0z:
656 ; SSE2:       # BB#0:
657 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
658 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
659 ; SSE2-NEXT:    retq
660 ;
661 ; SSE3-LABEL: shuffle_v2i64_0z:
662 ; SSE3:       # BB#0:
663 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
664 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
665 ; SSE3-NEXT:    retq
666 ;
667 ; SSSE3-LABEL: shuffle_v2i64_0z:
668 ; SSSE3:       # BB#0:
669 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
670 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
671 ; SSSE3-NEXT:    retq
672 ;
673 ; SSE41-LABEL: shuffle_v2i64_0z:
674 ; SSE41:       # BB#0:
675 ; SSE41-NEXT:    pxor %xmm1, %xmm1
676 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
677 ; SSE41-NEXT:    retq
678 ;
679 ; AVX1-LABEL: shuffle_v2i64_0z:
680 ; AVX1:       # BB#0:
681 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
682 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
683 ; AVX1-NEXT:    retq
684 ;
685 ; AVX2-LABEL: shuffle_v2i64_0z:
686 ; AVX2:       # BB#0:
687 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
688 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
689 ; AVX2-NEXT:    retq
690   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
691   ret <2 x i64> %shuffle
692 }
693
694 define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) {
695 ; SSE-LABEL: shuffle_v2i64_1z:
696 ; SSE:       # BB#0:
697 ; SSE-NEXT:    pxor %xmm1, %xmm1
698 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
699 ; SSE-NEXT:    retq
700 ;
701 ; AVX-LABEL: shuffle_v2i64_1z:
702 ; AVX:       # BB#0:
703 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
704 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
705 ; AVX-NEXT:    retq
706   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3>
707   ret <2 x i64> %shuffle
708 }
709
710 define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) {
711 ; SSE-LABEL: shuffle_v2i64_z0:
712 ; SSE:       # BB#0:
713 ; SSE-NEXT:    pxor %xmm1, %xmm1
714 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
715 ; SSE-NEXT:    movdqa %xmm1, %xmm0
716 ; SSE-NEXT:    retq
717 ;
718 ; AVX-LABEL: shuffle_v2i64_z0:
719 ; AVX:       # BB#0:
720 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
721 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
722 ; AVX-NEXT:    retq
723   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0>
724   ret <2 x i64> %shuffle
725 }
726
727 define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) {
728 ; SSE2-LABEL: shuffle_v2i64_z1:
729 ; SSE2:       # BB#0:
730 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
731 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
732 ; SSE2-NEXT:    movapd %xmm1, %xmm0
733 ; SSE2-NEXT:    retq
734 ;
735 ; SSE3-LABEL: shuffle_v2i64_z1:
736 ; SSE3:       # BB#0:
737 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
738 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
739 ; SSE3-NEXT:    movapd %xmm1, %xmm0
740 ; SSE3-NEXT:    retq
741 ;
742 ; SSSE3-LABEL: shuffle_v2i64_z1:
743 ; SSSE3:       # BB#0:
744 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
745 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
746 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
747 ; SSSE3-NEXT:    retq
748 ;
749 ; SSE41-LABEL: shuffle_v2i64_z1:
750 ; SSE41:       # BB#0:
751 ; SSE41-NEXT:    pxor %xmm1, %xmm1
752 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
753 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
754 ; SSE41-NEXT:    retq
755 ;
756 ; AVX1-LABEL: shuffle_v2i64_z1:
757 ; AVX1:       # BB#0:
758 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
759 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
760 ; AVX1-NEXT:    retq
761 ;
762 ; AVX2-LABEL: shuffle_v2i64_z1:
763 ; AVX2:       # BB#0:
764 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
765 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
766 ; AVX2-NEXT:    retq
767   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1>
768   ret <2 x i64> %shuffle
769 }
770
771 define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) {
772 ; SSE2-LABEL: shuffle_v2f64_0z:
773 ; SSE2:       # BB#0:
774 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
775 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
776 ; SSE2-NEXT:    retq
777 ;
778 ; SSE3-LABEL: shuffle_v2f64_0z:
779 ; SSE3:       # BB#0:
780 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
781 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
782 ; SSE3-NEXT:    retq
783 ;
784 ; SSSE3-LABEL: shuffle_v2f64_0z:
785 ; SSSE3:       # BB#0:
786 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
787 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
788 ; SSSE3-NEXT:    retq
789 ;
790 ; SSE41-LABEL: shuffle_v2f64_0z:
791 ; SSE41:       # BB#0:
792 ; SSE41-NEXT:    xorpd %xmm1, %xmm1
793 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
794 ; SSE41-NEXT:    retq
795 ;
796 ; AVX-LABEL: shuffle_v2f64_0z:
797 ; AVX:       # BB#0:
798 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
799 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
800 ; AVX-NEXT:    retq
801   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
802   ret <2 x double> %shuffle
803 }
804
805 define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) {
806 ; SSE-LABEL: shuffle_v2f64_1z:
807 ; SSE:       # BB#0:
808 ; SSE-NEXT:    xorpd %xmm1, %xmm1
809 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
810 ; SSE-NEXT:    retq
811 ;
812 ; AVX-LABEL: shuffle_v2f64_1z:
813 ; AVX:       # BB#0:
814 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
815 ; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
816 ; AVX-NEXT:    retq
817   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>
818   ret <2 x double> %shuffle
819 }
820
821 define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) {
822 ; SSE-LABEL: shuffle_v2f64_z0:
823 ; SSE:       # BB#0:
824 ; SSE-NEXT:    xorpd %xmm1, %xmm1
825 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
826 ; SSE-NEXT:    movapd %xmm1, %xmm0
827 ; SSE-NEXT:    retq
828 ;
829 ; AVX-LABEL: shuffle_v2f64_z0:
830 ; AVX:       # BB#0:
831 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
832 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
833 ; AVX-NEXT:    retq
834   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0>
835   ret <2 x double> %shuffle
836 }
837
838 define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) {
839 ; SSE2-LABEL: shuffle_v2f64_z1:
840 ; SSE2:       # BB#0:
841 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
842 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
843 ; SSE2-NEXT:    movapd %xmm1, %xmm0
844 ; SSE2-NEXT:    retq
845 ;
846 ; SSE3-LABEL: shuffle_v2f64_z1:
847 ; SSE3:       # BB#0:
848 ; SSE3-NEXT:    xorpd %xmm1, %xmm1
849 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
850 ; SSE3-NEXT:    movapd %xmm1, %xmm0
851 ; SSE3-NEXT:    retq
852 ;
853 ; SSSE3-LABEL: shuffle_v2f64_z1:
854 ; SSSE3:       # BB#0:
855 ; SSSE3-NEXT:    xorpd %xmm1, %xmm1
856 ; SSSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
857 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
858 ; SSSE3-NEXT:    retq
859 ;
860 ; SSE41-LABEL: shuffle_v2f64_z1:
861 ; SSE41:       # BB#0:
862 ; SSE41-NEXT:    xorpd %xmm1, %xmm1
863 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm0[1]
864 ; SSE41-NEXT:    movapd %xmm1, %xmm0
865 ; SSE41-NEXT:    retq
866 ;
867 ; AVX-LABEL: shuffle_v2f64_z1:
868 ; AVX:       # BB#0:
869 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
870 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
871 ; AVX-NEXT:    retq
872   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>
873   ret <2 x double> %shuffle
874 }
875
876 define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {
877 ; SSE-LABEL: insert_reg_and_zero_v2i64:
878 ; SSE:       # BB#0:
879 ; SSE-NEXT:    movd %rdi, %xmm0
880 ; SSE-NEXT:    retq
881 ;
882 ; AVX-LABEL: insert_reg_and_zero_v2i64:
883 ; AVX:       # BB#0:
884 ; AVX-NEXT:    vmovq %rdi, %xmm0
885 ; AVX-NEXT:    retq
886   %v = insertelement <2 x i64> undef, i64 %a, i32 0
887   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
888   ret <2 x i64> %shuffle
889 }
890
891 define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) {
892 ; SSE-LABEL: insert_mem_and_zero_v2i64:
893 ; SSE:       # BB#0:
894 ; SSE-NEXT:    movq (%rdi), %xmm0
895 ; SSE-NEXT:    retq
896 ;
897 ; AVX-LABEL: insert_mem_and_zero_v2i64:
898 ; AVX:       # BB#0:
899 ; AVX-NEXT:    vmovq (%rdi), %xmm0
900 ; AVX-NEXT:    retq
901   %a = load i64* %ptr
902   %v = insertelement <2 x i64> undef, i64 %a, i32 0
903   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
904   ret <2 x i64> %shuffle
905 }
906
907 define <2 x double> @insert_reg_and_zero_v2f64(double %a) {
908 ; SSE-LABEL: insert_reg_and_zero_v2f64:
909 ; SSE:       # BB#0:
910 ; SSE-NEXT:    movq %xmm0, %xmm0
911 ; SSE-NEXT:    retq
912 ;
913 ; AVX-LABEL: insert_reg_and_zero_v2f64:
914 ; AVX:       # BB#0:
915 ; AVX-NEXT:    vmovq %xmm0, %xmm0
916 ; AVX-NEXT:    retq
917   %v = insertelement <2 x double> undef, double %a, i32 0
918   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
919   ret <2 x double> %shuffle
920 }
921
922 define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) {
923 ; SSE-LABEL: insert_mem_and_zero_v2f64:
924 ; SSE:       # BB#0:
925 ; SSE-NEXT:    movsd (%rdi), %xmm0
926 ; SSE-NEXT:    retq
927 ;
928 ; AVX-LABEL: insert_mem_and_zero_v2f64:
929 ; AVX:       # BB#0:
930 ; AVX-NEXT:    vmovsd (%rdi), %xmm0
931 ; AVX-NEXT:    retq
932   %a = load double* %ptr
933   %v = insertelement <2 x double> undef, double %a, i32 0
934   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
935   ret <2 x double> %shuffle
936 }
937
938 define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) {
939 ; SSE2-LABEL: insert_reg_lo_v2i64:
940 ; SSE2:       # BB#0:
941 ; SSE2-NEXT:    movd %rdi, %xmm1
942 ; SSE2-NEXT:    movsd %xmm1, %xmm0
943 ; SSE2-NEXT:    retq
944 ;
945 ; SSE3-LABEL: insert_reg_lo_v2i64:
946 ; SSE3:       # BB#0:
947 ; SSE3-NEXT:    movd %rdi, %xmm1
948 ; SSE3-NEXT:    movsd %xmm1, %xmm0
949 ; SSE3-NEXT:    retq
950 ;
951 ; SSSE3-LABEL: insert_reg_lo_v2i64:
952 ; SSSE3:       # BB#0:
953 ; SSSE3-NEXT:    movd %rdi, %xmm1
954 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
955 ; SSSE3-NEXT:    retq
956 ;
957 ; SSE41-LABEL: insert_reg_lo_v2i64:
958 ; SSE41:       # BB#0:
959 ; SSE41-NEXT:    movd %rdi, %xmm1
960 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
961 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
962 ; SSE41-NEXT:    retq
963 ;
964 ; AVX1-LABEL: insert_reg_lo_v2i64:
965 ; AVX1:       # BB#0:
966 ; AVX1-NEXT:    vmovq %rdi, %xmm1
967 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
968 ; AVX1-NEXT:    retq
969 ;
970 ; AVX2-LABEL: insert_reg_lo_v2i64:
971 ; AVX2:       # BB#0:
972 ; AVX2-NEXT:    vmovq %rdi, %xmm1
973 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
974 ; AVX2-NEXT:    retq
975   %v = insertelement <2 x i64> undef, i64 %a, i32 0
976   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
977   ret <2 x i64> %shuffle
978 }
979
980 define <2 x i64> @insert_mem_lo_v2i64(i64* %ptr, <2 x i64> %b) {
981 ; SSE2-LABEL: insert_mem_lo_v2i64:
982 ; SSE2:       # BB#0:
983 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
984 ; SSE2-NEXT:    retq
985 ;
986 ; SSE3-LABEL: insert_mem_lo_v2i64:
987 ; SSE3:       # BB#0:
988 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
989 ; SSE3-NEXT:    retq
990 ;
991 ; SSSE3-LABEL: insert_mem_lo_v2i64:
992 ; SSSE3:       # BB#0:
993 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
994 ; SSSE3-NEXT:    retq
995 ;
996 ; SSE41-LABEL: insert_mem_lo_v2i64:
997 ; SSE41:       # BB#0:
998 ; SSE41-NEXT:    movq (%rdi), %xmm1
999 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1000 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1001 ; SSE41-NEXT:    retq
1002 ;
1003 ; AVX1-LABEL: insert_mem_lo_v2i64:
1004 ; AVX1:       # BB#0:
1005 ; AVX1-NEXT:    vmovq (%rdi), %xmm1
1006 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1007 ; AVX1-NEXT:    retq
1008 ;
1009 ; AVX2-LABEL: insert_mem_lo_v2i64:
1010 ; AVX2:       # BB#0:
1011 ; AVX2-NEXT:    vmovq (%rdi), %xmm1
1012 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1013 ; AVX2-NEXT:    retq
1014   %a = load i64* %ptr
1015   %v = insertelement <2 x i64> undef, i64 %a, i32 0
1016   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
1017   ret <2 x i64> %shuffle
1018 }
1019
1020 define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) {
1021 ; SSE-LABEL: insert_reg_hi_v2i64:
1022 ; SSE:       # BB#0:
1023 ; SSE-NEXT:    movd %rdi, %xmm1
1024 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1025 ; SSE-NEXT:    retq
1026 ;
1027 ; AVX-LABEL: insert_reg_hi_v2i64:
1028 ; AVX:       # BB#0:
1029 ; AVX-NEXT:    vmovq %rdi, %xmm1
1030 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1031 ; AVX-NEXT:    retq
1032   %v = insertelement <2 x i64> undef, i64 %a, i32 0
1033   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
1034   ret <2 x i64> %shuffle
1035 }
1036
1037 define <2 x i64> @insert_mem_hi_v2i64(i64* %ptr, <2 x i64> %b) {
1038 ; SSE-LABEL: insert_mem_hi_v2i64:
1039 ; SSE:       # BB#0:
1040 ; SSE-NEXT:    movq (%rdi), %xmm1
1041 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1042 ; SSE-NEXT:    retq
1043 ;
1044 ; AVX-LABEL: insert_mem_hi_v2i64:
1045 ; AVX:       # BB#0:
1046 ; AVX-NEXT:    vmovq (%rdi), %xmm1
1047 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1048 ; AVX-NEXT:    retq
1049   %a = load i64* %ptr
1050   %v = insertelement <2 x i64> undef, i64 %a, i32 0
1051   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
1052   ret <2 x i64> %shuffle
1053 }
1054
1055 define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) {
1056 ; SSE-LABEL: insert_reg_lo_v2f64:
1057 ; SSE:       # BB#0:
1058 ; SSE-NEXT:    movsd %xmm0, %xmm1
1059 ; SSE-NEXT:    movaps %xmm1, %xmm0
1060 ; SSE-NEXT:    retq
1061 ;
1062 ; AVX-LABEL: insert_reg_lo_v2f64:
1063 ; AVX:       # BB#0:
1064 ; AVX-NEXT:    vmovsd %xmm0, %xmm1, %xmm0
1065 ; AVX-NEXT:    retq
1066   %v = insertelement <2 x double> undef, double %a, i32 0
1067   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1068   ret <2 x double> %shuffle
1069 }
1070
1071 define <2 x double> @insert_mem_lo_v2f64(double* %ptr, <2 x double> %b) {
1072 ; SSE-LABEL: insert_mem_lo_v2f64:
1073 ; SSE:       # BB#0:
1074 ; SSE-NEXT:    movlpd (%rdi), %xmm0
1075 ; SSE-NEXT:    retq
1076 ;
1077 ; AVX-LABEL: insert_mem_lo_v2f64:
1078 ; AVX:       # BB#0:
1079 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
1080 ; AVX-NEXT:    retq
1081   %a = load double* %ptr
1082   %v = insertelement <2 x double> undef, double %a, i32 0
1083   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
1084   ret <2 x double> %shuffle
1085 }
1086
1087 define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) {
1088 ; SSE-LABEL: insert_reg_hi_v2f64:
1089 ; SSE:       # BB#0:
1090 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1091 ; SSE-NEXT:    movapd %xmm1, %xmm0
1092 ; SSE-NEXT:    retq
1093 ;
1094 ; AVX-LABEL: insert_reg_hi_v2f64:
1095 ; AVX:       # BB#0:
1096 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1097 ; AVX-NEXT:    retq
1098   %v = insertelement <2 x double> undef, double %a, i32 0
1099   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1100   ret <2 x double> %shuffle
1101 }
1102
1103 define <2 x double> @insert_mem_hi_v2f64(double* %ptr, <2 x double> %b) {
1104 ; SSE-LABEL: insert_mem_hi_v2f64:
1105 ; SSE:       # BB#0:
1106 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1107 ; SSE-NEXT:    retq
1108 ;
1109 ; AVX-LABEL: insert_mem_hi_v2f64:
1110 ; AVX:       # BB#0:
1111 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1112 ; AVX-NEXT:    retq
1113   %a = load double* %ptr
1114   %v = insertelement <2 x double> undef, double %a, i32 0
1115   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1116   ret <2 x double> %shuffle
1117 }
1118
1119 define <2 x double> @insert_dup_reg_v2f64(double %a) {
1120 ; FIXME: We should match movddup for SSE3 and higher here.
1121 ;
1122 ; SSE2-LABEL: insert_dup_reg_v2f64:
1123 ; SSE2:       # BB#0:
1124 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1125 ; SSE2-NEXT:    retq
1126 ;
1127 ; SSE3-LABEL: insert_dup_reg_v2f64:
1128 ; SSE3:       # BB#0:
1129 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1130 ; SSE3-NEXT:    retq
1131 ;
1132 ; SSSE3-LABEL: insert_dup_reg_v2f64:
1133 ; SSSE3:       # BB#0:
1134 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1135 ; SSSE3-NEXT:    retq
1136 ;
1137 ; SSE41-LABEL: insert_dup_reg_v2f64:
1138 ; SSE41:       # BB#0:
1139 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1140 ; SSE41-NEXT:    retq
1141 ;
1142 ; AVX-LABEL: insert_dup_reg_v2f64:
1143 ; AVX:       # BB#0:
1144 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1145 ; AVX-NEXT:    retq
1146   %v = insertelement <2 x double> undef, double %a, i32 0
1147   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1148   ret <2 x double> %shuffle
1149 }
1150 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
1151 ; SSE2-LABEL: insert_dup_mem_v2f64:
1152 ; SSE2:       # BB#0:
1153 ; SSE2-NEXT:    movsd (%rdi), %xmm0
1154 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1155 ; SSE2-NEXT:    retq
1156 ;
1157 ; SSE3-LABEL: insert_dup_mem_v2f64:
1158 ; SSE3:       # BB#0:
1159 ; SSE3-NEXT:    movddup (%rdi), %xmm0
1160 ; SSE3-NEXT:    retq
1161 ;
1162 ; SSSE3-LABEL: insert_dup_mem_v2f64:
1163 ; SSSE3:       # BB#0:
1164 ; SSSE3-NEXT:    movddup (%rdi), %xmm0
1165 ; SSSE3-NEXT:    retq
1166 ;
1167 ; SSE41-LABEL: insert_dup_mem_v2f64:
1168 ; SSE41:       # BB#0:
1169 ; SSE41-NEXT:    movddup (%rdi), %xmm0
1170 ; SSE41-NEXT:    retq
1171 ;
1172 ; AVX-LABEL: insert_dup_mem_v2f64:
1173 ; AVX:       # BB#0:
1174 ; AVX-NEXT:    vmovddup (%rdi), %xmm0
1175 ; AVX-NEXT:    retq
1176   %a = load double* %ptr
1177   %v = insertelement <2 x double> undef, double %a, i32 0
1178   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1179   ret <2 x double> %shuffle
1180 }
1181
1182 define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) {
1183 ; SSE-LABEL: shuffle_mem_v2f64_10:
1184 ; SSE:       # BB#0:
1185 ; SSE-NEXT:    movapd (%rdi), %xmm0
1186 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1187 ; SSE-NEXT:    retq
1188 ;
1189 ; AVX-LABEL: shuffle_mem_v2f64_10:
1190 ; AVX:       # BB#0:
1191 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = mem[1,0]
1192 ; AVX-NEXT:    retq
1193   %a = load <2 x double>* %ptr
1194   %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1195   ret <2 x double> %shuffle
1196 }