f55b054deb0694340b7c43c18381b19354938cfe
[oota-llvm.git] / test / CodeGen / X86 / vector-popcnt-128.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
8 target triple = "x86_64-unknown-unknown"
9
10 define <2 x i64> @testv2i64(<2 x i64> %in) {
11 ; SSE2-LABEL: testv2i64:
12 ; SSE2:       # BB#0:
13 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
14 ; SSE2-NEXT:    psrlq $1, %xmm1
15 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
16 ; SSE2-NEXT:    psubq %xmm1, %xmm0
17 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323]
18 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
19 ; SSE2-NEXT:    pand %xmm1, %xmm2
20 ; SSE2-NEXT:    psrlq $2, %xmm0
21 ; SSE2-NEXT:    pand %xmm1, %xmm0
22 ; SSE2-NEXT:    paddq %xmm2, %xmm0
23 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
24 ; SSE2-NEXT:    psrlq $4, %xmm1
25 ; SSE2-NEXT:    paddq %xmm0, %xmm1
26 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
27 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
28 ; SSE2-NEXT:    psllq $32, %xmm0
29 ; SSE2-NEXT:    paddb %xmm1, %xmm0
30 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
31 ; SSE2-NEXT:    psllq $16, %xmm1
32 ; SSE2-NEXT:    paddb %xmm0, %xmm1
33 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
34 ; SSE2-NEXT:    psllq $8, %xmm0
35 ; SSE2-NEXT:    paddb %xmm1, %xmm0
36 ; SSE2-NEXT:    psrlq $56, %xmm0
37 ; SSE2-NEXT:    retq
38 ;
39 ; SSE3-LABEL: testv2i64:
40 ; SSE3:       # BB#0:
41 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
42 ; SSE3-NEXT:    psrlq $1, %xmm1
43 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
44 ; SSE3-NEXT:    psubq %xmm1, %xmm0
45 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323]
46 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
47 ; SSE3-NEXT:    pand %xmm1, %xmm2
48 ; SSE3-NEXT:    psrlq $2, %xmm0
49 ; SSE3-NEXT:    pand %xmm1, %xmm0
50 ; SSE3-NEXT:    paddq %xmm2, %xmm0
51 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
52 ; SSE3-NEXT:    psrlq $4, %xmm1
53 ; SSE3-NEXT:    paddq %xmm0, %xmm1
54 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
55 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
56 ; SSE3-NEXT:    psllq $32, %xmm0
57 ; SSE3-NEXT:    paddb %xmm1, %xmm0
58 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
59 ; SSE3-NEXT:    psllq $16, %xmm1
60 ; SSE3-NEXT:    paddb %xmm0, %xmm1
61 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
62 ; SSE3-NEXT:    psllq $8, %xmm0
63 ; SSE3-NEXT:    paddb %xmm1, %xmm0
64 ; SSE3-NEXT:    psrlq $56, %xmm0
65 ; SSE3-NEXT:    retq
66 ;
67 ; SSSE3-LABEL: testv2i64:
68 ; SSSE3:       # BB#0:
69 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
70 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
71 ; SSSE3-NEXT:    pand %xmm1, %xmm2
72 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
73 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
74 ; SSSE3-NEXT:    pshufb %xmm2, %xmm4
75 ; SSSE3-NEXT:    psrlw $4, %xmm0
76 ; SSSE3-NEXT:    pand %xmm1, %xmm0
77 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
78 ; SSSE3-NEXT:    paddb %xmm4, %xmm3
79 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
80 ; SSSE3-NEXT:    psadbw %xmm3, %xmm0
81 ; SSSE3-NEXT:    retq
82 ;
83 ; SSE41-LABEL: testv2i64:
84 ; SSE41:       # BB#0:
85 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
86 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
87 ; SSE41-NEXT:    pand %xmm1, %xmm2
88 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
89 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
90 ; SSE41-NEXT:    pshufb %xmm2, %xmm4
91 ; SSE41-NEXT:    psrlw $4, %xmm0
92 ; SSE41-NEXT:    pand %xmm1, %xmm0
93 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
94 ; SSE41-NEXT:    paddb %xmm4, %xmm3
95 ; SSE41-NEXT:    pxor %xmm0, %xmm0
96 ; SSE41-NEXT:    psadbw %xmm3, %xmm0
97 ; SSE41-NEXT:    retq
98 ;
99 ; AVX-LABEL: testv2i64:
100 ; AVX:       # BB#0:
101 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
102 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
103 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
104 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
105 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
106 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
107 ; AVX-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
108 ; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
109 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
110 ; AVX-NEXT:    vpsadbw %xmm0, %xmm1, %xmm0
111 ; AVX-NEXT:    retq
112   %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %in)
113   ret <2 x i64> %out
114 }
115
116 define <4 x i32> @testv4i32(<4 x i32> %in) {
117 ; SSE2-LABEL: testv4i32:
118 ; SSE2:       # BB#0:
119 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
120 ; SSE2-NEXT:    psrld $1, %xmm1
121 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
122 ; SSE2-NEXT:    psubd %xmm1, %xmm0
123 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [858993459,858993459,858993459,858993459]
124 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
125 ; SSE2-NEXT:    pand %xmm1, %xmm2
126 ; SSE2-NEXT:    psrld $2, %xmm0
127 ; SSE2-NEXT:    pand %xmm1, %xmm0
128 ; SSE2-NEXT:    paddd %xmm2, %xmm0
129 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
130 ; SSE2-NEXT:    psrld $4, %xmm1
131 ; SSE2-NEXT:    paddd %xmm0, %xmm1
132 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
133 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
134 ; SSE2-NEXT:    psllq $16, %xmm2
135 ; SSE2-NEXT:    paddb %xmm1, %xmm2
136 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
137 ; SSE2-NEXT:    psllq $8, %xmm0
138 ; SSE2-NEXT:    paddb %xmm2, %xmm0
139 ; SSE2-NEXT:    psrld $24, %xmm0
140 ; SSE2-NEXT:    retq
141 ;
142 ; SSE3-LABEL: testv4i32:
143 ; SSE3:       # BB#0:
144 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
145 ; SSE3-NEXT:    psrld $1, %xmm1
146 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
147 ; SSE3-NEXT:    psubd %xmm1, %xmm0
148 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [858993459,858993459,858993459,858993459]
149 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
150 ; SSE3-NEXT:    pand %xmm1, %xmm2
151 ; SSE3-NEXT:    psrld $2, %xmm0
152 ; SSE3-NEXT:    pand %xmm1, %xmm0
153 ; SSE3-NEXT:    paddd %xmm2, %xmm0
154 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
155 ; SSE3-NEXT:    psrld $4, %xmm1
156 ; SSE3-NEXT:    paddd %xmm0, %xmm1
157 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
158 ; SSE3-NEXT:    movdqa %xmm1, %xmm2
159 ; SSE3-NEXT:    psllq $16, %xmm2
160 ; SSE3-NEXT:    paddb %xmm1, %xmm2
161 ; SSE3-NEXT:    movdqa %xmm2, %xmm0
162 ; SSE3-NEXT:    psllq $8, %xmm0
163 ; SSE3-NEXT:    paddb %xmm2, %xmm0
164 ; SSE3-NEXT:    psrld $24, %xmm0
165 ; SSE3-NEXT:    retq
166 ;
167 ; SSSE3-LABEL: testv4i32:
168 ; SSSE3:       # BB#0:
169 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
170 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
171 ; SSSE3-NEXT:    pand %xmm2, %xmm3
172 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
173 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
174 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
175 ; SSSE3-NEXT:    psrlw $4, %xmm0
176 ; SSSE3-NEXT:    pand %xmm2, %xmm0
177 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
178 ; SSSE3-NEXT:    paddb %xmm4, %xmm1
179 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
180 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
181 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
182 ; SSSE3-NEXT:    psadbw %xmm0, %xmm2
183 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
184 ; SSSE3-NEXT:    psadbw %xmm0, %xmm1
185 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
186 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
187 ; SSSE3-NEXT:    retq
188 ;
189 ; SSE41-LABEL: testv4i32:
190 ; SSE41:       # BB#0:
191 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
192 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
193 ; SSE41-NEXT:    pand %xmm2, %xmm3
194 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
195 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
196 ; SSE41-NEXT:    pshufb %xmm3, %xmm4
197 ; SSE41-NEXT:    psrlw $4, %xmm0
198 ; SSE41-NEXT:    pand %xmm2, %xmm0
199 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
200 ; SSE41-NEXT:    paddb %xmm4, %xmm1
201 ; SSE41-NEXT:    pxor %xmm0, %xmm0
202 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
203 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
204 ; SSE41-NEXT:    psadbw %xmm0, %xmm2
205 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
206 ; SSE41-NEXT:    psadbw %xmm0, %xmm1
207 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
208 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
209 ; SSE41-NEXT:    retq
210 ;
211 ; AVX-LABEL: testv4i32:
212 ; AVX:       # BB#0:
213 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
214 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
215 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
216 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
217 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
218 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
219 ; AVX-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
220 ; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
221 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
222 ; AVX-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
223 ; AVX-NEXT:    vpsadbw %xmm2, %xmm1, %xmm2
224 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
225 ; AVX-NEXT:    vpsadbw %xmm0, %xmm1, %xmm0
226 ; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
227 ; AVX-NEXT:    retq
228   %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %in)
229   ret <4 x i32> %out
230 }
231
232 define <8 x i16> @testv8i16(<8 x i16> %in) {
233 ; SSE2-LABEL: testv8i16:
234 ; SSE2:       # BB#0:
235 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
236 ; SSE2-NEXT:    psrlw $1, %xmm1
237 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
238 ; SSE2-NEXT:    psubw %xmm1, %xmm0
239 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [13107,13107,13107,13107,13107,13107,13107,13107]
240 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
241 ; SSE2-NEXT:    pand %xmm1, %xmm2
242 ; SSE2-NEXT:    psrlw $2, %xmm0
243 ; SSE2-NEXT:    pand %xmm1, %xmm0
244 ; SSE2-NEXT:    paddw %xmm2, %xmm0
245 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
246 ; SSE2-NEXT:    psrlw $4, %xmm1
247 ; SSE2-NEXT:    paddw %xmm0, %xmm1
248 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
249 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
250 ; SSE2-NEXT:    psllq $8, %xmm0
251 ; SSE2-NEXT:    paddb %xmm1, %xmm0
252 ; SSE2-NEXT:    psrlw $8, %xmm0
253 ; SSE2-NEXT:    retq
254 ;
255 ; SSE3-LABEL: testv8i16:
256 ; SSE3:       # BB#0:
257 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
258 ; SSE3-NEXT:    psrlw $1, %xmm1
259 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
260 ; SSE3-NEXT:    psubw %xmm1, %xmm0
261 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [13107,13107,13107,13107,13107,13107,13107,13107]
262 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
263 ; SSE3-NEXT:    pand %xmm1, %xmm2
264 ; SSE3-NEXT:    psrlw $2, %xmm0
265 ; SSE3-NEXT:    pand %xmm1, %xmm0
266 ; SSE3-NEXT:    paddw %xmm2, %xmm0
267 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
268 ; SSE3-NEXT:    psrlw $4, %xmm1
269 ; SSE3-NEXT:    paddw %xmm0, %xmm1
270 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
271 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
272 ; SSE3-NEXT:    psllq $8, %xmm0
273 ; SSE3-NEXT:    paddb %xmm1, %xmm0
274 ; SSE3-NEXT:    psrlw $8, %xmm0
275 ; SSE3-NEXT:    retq
276 ;
277 ; SSSE3-LABEL: testv8i16:
278 ; SSSE3:       # BB#0:
279 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
280 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
281 ; SSSE3-NEXT:    pand %xmm2, %xmm3
282 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
283 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
284 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
285 ; SSSE3-NEXT:    psrlw $4, %xmm0
286 ; SSSE3-NEXT:    pand %xmm2, %xmm0
287 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
288 ; SSSE3-NEXT:    paddb %xmm4, %xmm1
289 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
290 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
291 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
292 ; SSSE3-NEXT:    paddb %xmm0, %xmm1
293 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
294 ; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
295 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
296 ; SSSE3-NEXT:    retq
297 ;
298 ; SSE41-LABEL: testv8i16:
299 ; SSE41:       # BB#0:
300 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
301 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
302 ; SSE41-NEXT:    pand %xmm1, %xmm2
303 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
304 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
305 ; SSE41-NEXT:    pshufb %xmm2, %xmm4
306 ; SSE41-NEXT:    psrlw $4, %xmm0
307 ; SSE41-NEXT:    pand %xmm1, %xmm0
308 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
309 ; SSE41-NEXT:    paddb %xmm4, %xmm3
310 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
311 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
312 ; SSE41-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
313 ; SSE41-NEXT:    paddb %xmm0, %xmm3
314 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
315 ; SSE41-NEXT:    retq
316 ;
317 ; AVX-LABEL: testv8i16:
318 ; AVX:       # BB#0:
319 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
320 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
321 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
322 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
323 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
324 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
325 ; AVX-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
326 ; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
327 ; AVX-NEXT:    vpshufb {{.*#+}} xmm1 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
328 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
329 ; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
330 ; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
331 ; AVX-NEXT:    retq
332   %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %in)
333   ret <8 x i16> %out
334 }
335
336 define <16 x i8> @testv16i8(<16 x i8> %in) {
337 ; SSE2-LABEL: testv16i8:
338 ; SSE2:       # BB#0:
339 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
340 ; SSE2-NEXT:    psrlw $1, %xmm1
341 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
342 ; SSE2-NEXT:    psubb %xmm1, %xmm0
343 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
344 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
345 ; SSE2-NEXT:    pand %xmm1, %xmm2
346 ; SSE2-NEXT:    psrlw $2, %xmm0
347 ; SSE2-NEXT:    pand %xmm1, %xmm0
348 ; SSE2-NEXT:    paddb %xmm2, %xmm0
349 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
350 ; SSE2-NEXT:    psrlw $4, %xmm1
351 ; SSE2-NEXT:    paddb %xmm0, %xmm1
352 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
353 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
354 ; SSE2-NEXT:    retq
355 ;
356 ; SSE3-LABEL: testv16i8:
357 ; SSE3:       # BB#0:
358 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
359 ; SSE3-NEXT:    psrlw $1, %xmm1
360 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
361 ; SSE3-NEXT:    psubb %xmm1, %xmm0
362 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
363 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
364 ; SSE3-NEXT:    pand %xmm1, %xmm2
365 ; SSE3-NEXT:    psrlw $2, %xmm0
366 ; SSE3-NEXT:    pand %xmm1, %xmm0
367 ; SSE3-NEXT:    paddb %xmm2, %xmm0
368 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
369 ; SSE3-NEXT:    psrlw $4, %xmm1
370 ; SSE3-NEXT:    paddb %xmm0, %xmm1
371 ; SSE3-NEXT:    pand {{.*}}(%rip), %xmm1
372 ; SSE3-NEXT:    movdqa %xmm1, %xmm0
373 ; SSE3-NEXT:    retq
374 ;
375 ; SSSE3-LABEL: testv16i8:
376 ; SSSE3:       # BB#0:
377 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
378 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
379 ; SSSE3-NEXT:    pand %xmm2, %xmm3
380 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
381 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
382 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
383 ; SSSE3-NEXT:    psrlw $4, %xmm0
384 ; SSSE3-NEXT:    pand %xmm2, %xmm0
385 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
386 ; SSSE3-NEXT:    paddb %xmm4, %xmm1
387 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
388 ; SSSE3-NEXT:    retq
389 ;
390 ; SSE41-LABEL: testv16i8:
391 ; SSE41:       # BB#0:
392 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
393 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
394 ; SSE41-NEXT:    pand %xmm2, %xmm3
395 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
396 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
397 ; SSE41-NEXT:    pshufb %xmm3, %xmm4
398 ; SSE41-NEXT:    psrlw $4, %xmm0
399 ; SSE41-NEXT:    pand %xmm2, %xmm0
400 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
401 ; SSE41-NEXT:    paddb %xmm4, %xmm1
402 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
403 ; SSE41-NEXT:    retq
404 ;
405 ; AVX-LABEL: testv16i8:
406 ; AVX:       # BB#0:
407 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
408 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
409 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
410 ; AVX-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
411 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm0
412 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
413 ; AVX-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
414 ; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
415 ; AVX-NEXT:    retq
416   %out = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %in)
417   ret <16 x i8> %out
418 }
419
420 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
421 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
422 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
423 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)