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