1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s
3; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s
4
5define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
6; CHECK-LABEL: test1:
7; CHECK:       # BB#0:
8; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
9; CHECK-NEXT:    retl
10;
11; CHECK-YONAH-LABEL: test1:
12; CHECK-YONAH:       # BB#0:
13; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
14; CHECK-YONAH-NEXT:    retl
15  %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 >
16	ret <4 x i32> %C
17}
18
19define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
20; CHECK-LABEL: test2:
21; CHECK:       # BB#0:
22; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
23; CHECK-NEXT:    movdqa %xmm1, %xmm0
24; CHECK-NEXT:    retl
25;
26; CHECK-YONAH-LABEL: test2:
27; CHECK-YONAH:       # BB#0:
28; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
29; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
30; CHECK-YONAH-NEXT:    retl
31  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 >
32	ret <4 x i32> %C
33}
34
35define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
36; CHECK-LABEL: test3:
37; CHECK:       # BB#0:
38; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
39; CHECK-NEXT:    movdqa %xmm1, %xmm0
40; CHECK-NEXT:    retl
41;
42; CHECK-YONAH-LABEL: test3:
43; CHECK-YONAH:       # BB#0:
44; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
45; CHECK-YONAH-NEXT:    retl
46  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 >
47	ret <4 x i32> %C
48}
49
50define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
51; CHECK-LABEL: test4:
52; CHECK:       # BB#0:
53; CHECK-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
54; CHECK-NEXT:    retl
55;
56; CHECK-YONAH-LABEL: test4:
57; CHECK-YONAH:       # BB#0:
58; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
59; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
60; CHECK-YONAH-NEXT:    retl
61  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
62	ret <4 x i32> %C
63}
64
65define <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind {
66; CHECK-LABEL: test5:
67; CHECK:       # BB#0:
68; CHECK-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
69; CHECK-NEXT:    movapd %xmm1, %xmm0
70; CHECK-NEXT:    retl
71;
72; CHECK-YONAH-LABEL: test5:
73; CHECK-YONAH:       # BB#0:
74; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
75; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
76; CHECK-YONAH-NEXT:    retl
77  %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
78	ret <4 x float> %C
79}
80
81define <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind {
82; CHECK-LABEL: test6:
83; CHECK:       # BB#0:
84; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
85; CHECK-NEXT:    movdqa %xmm1, %xmm0
86; CHECK-NEXT:    retl
87;
88; CHECK-YONAH-LABEL: test6:
89; CHECK-YONAH:       # BB#0:
90; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
91; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
92; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
93; CHECK-YONAH-NEXT:    retl
94  %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 3, i32 4, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10 >
95	ret <8 x i16> %C
96}
97
98define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind {
99; CHECK-LABEL: test7:
100; CHECK:       # BB#0:
101; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
102; CHECK-NEXT:    movdqa %xmm1, %xmm0
103; CHECK-NEXT:    retl
104;
105; CHECK-YONAH-LABEL: test7:
106; CHECK-YONAH:       # BB#0:
107; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
108; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
109; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
110; CHECK-YONAH-NEXT:    retl
111  %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 undef, i32 6, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12 >
112	ret <8 x i16> %C
113}
114
115define <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind {
116; CHECK-LABEL: test8:
117; CHECK:       # BB#0:
118; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
119; CHECK-NEXT:    movdqa %xmm1, %xmm0
120; CHECK-NEXT:    retl
121;
122; CHECK-YONAH-LABEL: test8:
123; CHECK-YONAH:       # BB#0:
124; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
125; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4]
126; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
127; CHECK-YONAH-NEXT:    retl
128  %C = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> < i32 5, i32 6, i32 7, i32 undef, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20 >
129	ret <16 x i8> %C
130}
131
132; Check that we don't do unary (circular on single operand) palignr incorrectly.
133; (It is possible, but before this testcase was committed, it was being done
134; incorrectly.  In particular, one of the operands of the palignr node
135; was an UNDEF.)
136define <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind {
137; CHECK-LABEL: test9:
138; CHECK:       # BB#0:
139; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]
140; CHECK-NEXT:    movdqa %xmm1, %xmm0
141; CHECK-NEXT:    retl
142;
143; CHECK-YONAH-LABEL: test9:
144; CHECK-YONAH:       # BB#0:
145; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
146; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
147; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
148; CHECK-YONAH-NEXT:    por %xmm0, %xmm1
149; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
150; CHECK-YONAH-NEXT:    retl
151  %C = shufflevector <8 x i16> %B, <8 x i16> %A, <8 x i32> < i32 undef, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0 >
152	ret <8 x i16> %C
153}
154
155