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