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