[x86] Adjust the patterns for lowering X86vzmovl nodes which don't
[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 ; SSE-LABEL: shuffle_v2f64_03:
215 ; SSE:       # BB#0:
216 ; SSE-NEXT:    movsd %xmm0, %xmm1
217 ; SSE-NEXT:    movaps %xmm1, %xmm0
218 ; SSE-NEXT:    retq
219 ;
220 ; AVX-LABEL: shuffle_v2f64_03:
221 ; AVX:       # BB#0:
222 ; AVX-NEXT:    vmovsd %xmm0, %xmm1, %xmm0
223 ; AVX-NEXT:    retq
224   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>
225   ret <2 x double> %shuffle
226 }
227 define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {
228 ; SSE-LABEL: shuffle_v2f64_21:
229 ; SSE:       # BB#0:
230 ; SSE-NEXT:    movsd %xmm1, %xmm0
231 ; SSE-NEXT:    retq
232 ;
233 ; AVX-LABEL: shuffle_v2f64_21:
234 ; AVX:       # BB#0:
235 ; AVX-NEXT:    vmovsd %xmm1, %xmm0, %xmm0
236 ; AVX-NEXT:    retq
237   %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>
238   ret <2 x double> %shuffle
239 }
240
241
242 define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {
243 ; SSE-LABEL: shuffle_v2i64_02:
244 ; SSE:       # BB#0:
245 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
246 ; SSE-NEXT:    retq
247 ;
248 ; AVX-LABEL: shuffle_v2i64_02:
249 ; AVX:       # BB#0:
250 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
251 ; AVX-NEXT:    retq
252   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
253   ret <2 x i64> %shuffle
254 }
255 define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
256 ; SSE-LABEL: shuffle_v2i64_02_copy:
257 ; SSE:       # BB#0:
258 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
259 ; SSE-NEXT:    movdqa %xmm1, %xmm0
260 ; SSE-NEXT:    retq
261 ;
262 ; AVX-LABEL: shuffle_v2i64_02_copy:
263 ; AVX:       # BB#0:
264 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm2[0]
265 ; AVX-NEXT:    retq
266   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>
267   ret <2 x i64> %shuffle
268 }
269 define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {
270 ; SSE2-LABEL: shuffle_v2i64_03:
271 ; SSE2:       # BB#0:
272 ; SSE2-NEXT:    movsd %xmm0, %xmm1
273 ; SSE2-NEXT:    movaps %xmm1, %xmm0
274 ; SSE2-NEXT:    retq
275 ;
276 ; SSE3-LABEL: shuffle_v2i64_03:
277 ; SSE3:       # BB#0:
278 ; SSE3-NEXT:    movsd %xmm0, %xmm1
279 ; SSE3-NEXT:    movaps %xmm1, %xmm0
280 ; SSE3-NEXT:    retq
281 ;
282 ; SSSE3-LABEL: shuffle_v2i64_03:
283 ; SSSE3:       # BB#0:
284 ; SSSE3-NEXT:    movsd %xmm0, %xmm1
285 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
286 ; SSSE3-NEXT:    retq
287 ;
288 ; SSE41-LABEL: shuffle_v2i64_03:
289 ; SSE41:       # BB#0:
290 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
291 ; SSE41-NEXT:    retq
292 ;
293 ; AVX1-LABEL: shuffle_v2i64_03:
294 ; AVX1:       # BB#0:
295 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
296 ; AVX1-NEXT:    retq
297 ;
298 ; AVX2-LABEL: shuffle_v2i64_03:
299 ; AVX2:       # BB#0:
300 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
301 ; AVX2-NEXT:    retq
302   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
303   ret <2 x i64> %shuffle
304 }
305 define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
306 ; SSE2-LABEL: shuffle_v2i64_03_copy:
307 ; SSE2:       # BB#0:
308 ; SSE2-NEXT:    movsd %xmm1, %xmm2
309 ; SSE2-NEXT:    movaps %xmm2, %xmm0
310 ; SSE2-NEXT:    retq
311 ;
312 ; SSE3-LABEL: shuffle_v2i64_03_copy:
313 ; SSE3:       # BB#0:
314 ; SSE3-NEXT:    movsd %xmm1, %xmm2
315 ; SSE3-NEXT:    movaps %xmm2, %xmm0
316 ; SSE3-NEXT:    retq
317 ;
318 ; SSSE3-LABEL: shuffle_v2i64_03_copy:
319 ; SSSE3:       # BB#0:
320 ; SSSE3-NEXT:    movsd %xmm1, %xmm2
321 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
322 ; SSSE3-NEXT:    retq
323 ;
324 ; SSE41-LABEL: shuffle_v2i64_03_copy:
325 ; SSE41:       # BB#0:
326 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
327 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
328 ; SSE41-NEXT:    retq
329 ;
330 ; AVX1-LABEL: shuffle_v2i64_03_copy:
331 ; AVX1:       # BB#0:
332 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7]
333 ; AVX1-NEXT:    retq
334 ;
335 ; AVX2-LABEL: shuffle_v2i64_03_copy:
336 ; AVX2:       # BB#0:
337 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3]
338 ; AVX2-NEXT:    retq
339   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
340   ret <2 x i64> %shuffle
341 }
342 define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {
343 ; SSE2-LABEL: shuffle_v2i64_12:
344 ; SSE2:       # BB#0:
345 ; SSE2-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
346 ; SSE2-NEXT:    retq
347 ;
348 ; SSE3-LABEL: shuffle_v2i64_12:
349 ; SSE3:       # BB#0:
350 ; SSE3-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
351 ; SSE3-NEXT:    retq
352 ;
353 ; SSSE3-LABEL: shuffle_v2i64_12:
354 ; SSSE3:       # BB#0:
355 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
356 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
357 ; SSSE3-NEXT:    retq
358 ;
359 ; SSE41-LABEL: shuffle_v2i64_12:
360 ; SSE41:       # BB#0:
361 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
362 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
363 ; SSE41-NEXT:    retq
364 ;
365 ; AVX-LABEL: shuffle_v2i64_12:
366 ; AVX:       # BB#0:
367 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
368 ; AVX-NEXT:    retq
369   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
370   ret <2 x i64> %shuffle
371 }
372 define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
373 ; SSE2-LABEL: shuffle_v2i64_12_copy:
374 ; SSE2:       # BB#0:
375 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
376 ; SSE2-NEXT:    movapd %xmm1, %xmm0
377 ; SSE2-NEXT:    retq
378 ;
379 ; SSE3-LABEL: shuffle_v2i64_12_copy:
380 ; SSE3:       # BB#0:
381 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0]
382 ; SSE3-NEXT:    movapd %xmm1, %xmm0
383 ; SSE3-NEXT:    retq
384 ;
385 ; SSSE3-LABEL: shuffle_v2i64_12_copy:
386 ; SSSE3:       # BB#0:
387 ; SSSE3-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
388 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
389 ; SSSE3-NEXT:    retq
390 ;
391 ; SSE41-LABEL: shuffle_v2i64_12_copy:
392 ; SSE41:       # BB#0:
393 ; SSE41-NEXT:    palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
394 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
395 ; SSE41-NEXT:    retq
396 ;
397 ; AVX-LABEL: shuffle_v2i64_12_copy:
398 ; AVX:       # BB#0:
399 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]
400 ; AVX-NEXT:    retq
401   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>
402   ret <2 x i64> %shuffle
403 }
404 define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {
405 ; SSE-LABEL: shuffle_v2i64_13:
406 ; SSE:       # BB#0:
407 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
408 ; SSE-NEXT:    retq
409 ;
410 ; AVX-LABEL: shuffle_v2i64_13:
411 ; AVX:       # BB#0:
412 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
413 ; AVX-NEXT:    retq
414   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
415   ret <2 x i64> %shuffle
416 }
417 define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
418 ; SSE-LABEL: shuffle_v2i64_13_copy:
419 ; SSE:       # BB#0:
420 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1]
421 ; SSE-NEXT:    movdqa %xmm1, %xmm0
422 ; SSE-NEXT:    retq
423 ;
424 ; AVX-LABEL: shuffle_v2i64_13_copy:
425 ; AVX:       # BB#0:
426 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1]
427 ; AVX-NEXT:    retq
428   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>
429   ret <2 x i64> %shuffle
430 }
431 define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {
432 ; SSE-LABEL: shuffle_v2i64_20:
433 ; SSE:       # BB#0:
434 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
435 ; SSE-NEXT:    movdqa %xmm1, %xmm0
436 ; SSE-NEXT:    retq
437 ;
438 ; AVX-LABEL: shuffle_v2i64_20:
439 ; AVX:       # BB#0:
440 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
441 ; AVX-NEXT:    retq
442   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
443   ret <2 x i64> %shuffle
444 }
445 define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
446 ; SSE-LABEL: shuffle_v2i64_20_copy:
447 ; SSE:       # BB#0:
448 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
449 ; SSE-NEXT:    movdqa %xmm2, %xmm0
450 ; SSE-NEXT:    retq
451 ;
452 ; AVX-LABEL: shuffle_v2i64_20_copy:
453 ; AVX:       # BB#0:
454 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0]
455 ; AVX-NEXT:    retq
456   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
457   ret <2 x i64> %shuffle
458 }
459 define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {
460 ; SSE2-LABEL: shuffle_v2i64_21:
461 ; SSE2:       # BB#0:
462 ; SSE2-NEXT:    movsd %xmm1, %xmm0
463 ; SSE2-NEXT:    retq
464 ;
465 ; SSE3-LABEL: shuffle_v2i64_21:
466 ; SSE3:       # BB#0:
467 ; SSE3-NEXT:    movsd %xmm1, %xmm0
468 ; SSE3-NEXT:    retq
469 ;
470 ; SSSE3-LABEL: shuffle_v2i64_21:
471 ; SSSE3:       # BB#0:
472 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
473 ; SSSE3-NEXT:    retq
474 ;
475 ; SSE41-LABEL: shuffle_v2i64_21:
476 ; SSE41:       # BB#0:
477 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
478 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
479 ; SSE41-NEXT:    retq
480 ;
481 ; AVX1-LABEL: shuffle_v2i64_21:
482 ; AVX1:       # BB#0:
483 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
484 ; AVX1-NEXT:    retq
485 ;
486 ; AVX2-LABEL: shuffle_v2i64_21:
487 ; AVX2:       # BB#0:
488 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
489 ; AVX2-NEXT:    retq
490   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
491   ret <2 x i64> %shuffle
492 }
493 define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
494 ; SSE2-LABEL: shuffle_v2i64_21_copy:
495 ; SSE2:       # BB#0:
496 ; SSE2-NEXT:    movsd %xmm2, %xmm1
497 ; SSE2-NEXT:    movaps %xmm1, %xmm0
498 ; SSE2-NEXT:    retq
499 ;
500 ; SSE3-LABEL: shuffle_v2i64_21_copy:
501 ; SSE3:       # BB#0:
502 ; SSE3-NEXT:    movsd %xmm2, %xmm1
503 ; SSE3-NEXT:    movaps %xmm1, %xmm0
504 ; SSE3-NEXT:    retq
505 ;
506 ; SSSE3-LABEL: shuffle_v2i64_21_copy:
507 ; SSSE3:       # BB#0:
508 ; SSSE3-NEXT:    movsd %xmm2, %xmm1
509 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
510 ; SSSE3-NEXT:    retq
511 ;
512 ; SSE41-LABEL: shuffle_v2i64_21_copy:
513 ; SSE41:       # BB#0:
514 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
515 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
516 ; SSE41-NEXT:    retq
517 ;
518 ; AVX1-LABEL: shuffle_v2i64_21_copy:
519 ; AVX1:       # BB#0:
520 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm1[4,5,6,7]
521 ; AVX1-NEXT:    retq
522 ;
523 ; AVX2-LABEL: shuffle_v2i64_21_copy:
524 ; AVX2:       # BB#0:
525 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3]
526 ; AVX2-NEXT:    retq
527   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>
528   ret <2 x i64> %shuffle
529 }
530 define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {
531 ; SSE2-LABEL: shuffle_v2i64_30:
532 ; SSE2:       # BB#0:
533 ; SSE2-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
534 ; SSE2-NEXT:    movapd %xmm1, %xmm0
535 ; SSE2-NEXT:    retq
536 ;
537 ; SSE3-LABEL: shuffle_v2i64_30:
538 ; SSE3:       # BB#0:
539 ; SSE3-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
540 ; SSE3-NEXT:    movapd %xmm1, %xmm0
541 ; SSE3-NEXT:    retq
542 ;
543 ; SSSE3-LABEL: shuffle_v2i64_30:
544 ; SSSE3:       # BB#0:
545 ; SSSE3-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
546 ; SSSE3-NEXT:    retq
547 ;
548 ; SSE41-LABEL: shuffle_v2i64_30:
549 ; SSE41:       # BB#0:
550 ; SSE41-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
551 ; SSE41-NEXT:    retq
552 ;
553 ; AVX-LABEL: shuffle_v2i64_30:
554 ; AVX:       # BB#0:
555 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
556 ; AVX-NEXT:    retq
557   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
558   ret <2 x i64> %shuffle
559 }
560 define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
561 ; SSE2-LABEL: shuffle_v2i64_30_copy:
562 ; SSE2:       # BB#0:
563 ; SSE2-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
564 ; SSE2-NEXT:    movapd %xmm2, %xmm0
565 ; SSE2-NEXT:    retq
566 ;
567 ; SSE3-LABEL: shuffle_v2i64_30_copy:
568 ; SSE3:       # BB#0:
569 ; SSE3-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0]
570 ; SSE3-NEXT:    movapd %xmm2, %xmm0
571 ; SSE3-NEXT:    retq
572 ;
573 ; SSSE3-LABEL: shuffle_v2i64_30_copy:
574 ; SSSE3:       # BB#0:
575 ; SSSE3-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
576 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
577 ; SSSE3-NEXT:    retq
578 ;
579 ; SSE41-LABEL: shuffle_v2i64_30_copy:
580 ; SSE41:       # BB#0:
581 ; SSE41-NEXT:    palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
582 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
583 ; SSE41-NEXT:    retq
584 ;
585 ; AVX-LABEL: shuffle_v2i64_30_copy:
586 ; AVX:       # BB#0:
587 ; AVX-NEXT:    vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
588 ; AVX-NEXT:    retq
589   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>
590   ret <2 x i64> %shuffle
591 }
592 define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {
593 ; SSE-LABEL: shuffle_v2i64_31:
594 ; SSE:       # BB#0:
595 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
596 ; SSE-NEXT:    movdqa %xmm1, %xmm0
597 ; SSE-NEXT:    retq
598 ;
599 ; AVX-LABEL: shuffle_v2i64_31:
600 ; AVX:       # BB#0:
601 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
602 ; AVX-NEXT:    retq
603   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
604   ret <2 x i64> %shuffle
605 }
606 define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {
607 ; SSE-LABEL: shuffle_v2i64_31_copy:
608 ; SSE:       # BB#0:
609 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]
610 ; SSE-NEXT:    movdqa %xmm2, %xmm0
611 ; SSE-NEXT:    retq
612 ;
613 ; AVX-LABEL: shuffle_v2i64_31_copy:
614 ; AVX:       # BB#0:
615 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm2[1],xmm1[1]
616 ; AVX-NEXT:    retq
617   %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
618   ret <2 x i64> %shuffle
619 }
620
621 define <2 x i64> @shuffle_v2i64_0z(<2 x i64> %a) {
622 ; SSE-LABEL: shuffle_v2i64_0z:
623 ; SSE:       # BB#0:
624 ; SSE-NEXT:    movq %xmm0, %xmm0
625 ; SSE-NEXT:    retq
626 ;
627 ; AVX-LABEL: shuffle_v2i64_0z:
628 ; AVX:       # BB#0:
629 ; AVX-NEXT:    vmovq %xmm0, %xmm0
630 ; AVX-NEXT:    retq
631   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
632   ret <2 x i64> %shuffle
633 }
634
635 define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) {
636 ; SSE-LABEL: shuffle_v2i64_1z:
637 ; SSE:       # BB#0:
638 ; SSE-NEXT:    pxor %xmm1, %xmm1
639 ; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
640 ; SSE-NEXT:    retq
641 ;
642 ; AVX-LABEL: shuffle_v2i64_1z:
643 ; AVX:       # BB#0:
644 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
645 ; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
646 ; AVX-NEXT:    retq
647   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3>
648   ret <2 x i64> %shuffle
649 }
650
651 define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) {
652 ; SSE-LABEL: shuffle_v2i64_z0:
653 ; SSE:       # BB#0:
654 ; SSE-NEXT:    movq %xmm0, %xmm0
655 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
656 ; SSE-NEXT:    retq
657 ;
658 ; AVX-LABEL: shuffle_v2i64_z0:
659 ; AVX:       # BB#0:
660 ; AVX-NEXT:    vmovq %xmm0, %xmm0
661 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
662 ; AVX-NEXT:    retq
663   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0>
664   ret <2 x i64> %shuffle
665 }
666
667 define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) {
668 ; SSE2-LABEL: shuffle_v2i64_z1:
669 ; SSE2:       # BB#0:
670 ; SSE2-NEXT:    xorps %xmm1, %xmm1
671 ; SSE2-NEXT:    movsd %xmm1, %xmm0
672 ; SSE2-NEXT:    retq
673 ;
674 ; SSE3-LABEL: shuffle_v2i64_z1:
675 ; SSE3:       # BB#0:
676 ; SSE3-NEXT:    xorps %xmm1, %xmm1
677 ; SSE3-NEXT:    movsd %xmm1, %xmm0
678 ; SSE3-NEXT:    retq
679 ;
680 ; SSSE3-LABEL: shuffle_v2i64_z1:
681 ; SSSE3:       # BB#0:
682 ; SSSE3-NEXT:    xorps %xmm1, %xmm1
683 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
684 ; SSSE3-NEXT:    retq
685 ;
686 ; SSE41-LABEL: shuffle_v2i64_z1:
687 ; SSE41:       # BB#0:
688 ; SSE41-NEXT:    pxor %xmm1, %xmm1
689 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
690 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
691 ; SSE41-NEXT:    retq
692 ;
693 ; AVX1-LABEL: shuffle_v2i64_z1:
694 ; AVX1:       # BB#0:
695 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
696 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
697 ; AVX1-NEXT:    retq
698 ;
699 ; AVX2-LABEL: shuffle_v2i64_z1:
700 ; AVX2:       # BB#0:
701 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
702 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
703 ; AVX2-NEXT:    retq
704   %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1>
705   ret <2 x i64> %shuffle
706 }
707
708 define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) {
709 ; SSE-LABEL: shuffle_v2f64_0z:
710 ; SSE:       # BB#0:
711 ; SSE-NEXT:    movq %xmm0, %xmm0
712 ; SSE-NEXT:    retq
713 ;
714 ; AVX-LABEL: shuffle_v2f64_0z:
715 ; AVX:       # BB#0:
716 ; AVX-NEXT:    vmovq %xmm0, %xmm0
717 ; AVX-NEXT:    retq
718   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
719   ret <2 x double> %shuffle
720 }
721
722 define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) {
723 ; SSE-LABEL: shuffle_v2f64_1z:
724 ; SSE:       # BB#0:
725 ; SSE-NEXT:    xorpd %xmm1, %xmm1
726 ; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
727 ; SSE-NEXT:    retq
728 ;
729 ; AVX-LABEL: shuffle_v2f64_1z:
730 ; AVX:       # BB#0:
731 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
732 ; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
733 ; AVX-NEXT:    retq
734   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>
735   ret <2 x double> %shuffle
736 }
737
738 define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) {
739 ; SSE-LABEL: shuffle_v2f64_z0:
740 ; SSE:       # BB#0:
741 ; SSE-NEXT:    xorpd %xmm1, %xmm1
742 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
743 ; SSE-NEXT:    movapd %xmm1, %xmm0
744 ; SSE-NEXT:    retq
745 ;
746 ; AVX-LABEL: shuffle_v2f64_z0:
747 ; AVX:       # BB#0:
748 ; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
749 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
750 ; AVX-NEXT:    retq
751   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0>
752   ret <2 x double> %shuffle
753 }
754
755 define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) {
756 ; SSE-LABEL: shuffle_v2f64_z1:
757 ; SSE:       # BB#0:
758 ; SSE-NEXT:    xorps %xmm1, %xmm1
759 ; SSE-NEXT:    movsd %xmm1, %xmm0
760 ; SSE-NEXT:    retq
761 ;
762 ; AVX-LABEL: shuffle_v2f64_z1:
763 ; AVX:       # BB#0:
764 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
765 ; AVX-NEXT:    vmovsd %xmm1, %xmm0, %xmm0
766 ; AVX-NEXT:    retq
767   %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>
768   ret <2 x double> %shuffle
769 }
770
771 define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {
772 ; SSE-LABEL: insert_reg_and_zero_v2i64:
773 ; SSE:       # BB#0:
774 ; SSE-NEXT:    movd %rdi, %xmm0
775 ; SSE-NEXT:    retq
776 ;
777 ; AVX-LABEL: insert_reg_and_zero_v2i64:
778 ; AVX:       # BB#0:
779 ; AVX-NEXT:    vmovq %rdi, %xmm0
780 ; AVX-NEXT:    retq
781   %v = insertelement <2 x i64> undef, i64 %a, i32 0
782   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
783   ret <2 x i64> %shuffle
784 }
785
786 define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) {
787 ; SSE-LABEL: insert_mem_and_zero_v2i64:
788 ; SSE:       # BB#0:
789 ; SSE-NEXT:    movq (%rdi), %xmm0
790 ; SSE-NEXT:    retq
791 ;
792 ; AVX-LABEL: insert_mem_and_zero_v2i64:
793 ; AVX:       # BB#0:
794 ; AVX-NEXT:    vmovq (%rdi), %xmm0
795 ; AVX-NEXT:    retq
796   %a = load i64* %ptr
797   %v = insertelement <2 x i64> undef, i64 %a, i32 0
798   %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>
799   ret <2 x i64> %shuffle
800 }
801
802 define <2 x double> @insert_reg_and_zero_v2f64(double %a) {
803 ; SSE-LABEL: insert_reg_and_zero_v2f64:
804 ; SSE:       # BB#0:
805 ; SSE-NEXT:    movq %xmm0, %xmm0
806 ; SSE-NEXT:    retq
807 ;
808 ; AVX-LABEL: insert_reg_and_zero_v2f64:
809 ; AVX:       # BB#0:
810 ; AVX-NEXT:    vmovq %xmm0, %xmm0
811 ; AVX-NEXT:    retq
812   %v = insertelement <2 x double> undef, double %a, i32 0
813   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
814   ret <2 x double> %shuffle
815 }
816
817 define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) {
818 ; SSE-LABEL: insert_mem_and_zero_v2f64:
819 ; SSE:       # BB#0:
820 ; SSE-NEXT:    movsd (%rdi), %xmm0
821 ; SSE-NEXT:    retq
822 ;
823 ; AVX-LABEL: insert_mem_and_zero_v2f64:
824 ; AVX:       # BB#0:
825 ; AVX-NEXT:    vmovsd (%rdi), %xmm0
826 ; AVX-NEXT:    retq
827   %a = load double* %ptr
828   %v = insertelement <2 x double> undef, double %a, i32 0
829   %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>
830   ret <2 x double> %shuffle
831 }
832
833 define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) {
834 ; SSE2-LABEL: insert_reg_lo_v2i64:
835 ; SSE2:       # BB#0:
836 ; SSE2-NEXT:    movd %rdi, %xmm1
837 ; SSE2-NEXT:    movsd %xmm1, %xmm0
838 ; SSE2-NEXT:    retq
839 ;
840 ; SSE3-LABEL: insert_reg_lo_v2i64:
841 ; SSE3:       # BB#0:
842 ; SSE3-NEXT:    movd %rdi, %xmm1
843 ; SSE3-NEXT:    movsd %xmm1, %xmm0
844 ; SSE3-NEXT:    retq
845 ;
846 ; SSSE3-LABEL: insert_reg_lo_v2i64:
847 ; SSSE3:       # BB#0:
848 ; SSSE3-NEXT:    movd %rdi, %xmm1
849 ; SSSE3-NEXT:    movsd %xmm1, %xmm0
850 ; SSSE3-NEXT:    retq
851 ;
852 ; SSE41-LABEL: insert_reg_lo_v2i64:
853 ; SSE41:       # BB#0:
854 ; SSE41-NEXT:    movd %rdi, %xmm1
855 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
856 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
857 ; SSE41-NEXT:    retq
858 ;
859 ; AVX1-LABEL: insert_reg_lo_v2i64:
860 ; AVX1:       # BB#0:
861 ; AVX1-NEXT:    vmovq %rdi, %xmm1
862 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
863 ; AVX1-NEXT:    retq
864 ;
865 ; AVX2-LABEL: insert_reg_lo_v2i64:
866 ; AVX2:       # BB#0:
867 ; AVX2-NEXT:    vmovq %rdi, %xmm1
868 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
869 ; AVX2-NEXT:    retq
870   %v = insertelement <2 x i64> undef, i64 %a, i32 0
871   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
872   ret <2 x i64> %shuffle
873 }
874
875 define <2 x i64> @insert_mem_lo_v2i64(i64* %ptr, <2 x i64> %b) {
876 ; SSE2-LABEL: insert_mem_lo_v2i64:
877 ; SSE2:       # BB#0:
878 ; SSE2-NEXT:    movlpd (%rdi), %xmm0
879 ; SSE2-NEXT:    retq
880 ;
881 ; SSE3-LABEL: insert_mem_lo_v2i64:
882 ; SSE3:       # BB#0:
883 ; SSE3-NEXT:    movlpd (%rdi), %xmm0
884 ; SSE3-NEXT:    retq
885 ;
886 ; SSSE3-LABEL: insert_mem_lo_v2i64:
887 ; SSSE3:       # BB#0:
888 ; SSSE3-NEXT:    movlpd (%rdi), %xmm0
889 ; SSSE3-NEXT:    retq
890 ;
891 ; SSE41-LABEL: insert_mem_lo_v2i64:
892 ; SSE41:       # BB#0:
893 ; SSE41-NEXT:    movq (%rdi), %xmm1
894 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5,6,7]
895 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
896 ; SSE41-NEXT:    retq
897 ;
898 ; AVX1-LABEL: insert_mem_lo_v2i64:
899 ; AVX1:       # BB#0:
900 ; AVX1-NEXT:    vmovq (%rdi), %xmm1
901 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
902 ; AVX1-NEXT:    retq
903 ;
904 ; AVX2-LABEL: insert_mem_lo_v2i64:
905 ; AVX2:       # BB#0:
906 ; AVX2-NEXT:    vmovq (%rdi), %xmm1
907 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
908 ; AVX2-NEXT:    retq
909   %a = load i64* %ptr
910   %v = insertelement <2 x i64> undef, i64 %a, i32 0
911   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>
912   ret <2 x i64> %shuffle
913 }
914
915 define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) {
916 ; SSE-LABEL: insert_reg_hi_v2i64:
917 ; SSE:       # BB#0:
918 ; SSE-NEXT:    movd %rdi, %xmm1
919 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
920 ; SSE-NEXT:    retq
921 ;
922 ; AVX-LABEL: insert_reg_hi_v2i64:
923 ; AVX:       # BB#0:
924 ; AVX-NEXT:    vmovq %rdi, %xmm1
925 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
926 ; AVX-NEXT:    retq
927   %v = insertelement <2 x i64> undef, i64 %a, i32 0
928   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
929   ret <2 x i64> %shuffle
930 }
931
932 define <2 x i64> @insert_mem_hi_v2i64(i64* %ptr, <2 x i64> %b) {
933 ; SSE-LABEL: insert_mem_hi_v2i64:
934 ; SSE:       # BB#0:
935 ; SSE-NEXT:    movq (%rdi), %xmm1
936 ; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
937 ; SSE-NEXT:    retq
938 ;
939 ; AVX-LABEL: insert_mem_hi_v2i64:
940 ; AVX:       # BB#0:
941 ; AVX-NEXT:    vmovq (%rdi), %xmm1
942 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
943 ; AVX-NEXT:    retq
944   %a = load i64* %ptr
945   %v = insertelement <2 x i64> undef, i64 %a, i32 0
946   %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>
947   ret <2 x i64> %shuffle
948 }
949
950 define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) {
951 ; SSE-LABEL: insert_reg_lo_v2f64:
952 ; SSE:       # BB#0:
953 ; SSE-NEXT:    movsd %xmm0, %xmm1
954 ; SSE-NEXT:    movaps %xmm1, %xmm0
955 ; SSE-NEXT:    retq
956 ;
957 ; AVX-LABEL: insert_reg_lo_v2f64:
958 ; AVX:       # BB#0:
959 ; AVX-NEXT:    vmovsd %xmm0, %xmm1, %xmm0
960 ; AVX-NEXT:    retq
961   %v = insertelement <2 x double> undef, double %a, i32 0
962   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
963   ret <2 x double> %shuffle
964 }
965
966 define <2 x double> @insert_mem_lo_v2f64(double* %ptr, <2 x double> %b) {
967 ; SSE-LABEL: insert_mem_lo_v2f64:
968 ; SSE:       # BB#0:
969 ; SSE-NEXT:    movlpd (%rdi), %xmm0
970 ; SSE-NEXT:    retq
971 ;
972 ; AVX-LABEL: insert_mem_lo_v2f64:
973 ; AVX:       # BB#0:
974 ; AVX-NEXT:    vmovlpd (%rdi), %xmm0, %xmm0
975 ; AVX-NEXT:    retq
976   %a = load double* %ptr
977   %v = insertelement <2 x double> undef, double %a, i32 0
978   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>
979   ret <2 x double> %shuffle
980 }
981
982 define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) {
983 ; SSE-LABEL: insert_reg_hi_v2f64:
984 ; SSE:       # BB#0:
985 ; SSE-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
986 ; SSE-NEXT:    movapd %xmm1, %xmm0
987 ; SSE-NEXT:    retq
988 ;
989 ; AVX-LABEL: insert_reg_hi_v2f64:
990 ; AVX:       # BB#0:
991 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]
992 ; AVX-NEXT:    retq
993   %v = insertelement <2 x double> undef, double %a, i32 0
994   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
995   ret <2 x double> %shuffle
996 }
997
998 define <2 x double> @insert_mem_hi_v2f64(double* %ptr, <2 x double> %b) {
999 ; SSE-LABEL: insert_mem_hi_v2f64:
1000 ; SSE:       # BB#0:
1001 ; SSE-NEXT:    movhpd (%rdi), %xmm0
1002 ; SSE-NEXT:    retq
1003 ;
1004 ; AVX-LABEL: insert_mem_hi_v2f64:
1005 ; AVX:       # BB#0:
1006 ; AVX-NEXT:    vmovhpd (%rdi), %xmm0, %xmm0
1007 ; AVX-NEXT:    retq
1008   %a = load double* %ptr
1009   %v = insertelement <2 x double> undef, double %a, i32 0
1010   %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>
1011   ret <2 x double> %shuffle
1012 }
1013
1014 define <2 x double> @insert_dup_reg_v2f64(double %a) {
1015 ; FIXME: We should match movddup for SSE3 and higher here.
1016 ;
1017 ; SSE2-LABEL: insert_dup_reg_v2f64:
1018 ; SSE2:       # BB#0:
1019 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1020 ; SSE2-NEXT:    retq
1021 ;
1022 ; SSE3-LABEL: insert_dup_reg_v2f64:
1023 ; SSE3:       # BB#0:
1024 ; SSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1025 ; SSE3-NEXT:    retq
1026 ;
1027 ; SSSE3-LABEL: insert_dup_reg_v2f64:
1028 ; SSSE3:       # BB#0:
1029 ; SSSE3-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1030 ; SSSE3-NEXT:    retq
1031 ;
1032 ; SSE41-LABEL: insert_dup_reg_v2f64:
1033 ; SSE41:       # BB#0:
1034 ; SSE41-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1035 ; SSE41-NEXT:    retq
1036 ;
1037 ; AVX-LABEL: insert_dup_reg_v2f64:
1038 ; AVX:       # BB#0:
1039 ; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0,0]
1040 ; AVX-NEXT:    retq
1041   %v = insertelement <2 x double> undef, double %a, i32 0
1042   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1043   ret <2 x double> %shuffle
1044 }
1045 define <2 x double> @insert_dup_mem_v2f64(double* %ptr) {
1046 ; SSE2-LABEL: insert_dup_mem_v2f64:
1047 ; SSE2:       # BB#0:
1048 ; SSE2-NEXT:    movsd (%rdi), %xmm0
1049 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
1050 ; SSE2-NEXT:    retq
1051 ;
1052 ; SSE3-LABEL: insert_dup_mem_v2f64:
1053 ; SSE3:       # BB#0:
1054 ; SSE3-NEXT:    movddup (%rdi), %xmm0
1055 ; SSE3-NEXT:    retq
1056 ;
1057 ; SSSE3-LABEL: insert_dup_mem_v2f64:
1058 ; SSSE3:       # BB#0:
1059 ; SSSE3-NEXT:    movddup (%rdi), %xmm0
1060 ; SSSE3-NEXT:    retq
1061 ;
1062 ; SSE41-LABEL: insert_dup_mem_v2f64:
1063 ; SSE41:       # BB#0:
1064 ; SSE41-NEXT:    movddup (%rdi), %xmm0
1065 ; SSE41-NEXT:    retq
1066 ;
1067 ; AVX-LABEL: insert_dup_mem_v2f64:
1068 ; AVX:       # BB#0:
1069 ; AVX-NEXT:    vmovddup (%rdi), %xmm0
1070 ; AVX-NEXT:    retq
1071   %a = load double* %ptr
1072   %v = insertelement <2 x double> undef, double %a, i32 0
1073   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
1074   ret <2 x double> %shuffle
1075 }
1076
1077 define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) {
1078 ; SSE-LABEL: shuffle_mem_v2f64_10:
1079 ; SSE:       # BB#0:
1080 ; SSE-NEXT:    movapd (%rdi), %xmm0
1081 ; SSE-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
1082 ; SSE-NEXT:    retq
1083 ;
1084 ; AVX-LABEL: shuffle_mem_v2f64_10:
1085 ; AVX:       # BB#0:
1086 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = mem[1,0]
1087 ; AVX-NEXT:    retq
1088   %a = load <2 x double>* %ptr
1089   %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0>
1090   ret <2 x double> %shuffle
1091 }