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