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