[AVX512] Bring back vector-shuffle lowering support through broadcasts
[oota-llvm.git] / test / CodeGen / X86 / palignr.ll
1 ; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s
2 ; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s
3
4 define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
5 ; CHECK-LABEL: test1:
6 ; CHECK:       # BB#0:
7 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
8 ; CHECK-NEXT:    retl
9 ;
10 ; CHECK-YONAH-LABEL: test1:
11 ; CHECK-YONAH:       # BB#0:
12 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
13 ; CHECK-YONAH-NEXT:    retl
14   %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 >
15         ret <4 x i32> %C
16 }
17
18 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
19 ; CHECK-LABEL: test2:
20 ; CHECK:       # BB#0:
21 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
22 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
23 ; CHECK-NEXT:    retl
24 ;
25 ; CHECK-YONAH-LABEL: test2:
26 ; CHECK-YONAH:       # BB#0:
27 ; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
28 ; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
29 ; CHECK-YONAH-NEXT:    retl
30   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 >
31         ret <4 x i32> %C
32 }
33
34 define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
35 ; CHECK-LABEL: test3:
36 ; CHECK:       # BB#0:
37 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
38 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
39 ; CHECK-NEXT:    retl
40 ;
41 ; CHECK-YONAH-LABEL: test3:
42 ; CHECK-YONAH:       # BB#0:
43 ; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
44 ; CHECK-YONAH-NEXT:    retl
45   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 >
46         ret <4 x i32> %C
47 }
48
49 define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
50 ; CHECK-LABEL: test4:
51 ; CHECK:       # BB#0:
52 ; CHECK-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
53 ; CHECK-NEXT:    retl
54 ;
55 ; CHECK-YONAH-LABEL: test4:
56 ; CHECK-YONAH:       # BB#0:
57 ; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
58 ; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
59 ; CHECK-YONAH-NEXT:    retl
60   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
61         ret <4 x i32> %C
62 }
63
64 define <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind {
65 ; CHECK-LABEL: test5:
66 ; CHECK:       # BB#0:
67 ; CHECK-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
68 ; CHECK-NEXT:    movapd %xmm1, %xmm0
69 ; CHECK-NEXT:    retl
70 ;
71 ; CHECK-YONAH-LABEL: test5:
72 ; CHECK-YONAH:       # BB#0:
73 ; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
74 ; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
75 ; CHECK-YONAH-NEXT:    retl
76   %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
77         ret <4 x float> %C
78 }
79
80 define <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind {
81 ; CHECK-LABEL: test6:
82 ; CHECK:       # BB#0:
83 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
84 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
85 ; CHECK-NEXT:    retl
86 ;
87 ; CHECK-YONAH-LABEL: test6:
88 ; CHECK-YONAH:       # BB#0:
89 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
90 ; CHECK-YONAH-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
91 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
92 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,7,6,7]
93 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
94 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[3,0,1,2,4,5,6,7]
95 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
96 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
97 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,0,2,1,4,5,6,7]
98 ; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
99 ; CHECK-YONAH-NEXT:    retl
100   %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 >
101         ret <8 x i16> %C
102 }
103
104 define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind {
105 ; CHECK-LABEL: test7:
106 ; CHECK:       # BB#0:
107 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
108 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
109 ; CHECK-NEXT:    retl
110 ;
111 ; CHECK-YONAH-LABEL: test7:
112 ; CHECK-YONAH:       # BB#0:
113 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
114 ; CHECK-YONAH-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
115 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
116 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,1,4,5,6,7]
117 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,1,2,0]
118 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,7,6,7]
119 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,2,3]
120 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[1,2,3,0,4,5,6,7]
121 ; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
122 ; CHECK-YONAH-NEXT:    retl
123   %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 >
124         ret <8 x i16> %C
125 }
126
127 define <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind {
128 ; CHECK-LABEL: test8:
129 ; CHECK:       # BB#0:
130 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
131 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
132 ; CHECK-NEXT:    retl
133 ;
134 ; CHECK-YONAH-LABEL: test8:
135 ; CHECK-YONAH:       # BB#0:
136 ; CHECK-YONAH-NEXT:    pxor %xmm3, %xmm3
137 ; CHECK-YONAH-NEXT:    movdqa %xmm0, %xmm2
138 ; CHECK-YONAH-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
139 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
140 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,2,3,3,4,5,6,7]
141 ; CHECK-YONAH-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15]
142 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[3,1,2,0]
143 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,7,6,7]
144 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,1,2,3]
145 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[1,2,3,0,4,5,6,7]
146 ; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
147 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
148 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,2,3,3,4,5,6,7]
149 ; CHECK-YONAH-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
150 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,1,2,0]
151 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,7,6,7]
152 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,3,2,1]
153 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,2,2,4,5,6,7]
154 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,6,7,4]
155 ; CHECK-YONAH-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
156 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
157 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,7]
158 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
159 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
160 ; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
161 ; CHECK-YONAH-NEXT:    packuswb %xmm0, %xmm2
162 ; CHECK-YONAH-NEXT:    movdqa %xmm2, %xmm0
163 ; CHECK-YONAH-NEXT:    retl
164   %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 >
165         ret <16 x i8> %C
166 }
167
168 ; Check that we don't do unary (circular on single operand) palignr incorrectly.
169 ; (It is possible, but before this testcase was committed, it was being done
170 ; incorrectly.  In particular, one of the operands of the palignr node
171 ; was an UNDEF.)
172 define <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind {
173 ; CHECK-LABEL: test9:
174 ; CHECK:       # BB#0:
175 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]
176 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
177 ; CHECK-NEXT:    retl
178 ;
179 ; CHECK-YONAH-LABEL: test9:
180 ; CHECK-YONAH:       # BB#0:
181 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,1,3]
182 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,3,4,5,6,7]
183 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
184 ; CHECK-YONAH-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,1,2,4,5,6,7]
185 ; CHECK-YONAH-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,6,7,4]
186 ; CHECK-YONAH-NEXT:    retl
187   %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 >
188         ret <8 x i16> %C
189 }
190