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