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