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