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