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