[OpenACC] Enable 'attach' clause for combined constructs
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-popcnt-128.ll
blob58cacfb0485ec6a2855fd6664195e84ee175876f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefixes=SSE,SSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE3
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=AVX,XOP
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VPOPCNTDQ
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VPOPCNTDQVL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefix=BITALG_NOVLX
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefix=BITALG
14 define <2 x i64> @testv2i64(<2 x i64> %in) nounwind {
15 ; SSE2-LABEL: testv2i64:
16 ; SSE2:       # %bb.0:
17 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
18 ; SSE2-NEXT:    psrlw $1, %xmm1
19 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
20 ; SSE2-NEXT:    psubb %xmm1, %xmm0
21 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
22 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
23 ; SSE2-NEXT:    pand %xmm1, %xmm2
24 ; SSE2-NEXT:    psrlw $2, %xmm0
25 ; SSE2-NEXT:    pand %xmm1, %xmm0
26 ; SSE2-NEXT:    paddb %xmm2, %xmm0
27 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
28 ; SSE2-NEXT:    psrlw $4, %xmm1
29 ; SSE2-NEXT:    paddb %xmm1, %xmm0
30 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
31 ; SSE2-NEXT:    pxor %xmm1, %xmm1
32 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
33 ; SSE2-NEXT:    retq
35 ; SSE3-LABEL: testv2i64:
36 ; SSE3:       # %bb.0:
37 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
38 ; SSE3-NEXT:    psrlw $1, %xmm1
39 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
40 ; SSE3-NEXT:    psubb %xmm1, %xmm0
41 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
42 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
43 ; SSE3-NEXT:    pand %xmm1, %xmm2
44 ; SSE3-NEXT:    psrlw $2, %xmm0
45 ; SSE3-NEXT:    pand %xmm1, %xmm0
46 ; SSE3-NEXT:    paddb %xmm2, %xmm0
47 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
48 ; SSE3-NEXT:    psrlw $4, %xmm1
49 ; SSE3-NEXT:    paddb %xmm1, %xmm0
50 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
51 ; SSE3-NEXT:    pxor %xmm1, %xmm1
52 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
53 ; SSE3-NEXT:    retq
55 ; SSSE3-LABEL: testv2i64:
56 ; SSSE3:       # %bb.0:
57 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
58 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
59 ; SSSE3-NEXT:    pand %xmm1, %xmm2
60 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
61 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
62 ; SSSE3-NEXT:    pshufb %xmm2, %xmm4
63 ; SSSE3-NEXT:    psrlw $4, %xmm0
64 ; SSSE3-NEXT:    pand %xmm1, %xmm0
65 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
66 ; SSSE3-NEXT:    paddb %xmm4, %xmm3
67 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
68 ; SSSE3-NEXT:    psadbw %xmm3, %xmm0
69 ; SSSE3-NEXT:    retq
71 ; SSE41-LABEL: testv2i64:
72 ; SSE41:       # %bb.0:
73 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
74 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
75 ; SSE41-NEXT:    pand %xmm1, %xmm2
76 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
77 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
78 ; SSE41-NEXT:    pshufb %xmm2, %xmm4
79 ; SSE41-NEXT:    psrlw $4, %xmm0
80 ; SSE41-NEXT:    pand %xmm1, %xmm0
81 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
82 ; SSE41-NEXT:    paddb %xmm4, %xmm3
83 ; SSE41-NEXT:    pxor %xmm0, %xmm0
84 ; SSE41-NEXT:    psadbw %xmm3, %xmm0
85 ; SSE41-NEXT:    retq
87 ; AVX1-LABEL: testv2i64:
88 ; AVX1:       # %bb.0:
89 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
90 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
91 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
92 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
93 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
94 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
95 ; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
96 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
97 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
98 ; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
99 ; AVX1-NEXT:    retq
101 ; AVX2-LABEL: testv2i64:
102 ; AVX2:       # %bb.0:
103 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
104 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
105 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
106 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
107 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
108 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
109 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
110 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
111 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
112 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
113 ; AVX2-NEXT:    retq
115 ; XOP-LABEL: testv2i64:
116 ; XOP:       # %bb.0:
117 ; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
118 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
119 ; XOP-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
120 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
121 ; XOP-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
122 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
123 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
124 ; XOP-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
125 ; XOP-NEXT:    retq
127 ; AVX512VPOPCNTDQ-LABEL: testv2i64:
128 ; AVX512VPOPCNTDQ:       # %bb.0:
129 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
130 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
131 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
132 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
133 ; AVX512VPOPCNTDQ-NEXT:    retq
135 ; AVX512VPOPCNTDQVL-LABEL: testv2i64:
136 ; AVX512VPOPCNTDQVL:       # %bb.0:
137 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %xmm0, %xmm0
138 ; AVX512VPOPCNTDQVL-NEXT:    retq
140 ; BITALG_NOVLX-LABEL: testv2i64:
141 ; BITALG_NOVLX:       # %bb.0:
142 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
143 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
144 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
145 ; BITALG_NOVLX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
146 ; BITALG_NOVLX-NEXT:    vzeroupper
147 ; BITALG_NOVLX-NEXT:    retq
149 ; BITALG-LABEL: testv2i64:
150 ; BITALG:       # %bb.0:
151 ; BITALG-NEXT:    vpopcntb %xmm0, %xmm0
152 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
153 ; BITALG-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
154 ; BITALG-NEXT:    retq
155   %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %in)
156   ret <2 x i64> %out
159 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {
160 ; SSE2-LABEL: testv4i32:
161 ; SSE2:       # %bb.0:
162 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
163 ; SSE2-NEXT:    psrlw $1, %xmm1
164 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
165 ; SSE2-NEXT:    psubb %xmm1, %xmm0
166 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
167 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
168 ; SSE2-NEXT:    pand %xmm1, %xmm2
169 ; SSE2-NEXT:    psrlw $2, %xmm0
170 ; SSE2-NEXT:    pand %xmm1, %xmm0
171 ; SSE2-NEXT:    paddb %xmm2, %xmm0
172 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
173 ; SSE2-NEXT:    psrlw $4, %xmm1
174 ; SSE2-NEXT:    paddb %xmm1, %xmm0
175 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
176 ; SSE2-NEXT:    pxor %xmm1, %xmm1
177 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
178 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
179 ; SSE2-NEXT:    psadbw %xmm1, %xmm2
180 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
181 ; SSE2-NEXT:    psadbw %xmm1, %xmm0
182 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
183 ; SSE2-NEXT:    retq
185 ; SSE3-LABEL: testv4i32:
186 ; SSE3:       # %bb.0:
187 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
188 ; SSE3-NEXT:    psrlw $1, %xmm1
189 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
190 ; SSE3-NEXT:    psubb %xmm1, %xmm0
191 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
192 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
193 ; SSE3-NEXT:    pand %xmm1, %xmm2
194 ; SSE3-NEXT:    psrlw $2, %xmm0
195 ; SSE3-NEXT:    pand %xmm1, %xmm0
196 ; SSE3-NEXT:    paddb %xmm2, %xmm0
197 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
198 ; SSE3-NEXT:    psrlw $4, %xmm1
199 ; SSE3-NEXT:    paddb %xmm1, %xmm0
200 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
201 ; SSE3-NEXT:    pxor %xmm1, %xmm1
202 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
203 ; SSE3-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
204 ; SSE3-NEXT:    psadbw %xmm1, %xmm2
205 ; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
206 ; SSE3-NEXT:    psadbw %xmm1, %xmm0
207 ; SSE3-NEXT:    packuswb %xmm2, %xmm0
208 ; SSE3-NEXT:    retq
210 ; SSSE3-LABEL: testv4i32:
211 ; SSSE3:       # %bb.0:
212 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
213 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
214 ; SSSE3-NEXT:    pand %xmm2, %xmm3
215 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
216 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
217 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
218 ; SSSE3-NEXT:    psrlw $4, %xmm0
219 ; SSSE3-NEXT:    pand %xmm2, %xmm0
220 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
221 ; SSSE3-NEXT:    paddb %xmm4, %xmm1
222 ; SSSE3-NEXT:    pxor %xmm0, %xmm0
223 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
224 ; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
225 ; SSSE3-NEXT:    psadbw %xmm0, %xmm2
226 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
227 ; SSSE3-NEXT:    psadbw %xmm0, %xmm1
228 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
229 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
230 ; SSSE3-NEXT:    retq
232 ; SSE41-LABEL: testv4i32:
233 ; SSE41:       # %bb.0:
234 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
235 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
236 ; SSE41-NEXT:    pand %xmm1, %xmm2
237 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
238 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
239 ; SSE41-NEXT:    pshufb %xmm2, %xmm4
240 ; SSE41-NEXT:    psrlw $4, %xmm0
241 ; SSE41-NEXT:    pand %xmm1, %xmm0
242 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
243 ; SSE41-NEXT:    paddb %xmm4, %xmm3
244 ; SSE41-NEXT:    pxor %xmm1, %xmm1
245 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero
246 ; SSE41-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm1[2],xmm3[3],xmm1[3]
247 ; SSE41-NEXT:    psadbw %xmm1, %xmm3
248 ; SSE41-NEXT:    psadbw %xmm1, %xmm0
249 ; SSE41-NEXT:    packuswb %xmm3, %xmm0
250 ; SSE41-NEXT:    retq
252 ; AVX1-LABEL: testv4i32:
253 ; AVX1:       # %bb.0:
254 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
255 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
256 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
257 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
258 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
259 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
260 ; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
261 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
262 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
263 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
264 ; AVX1-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
265 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
266 ; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
267 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
268 ; AVX1-NEXT:    retq
270 ; AVX2-LABEL: testv4i32:
271 ; AVX2:       # %bb.0:
272 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
273 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
274 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
275 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
276 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
277 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
278 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
279 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
280 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
281 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
282 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
283 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
284 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
285 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
286 ; AVX2-NEXT:    retq
288 ; XOP-LABEL: testv4i32:
289 ; XOP:       # %bb.0:
290 ; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
291 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
292 ; XOP-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
293 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
294 ; XOP-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
295 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
296 ; XOP-NEXT:    vpxor %xmm1, %xmm1, %xmm1
297 ; XOP-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
298 ; XOP-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
299 ; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
300 ; XOP-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
301 ; XOP-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
302 ; XOP-NEXT:    retq
304 ; AVX512VPOPCNTDQ-LABEL: testv4i32:
305 ; AVX512VPOPCNTDQ:       # %bb.0:
306 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
307 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
308 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
309 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
310 ; AVX512VPOPCNTDQ-NEXT:    retq
312 ; AVX512VPOPCNTDQVL-LABEL: testv4i32:
313 ; AVX512VPOPCNTDQVL:       # %bb.0:
314 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %xmm0, %xmm0
315 ; AVX512VPOPCNTDQVL-NEXT:    retq
317 ; BITALG_NOVLX-LABEL: testv4i32:
318 ; BITALG_NOVLX:       # %bb.0:
319 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
320 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
321 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
322 ; BITALG_NOVLX-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
323 ; BITALG_NOVLX-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
324 ; BITALG_NOVLX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
325 ; BITALG_NOVLX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
326 ; BITALG_NOVLX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
327 ; BITALG_NOVLX-NEXT:    vzeroupper
328 ; BITALG_NOVLX-NEXT:    retq
330 ; BITALG-LABEL: testv4i32:
331 ; BITALG:       # %bb.0:
332 ; BITALG-NEXT:    vpopcntb %xmm0, %xmm0
333 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
334 ; BITALG-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
335 ; BITALG-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
336 ; BITALG-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
337 ; BITALG-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
338 ; BITALG-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
339 ; BITALG-NEXT:    retq
340   %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %in)
341   ret <4 x i32> %out
344 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {
345 ; SSE2-LABEL: testv8i16:
346 ; SSE2:       # %bb.0:
347 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
348 ; SSE2-NEXT:    psrlw $1, %xmm1
349 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
350 ; SSE2-NEXT:    psubb %xmm1, %xmm0
351 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
352 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
353 ; SSE2-NEXT:    pand %xmm1, %xmm2
354 ; SSE2-NEXT:    psrlw $2, %xmm0
355 ; SSE2-NEXT:    pand %xmm1, %xmm0
356 ; SSE2-NEXT:    paddb %xmm2, %xmm0
357 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
358 ; SSE2-NEXT:    psrlw $4, %xmm1
359 ; SSE2-NEXT:    paddb %xmm1, %xmm0
360 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
361 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
362 ; SSE2-NEXT:    psllw $8, %xmm1
363 ; SSE2-NEXT:    paddb %xmm1, %xmm0
364 ; SSE2-NEXT:    psrlw $8, %xmm0
365 ; SSE2-NEXT:    retq
367 ; SSE3-LABEL: testv8i16:
368 ; SSE3:       # %bb.0:
369 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
370 ; SSE3-NEXT:    psrlw $1, %xmm1
371 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
372 ; SSE3-NEXT:    psubb %xmm1, %xmm0
373 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
374 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
375 ; SSE3-NEXT:    pand %xmm1, %xmm2
376 ; SSE3-NEXT:    psrlw $2, %xmm0
377 ; SSE3-NEXT:    pand %xmm1, %xmm0
378 ; SSE3-NEXT:    paddb %xmm2, %xmm0
379 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
380 ; SSE3-NEXT:    psrlw $4, %xmm1
381 ; SSE3-NEXT:    paddb %xmm1, %xmm0
382 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
383 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
384 ; SSE3-NEXT:    psllw $8, %xmm1
385 ; SSE3-NEXT:    paddb %xmm1, %xmm0
386 ; SSE3-NEXT:    psrlw $8, %xmm0
387 ; SSE3-NEXT:    retq
389 ; SSSE3-LABEL: testv8i16:
390 ; SSSE3:       # %bb.0:
391 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
392 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
393 ; SSSE3-NEXT:    pand %xmm1, %xmm2
394 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
395 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
396 ; SSSE3-NEXT:    pshufb %xmm2, %xmm4
397 ; SSSE3-NEXT:    psrlw $4, %xmm0
398 ; SSSE3-NEXT:    pand %xmm1, %xmm0
399 ; SSSE3-NEXT:    pshufb %xmm0, %xmm3
400 ; SSSE3-NEXT:    paddb %xmm4, %xmm3
401 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
402 ; SSSE3-NEXT:    psllw $8, %xmm0
403 ; SSSE3-NEXT:    paddb %xmm3, %xmm0
404 ; SSSE3-NEXT:    psrlw $8, %xmm0
405 ; SSSE3-NEXT:    retq
407 ; SSE41-LABEL: testv8i16:
408 ; SSE41:       # %bb.0:
409 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
410 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
411 ; SSE41-NEXT:    pand %xmm1, %xmm2
412 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
413 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
414 ; SSE41-NEXT:    pshufb %xmm2, %xmm4
415 ; SSE41-NEXT:    psrlw $4, %xmm0
416 ; SSE41-NEXT:    pand %xmm1, %xmm0
417 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
418 ; SSE41-NEXT:    paddb %xmm4, %xmm3
419 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
420 ; SSE41-NEXT:    psllw $8, %xmm0
421 ; SSE41-NEXT:    paddb %xmm3, %xmm0
422 ; SSE41-NEXT:    psrlw $8, %xmm0
423 ; SSE41-NEXT:    retq
425 ; AVX1-LABEL: testv8i16:
426 ; AVX1:       # %bb.0:
427 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
428 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
429 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
430 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
431 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
432 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
433 ; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
434 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
435 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm1
436 ; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
437 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
438 ; AVX1-NEXT:    retq
440 ; AVX2-LABEL: testv8i16:
441 ; AVX2:       # %bb.0:
442 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
443 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
444 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
445 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
446 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
447 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
448 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
449 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
450 ; AVX2-NEXT:    vpsllw $8, %xmm0, %xmm1
451 ; AVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
452 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm0
453 ; AVX2-NEXT:    retq
455 ; XOP-LABEL: testv8i16:
456 ; XOP:       # %bb.0:
457 ; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
458 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
459 ; XOP-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
460 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
461 ; XOP-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
462 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
463 ; XOP-NEXT:    vpsllw $8, %xmm0, %xmm1
464 ; XOP-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
465 ; XOP-NEXT:    vpsrlw $8, %xmm0, %xmm0
466 ; XOP-NEXT:    retq
468 ; AVX512VPOPCNTDQ-LABEL: testv8i16:
469 ; AVX512VPOPCNTDQ:       # %bb.0:
470 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
471 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
472 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0
473 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
474 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
475 ; AVX512VPOPCNTDQ-NEXT:    retq
477 ; AVX512VPOPCNTDQVL-LABEL: testv8i16:
478 ; AVX512VPOPCNTDQVL:       # %bb.0:
479 ; AVX512VPOPCNTDQVL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
480 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
481 ; AVX512VPOPCNTDQVL-NEXT:    vpmovdw %ymm0, %xmm0
482 ; AVX512VPOPCNTDQVL-NEXT:    vzeroupper
483 ; AVX512VPOPCNTDQVL-NEXT:    retq
485 ; BITALG_NOVLX-LABEL: testv8i16:
486 ; BITALG_NOVLX:       # %bb.0:
487 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
488 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
489 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
490 ; BITALG_NOVLX-NEXT:    vzeroupper
491 ; BITALG_NOVLX-NEXT:    retq
493 ; BITALG-LABEL: testv8i16:
494 ; BITALG:       # %bb.0:
495 ; BITALG-NEXT:    vpopcntw %xmm0, %xmm0
496 ; BITALG-NEXT:    retq
497   %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %in)
498   ret <8 x i16> %out
501 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
502 ; SSE2-LABEL: testv16i8:
503 ; SSE2:       # %bb.0:
504 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
505 ; SSE2-NEXT:    psrlw $1, %xmm1
506 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
507 ; SSE2-NEXT:    psubb %xmm1, %xmm0
508 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
509 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
510 ; SSE2-NEXT:    pand %xmm1, %xmm2
511 ; SSE2-NEXT:    psrlw $2, %xmm0
512 ; SSE2-NEXT:    pand %xmm1, %xmm0
513 ; SSE2-NEXT:    paddb %xmm2, %xmm0
514 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
515 ; SSE2-NEXT:    psrlw $4, %xmm1
516 ; SSE2-NEXT:    paddb %xmm1, %xmm0
517 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
518 ; SSE2-NEXT:    retq
520 ; SSE3-LABEL: testv16i8:
521 ; SSE3:       # %bb.0:
522 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
523 ; SSE3-NEXT:    psrlw $1, %xmm1
524 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
525 ; SSE3-NEXT:    psubb %xmm1, %xmm0
526 ; SSE3-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
527 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
528 ; SSE3-NEXT:    pand %xmm1, %xmm2
529 ; SSE3-NEXT:    psrlw $2, %xmm0
530 ; SSE3-NEXT:    pand %xmm1, %xmm0
531 ; SSE3-NEXT:    paddb %xmm2, %xmm0
532 ; SSE3-NEXT:    movdqa %xmm0, %xmm1
533 ; SSE3-NEXT:    psrlw $4, %xmm1
534 ; SSE3-NEXT:    paddb %xmm1, %xmm0
535 ; SSE3-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
536 ; SSE3-NEXT:    retq
538 ; SSSE3-LABEL: testv16i8:
539 ; SSSE3:       # %bb.0:
540 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
541 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
542 ; SSSE3-NEXT:    pand %xmm2, %xmm3
543 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
544 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
545 ; SSSE3-NEXT:    pshufb %xmm3, %xmm4
546 ; SSSE3-NEXT:    psrlw $4, %xmm0
547 ; SSSE3-NEXT:    pand %xmm2, %xmm0
548 ; SSSE3-NEXT:    pshufb %xmm0, %xmm1
549 ; SSSE3-NEXT:    paddb %xmm4, %xmm1
550 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
551 ; SSSE3-NEXT:    retq
553 ; SSE41-LABEL: testv16i8:
554 ; SSE41:       # %bb.0:
555 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
556 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
557 ; SSE41-NEXT:    pand %xmm2, %xmm3
558 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
559 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
560 ; SSE41-NEXT:    pshufb %xmm3, %xmm4
561 ; SSE41-NEXT:    psrlw $4, %xmm0
562 ; SSE41-NEXT:    pand %xmm2, %xmm0
563 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
564 ; SSE41-NEXT:    paddb %xmm4, %xmm1
565 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
566 ; SSE41-NEXT:    retq
568 ; AVX1-LABEL: testv16i8:
569 ; AVX1:       # %bb.0:
570 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
571 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
572 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
573 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
574 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
575 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
576 ; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
577 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
578 ; AVX1-NEXT:    retq
580 ; AVX2-LABEL: testv16i8:
581 ; AVX2:       # %bb.0:
582 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
583 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
584 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
585 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
586 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
587 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
588 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
589 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
590 ; AVX2-NEXT:    retq
592 ; XOP-LABEL: testv16i8:
593 ; XOP:       # %bb.0:
594 ; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
595 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
596 ; XOP-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
597 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
598 ; XOP-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
599 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
600 ; XOP-NEXT:    retq
602 ; AVX512-LABEL: testv16i8:
603 ; AVX512:       # %bb.0:
604 ; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
605 ; AVX512-NEXT:    vpopcntd %zmm0, %zmm0
606 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
607 ; AVX512-NEXT:    vzeroupper
608 ; AVX512-NEXT:    retq
610 ; BITALG_NOVLX-LABEL: testv16i8:
611 ; BITALG_NOVLX:       # %bb.0:
612 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
613 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
614 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
615 ; BITALG_NOVLX-NEXT:    vzeroupper
616 ; BITALG_NOVLX-NEXT:    retq
618 ; BITALG-LABEL: testv16i8:
619 ; BITALG:       # %bb.0:
620 ; BITALG-NEXT:    vpopcntb %xmm0, %xmm0
621 ; BITALG-NEXT:    retq
622   %out = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %in)
623   ret <16 x i8> %out
626 define <2 x i64> @foldv2i64() nounwind {
627 ; SSE-LABEL: foldv2i64:
628 ; SSE:       # %bb.0:
629 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,64]
630 ; SSE-NEXT:    retq
632 ; AVX-LABEL: foldv2i64:
633 ; AVX:       # %bb.0:
634 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,64]
635 ; AVX-NEXT:    retq
637 ; BITALG_NOVLX-LABEL: foldv2i64:
638 ; BITALG_NOVLX:       # %bb.0:
639 ; BITALG_NOVLX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,64]
640 ; BITALG_NOVLX-NEXT:    retq
642 ; BITALG-LABEL: foldv2i64:
643 ; BITALG:       # %bb.0:
644 ; BITALG-NEXT:    vmovaps {{.*#+}} xmm0 = [1,64]
645 ; BITALG-NEXT:    retq
646   %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> <i64 256, i64 -1>)
647   ret <2 x i64> %out
650 define <4 x i32> @foldv4i32() nounwind {
651 ; SSE-LABEL: foldv4i32:
652 ; SSE:       # %bb.0:
653 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,32,0,8]
654 ; SSE-NEXT:    retq
656 ; AVX-LABEL: foldv4i32:
657 ; AVX:       # %bb.0:
658 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,32,0,8]
659 ; AVX-NEXT:    retq
661 ; BITALG_NOVLX-LABEL: foldv4i32:
662 ; BITALG_NOVLX:       # %bb.0:
663 ; BITALG_NOVLX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,32,0,8]
664 ; BITALG_NOVLX-NEXT:    retq
666 ; BITALG-LABEL: foldv4i32:
667 ; BITALG:       # %bb.0:
668 ; BITALG-NEXT:    vmovaps {{.*#+}} xmm0 = [1,32,0,8]
669 ; BITALG-NEXT:    retq
670   %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>)
671   ret <4 x i32> %out
674 define <8 x i16> @foldv8i16() nounwind {
675 ; SSE-LABEL: foldv8i16:
676 ; SSE:       # %bb.0:
677 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
678 ; SSE-NEXT:    retq
680 ; AVX-LABEL: foldv8i16:
681 ; AVX:       # %bb.0:
682 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
683 ; AVX-NEXT:    retq
685 ; BITALG_NOVLX-LABEL: foldv8i16:
686 ; BITALG_NOVLX:       # %bb.0:
687 ; BITALG_NOVLX-NEXT:    vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
688 ; BITALG_NOVLX-NEXT:    retq
690 ; BITALG-LABEL: foldv8i16:
691 ; BITALG:       # %bb.0:
692 ; BITALG-NEXT:    vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
693 ; BITALG-NEXT:    retq
694   %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88>)
695   ret <8 x i16> %out
698 define <16 x i8> @foldv16i8() nounwind {
699 ; SSE-LABEL: foldv16i8:
700 ; SSE:       # %bb.0:
701 ; SSE-NEXT:    movaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
702 ; SSE-NEXT:    retq
704 ; AVX-LABEL: foldv16i8:
705 ; AVX:       # %bb.0:
706 ; AVX-NEXT:    vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
707 ; AVX-NEXT:    retq
709 ; BITALG_NOVLX-LABEL: foldv16i8:
710 ; BITALG_NOVLX:       # %bb.0:
711 ; BITALG_NOVLX-NEXT:    vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
712 ; BITALG_NOVLX-NEXT:    retq
714 ; BITALG-LABEL: foldv16i8:
715 ; BITALG:       # %bb.0:
716 ; BITALG-NEXT:    vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
717 ; BITALG-NEXT:    retq
718   %out = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> <i8 256, i8 -1, i8 0, i8 255, i8 -65536, i8 7, i8 24, i8 88, i8 -2, i8 254, i8 1, i8 2, i8 4, i8 8, i8 16, i8 32>)
719   ret <16 x i8> %out
722 define <2 x i64> @eq_1_v2i64(<2 x i64> %0) {
723 ; SSE-LABEL: eq_1_v2i64:
724 ; SSE:       # %bb.0:
725 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
726 ; SSE-NEXT:    paddq %xmm0, %xmm1
727 ; SSE-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
728 ; SSE-NEXT:    pxor %xmm1, %xmm0
729 ; SSE-NEXT:    movdqa %xmm0, %xmm2
730 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm2
731 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
732 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm0
733 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
734 ; SSE-NEXT:    pand %xmm3, %xmm1
735 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
736 ; SSE-NEXT:    por %xmm1, %xmm0
737 ; SSE-NEXT:    retq
739 ; AVX1OR2-LABEL: eq_1_v2i64:
740 ; AVX1OR2:       # %bb.0:
741 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
742 ; AVX1OR2-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
743 ; AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
744 ; AVX1OR2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
745 ; AVX1OR2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
746 ; AVX1OR2-NEXT:    retq
748 ; XOP-LABEL: eq_1_v2i64:
749 ; XOP:       # %bb.0:
750 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
751 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
752 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
753 ; XOP-NEXT:    vpcomgtuq %xmm1, %xmm0, %xmm0
754 ; XOP-NEXT:    retq
756 ; AVX512VPOPCNTDQ-LABEL: eq_1_v2i64:
757 ; AVX512VPOPCNTDQ:       # %bb.0:
758 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
759 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
760 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
761 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
762 ; AVX512VPOPCNTDQ-NEXT:    retq
764 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v2i64:
765 ; AVX512VPOPCNTDQVL:       # %bb.0:
766 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %xmm0, %xmm0
767 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [1,1]
768 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
769 ; AVX512VPOPCNTDQVL-NEXT:    retq
771 ; BITALG_NOVLX-LABEL: eq_1_v2i64:
772 ; BITALG_NOVLX:       # %bb.0:
773 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
774 ; BITALG_NOVLX-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
775 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
776 ; BITALG_NOVLX-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
777 ; BITALG_NOVLX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
778 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
779 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
780 ; BITALG_NOVLX-NEXT:    vzeroupper
781 ; BITALG_NOVLX-NEXT:    retq
783 ; BITALG-LABEL: eq_1_v2i64:
784 ; BITALG:       # %bb.0:
785 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
786 ; BITALG-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
787 ; BITALG-NEXT:    vpxor %xmm1, %xmm0, %xmm0
788 ; BITALG-NEXT:    vpminuq %xmm1, %xmm0, %xmm1
789 ; BITALG-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
790 ; BITALG-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
791 ; BITALG-NEXT:    retq
792   %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)
793   %3 = icmp eq <2 x i64> %2, <i64 1, i64 1>
794   %4 = sext <2 x i1> %3 to <2 x i64>
795   ret <2 x i64> %4
798 define <2 x i64> @ne_1_v2i64(<2 x i64> %0) {
799 ; SSE-LABEL: ne_1_v2i64:
800 ; SSE:       # %bb.0:
801 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
802 ; SSE-NEXT:    movdqa %xmm0, %xmm2
803 ; SSE-NEXT:    paddq %xmm1, %xmm2
804 ; SSE-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
805 ; SSE-NEXT:    pxor %xmm2, %xmm0
806 ; SSE-NEXT:    movdqa %xmm0, %xmm3
807 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm3
808 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
809 ; SSE-NEXT:    pcmpeqd %xmm2, %xmm0
810 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
811 ; SSE-NEXT:    pand %xmm4, %xmm2
812 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
813 ; SSE-NEXT:    por %xmm2, %xmm0
814 ; SSE-NEXT:    pxor %xmm1, %xmm0
815 ; SSE-NEXT:    retq
817 ; AVX1OR2-LABEL: ne_1_v2i64:
818 ; AVX1OR2:       # %bb.0:
819 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
820 ; AVX1OR2-NEXT:    vpaddq %xmm1, %xmm0, %xmm2
821 ; AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
822 ; AVX1OR2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
823 ; AVX1OR2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm0
824 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
825 ; AVX1OR2-NEXT:    retq
827 ; XOP-LABEL: ne_1_v2i64:
828 ; XOP:       # %bb.0:
829 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
830 ; XOP-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
831 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
832 ; XOP-NEXT:    vpcomleuq %xmm1, %xmm0, %xmm0
833 ; XOP-NEXT:    retq
835 ; AVX512VPOPCNTDQ-LABEL: ne_1_v2i64:
836 ; AVX512VPOPCNTDQ:       # %bb.0:
837 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
838 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
839 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
840 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
841 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
842 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
843 ; AVX512VPOPCNTDQ-NEXT:    retq
845 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v2i64:
846 ; AVX512VPOPCNTDQVL:       # %bb.0:
847 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %xmm0, %xmm0
848 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [1,1]
849 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
850 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
851 ; AVX512VPOPCNTDQVL-NEXT:    retq
853 ; BITALG_NOVLX-LABEL: ne_1_v2i64:
854 ; BITALG_NOVLX:       # %bb.0:
855 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
856 ; BITALG_NOVLX-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
857 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
858 ; BITALG_NOVLX-NEXT:    vpminuq %zmm1, %zmm0, %zmm1
859 ; BITALG_NOVLX-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
860 ; BITALG_NOVLX-NEXT:    vzeroupper
861 ; BITALG_NOVLX-NEXT:    retq
863 ; BITALG-LABEL: ne_1_v2i64:
864 ; BITALG:       # %bb.0:
865 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
866 ; BITALG-NEXT:    vpaddq %xmm1, %xmm0, %xmm1
867 ; BITALG-NEXT:    vpxor %xmm1, %xmm0, %xmm0
868 ; BITALG-NEXT:    vpminuq %xmm1, %xmm0, %xmm1
869 ; BITALG-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
870 ; BITALG-NEXT:    retq
871   %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)
872   %3 = icmp ne <2 x i64> %2, <i64 1, i64 1>
873   %4 = sext <2 x i1> %3 to <2 x i64>
874   ret <2 x i64> %4
877 define <4 x i32> @eq_1_v4i32(<4 x i32> %0) {
878 ; SSE2-LABEL: eq_1_v4i32:
879 ; SSE2:       # %bb.0:
880 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
881 ; SSE2-NEXT:    paddd %xmm0, %xmm1
882 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
883 ; SSE2-NEXT:    pxor %xmm1, %xmm0
884 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
885 ; SSE2-NEXT:    retq
887 ; SSE3-LABEL: eq_1_v4i32:
888 ; SSE3:       # %bb.0:
889 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
890 ; SSE3-NEXT:    paddd %xmm0, %xmm1
891 ; SSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
892 ; SSE3-NEXT:    pxor %xmm1, %xmm0
893 ; SSE3-NEXT:    pcmpgtd %xmm1, %xmm0
894 ; SSE3-NEXT:    retq
896 ; SSSE3-LABEL: eq_1_v4i32:
897 ; SSSE3:       # %bb.0:
898 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
899 ; SSSE3-NEXT:    paddd %xmm0, %xmm1
900 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
901 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
902 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
903 ; SSSE3-NEXT:    retq
905 ; SSE41-LABEL: eq_1_v4i32:
906 ; SSE41:       # %bb.0:
907 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
908 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
909 ; SSE41-NEXT:    paddd %xmm1, %xmm2
910 ; SSE41-NEXT:    pxor %xmm2, %xmm0
911 ; SSE41-NEXT:    pminud %xmm0, %xmm2
912 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
913 ; SSE41-NEXT:    pxor %xmm1, %xmm0
914 ; SSE41-NEXT:    retq
916 ; AVX1OR2-LABEL: eq_1_v4i32:
917 ; AVX1OR2:       # %bb.0:
918 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
919 ; AVX1OR2-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
920 ; AVX1OR2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
921 ; AVX1OR2-NEXT:    vpminud %xmm2, %xmm0, %xmm2
922 ; AVX1OR2-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
923 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
924 ; AVX1OR2-NEXT:    retq
926 ; XOP-LABEL: eq_1_v4i32:
927 ; XOP:       # %bb.0:
928 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
929 ; XOP-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
930 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
931 ; XOP-NEXT:    vpcomgtud %xmm1, %xmm0, %xmm0
932 ; XOP-NEXT:    retq
934 ; AVX512VPOPCNTDQ-LABEL: eq_1_v4i32:
935 ; AVX512VPOPCNTDQ:       # %bb.0:
936 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
937 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
938 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
939 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
940 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
941 ; AVX512VPOPCNTDQ-NEXT:    retq
943 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i32:
944 ; AVX512VPOPCNTDQVL:       # %bb.0:
945 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %xmm0, %xmm0
946 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
947 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
948 ; AVX512VPOPCNTDQVL-NEXT:    retq
950 ; BITALG_NOVLX-LABEL: eq_1_v4i32:
951 ; BITALG_NOVLX:       # %bb.0:
952 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
953 ; BITALG_NOVLX-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
954 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
955 ; BITALG_NOVLX-NEXT:    vpminud %xmm1, %xmm0, %xmm1
956 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
957 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
958 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
959 ; BITALG_NOVLX-NEXT:    vzeroupper
960 ; BITALG_NOVLX-NEXT:    retq
962 ; BITALG-LABEL: eq_1_v4i32:
963 ; BITALG:       # %bb.0:
964 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
965 ; BITALG-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
966 ; BITALG-NEXT:    vpxor %xmm1, %xmm0, %xmm0
967 ; BITALG-NEXT:    vpminud %xmm1, %xmm0, %xmm1
968 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
969 ; BITALG-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
970 ; BITALG-NEXT:    retq
971   %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)
972   %3 = icmp eq <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>
973   %4 = sext <4 x i1> %3 to <4 x i32>
974   ret <4 x i32> %4
977 define <4 x i32> @ne_1_v4i32(<4 x i32> %0) {
978 ; SSE2-LABEL: ne_1_v4i32:
979 ; SSE2:       # %bb.0:
980 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
981 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
982 ; SSE2-NEXT:    paddd %xmm1, %xmm2
983 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
984 ; SSE2-NEXT:    pxor %xmm2, %xmm0
985 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
986 ; SSE2-NEXT:    pxor %xmm1, %xmm0
987 ; SSE2-NEXT:    retq
989 ; SSE3-LABEL: ne_1_v4i32:
990 ; SSE3:       # %bb.0:
991 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
992 ; SSE3-NEXT:    movdqa %xmm0, %xmm2
993 ; SSE3-NEXT:    paddd %xmm1, %xmm2
994 ; SSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
995 ; SSE3-NEXT:    pxor %xmm2, %xmm0
996 ; SSE3-NEXT:    pcmpgtd %xmm2, %xmm0
997 ; SSE3-NEXT:    pxor %xmm1, %xmm0
998 ; SSE3-NEXT:    retq
1000 ; SSSE3-LABEL: ne_1_v4i32:
1001 ; SSSE3:       # %bb.0:
1002 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1003 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1004 ; SSSE3-NEXT:    paddd %xmm1, %xmm2
1005 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1006 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
1007 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
1008 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
1009 ; SSSE3-NEXT:    retq
1011 ; SSE41-LABEL: ne_1_v4i32:
1012 ; SSE41:       # %bb.0:
1013 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1014 ; SSE41-NEXT:    paddd %xmm0, %xmm1
1015 ; SSE41-NEXT:    pxor %xmm1, %xmm0
1016 ; SSE41-NEXT:    pminud %xmm0, %xmm1
1017 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
1018 ; SSE41-NEXT:    retq
1020 ; AVX1OR2-LABEL: ne_1_v4i32:
1021 ; AVX1OR2:       # %bb.0:
1022 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1023 ; AVX1OR2-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1024 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1025 ; AVX1OR2-NEXT:    vpminud %xmm1, %xmm0, %xmm1
1026 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1027 ; AVX1OR2-NEXT:    retq
1029 ; XOP-LABEL: ne_1_v4i32:
1030 ; XOP:       # %bb.0:
1031 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1032 ; XOP-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1033 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1034 ; XOP-NEXT:    vpcomleud %xmm1, %xmm0, %xmm0
1035 ; XOP-NEXT:    retq
1037 ; AVX512VPOPCNTDQ-LABEL: ne_1_v4i32:
1038 ; AVX512VPOPCNTDQ:       # %bb.0:
1039 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1040 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
1041 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1042 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1043 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1044 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1045 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
1046 ; AVX512VPOPCNTDQ-NEXT:    retq
1048 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i32:
1049 ; AVX512VPOPCNTDQVL:       # %bb.0:
1050 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %xmm0, %xmm0
1051 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1052 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1053 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1054 ; AVX512VPOPCNTDQVL-NEXT:    retq
1056 ; BITALG_NOVLX-LABEL: ne_1_v4i32:
1057 ; BITALG_NOVLX:       # %bb.0:
1058 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1059 ; BITALG_NOVLX-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1060 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1061 ; BITALG_NOVLX-NEXT:    vpminud %xmm1, %xmm0, %xmm1
1062 ; BITALG_NOVLX-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1063 ; BITALG_NOVLX-NEXT:    retq
1065 ; BITALG-LABEL: ne_1_v4i32:
1066 ; BITALG:       # %bb.0:
1067 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1068 ; BITALG-NEXT:    vpaddd %xmm1, %xmm0, %xmm1
1069 ; BITALG-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1070 ; BITALG-NEXT:    vpminud %xmm1, %xmm0, %xmm1
1071 ; BITALG-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1072 ; BITALG-NEXT:    retq
1073   %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)
1074   %3 = icmp ne <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>
1075   %4 = sext <4 x i1> %3 to <4 x i32>
1076   ret <4 x i32> %4
1079 define <8 x i16> @eq_1_v8i16(<8 x i16> %0) {
1080 ; SSE2-LABEL: eq_1_v8i16:
1081 ; SSE2:       # %bb.0:
1082 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1083 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1084 ; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1085 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1086 ; SSE2-NEXT:    pcmpgtw %xmm1, %xmm0
1087 ; SSE2-NEXT:    retq
1089 ; SSE3-LABEL: eq_1_v8i16:
1090 ; SSE3:       # %bb.0:
1091 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1092 ; SSE3-NEXT:    paddw %xmm0, %xmm1
1093 ; SSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1094 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1095 ; SSE3-NEXT:    pcmpgtw %xmm1, %xmm0
1096 ; SSE3-NEXT:    retq
1098 ; SSSE3-LABEL: eq_1_v8i16:
1099 ; SSSE3:       # %bb.0:
1100 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1101 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
1102 ; SSSE3-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1103 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
1104 ; SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
1105 ; SSSE3-NEXT:    retq
1107 ; SSE41-LABEL: eq_1_v8i16:
1108 ; SSE41:       # %bb.0:
1109 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1110 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1111 ; SSE41-NEXT:    paddw %xmm1, %xmm2
1112 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1113 ; SSE41-NEXT:    pminuw %xmm0, %xmm2
1114 ; SSE41-NEXT:    pcmpeqw %xmm2, %xmm0
1115 ; SSE41-NEXT:    pxor %xmm1, %xmm0
1116 ; SSE41-NEXT:    retq
1118 ; AVX1OR2-LABEL: eq_1_v8i16:
1119 ; AVX1OR2:       # %bb.0:
1120 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1121 ; AVX1OR2-NEXT:    vpaddw %xmm1, %xmm0, %xmm2
1122 ; AVX1OR2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1123 ; AVX1OR2-NEXT:    vpminuw %xmm2, %xmm0, %xmm2
1124 ; AVX1OR2-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
1125 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1126 ; AVX1OR2-NEXT:    retq
1128 ; XOP-LABEL: eq_1_v8i16:
1129 ; XOP:       # %bb.0:
1130 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1131 ; XOP-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1132 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1133 ; XOP-NEXT:    vpcomgtuw %xmm1, %xmm0, %xmm0
1134 ; XOP-NEXT:    retq
1136 ; AVX512VPOPCNTDQ-LABEL: eq_1_v8i16:
1137 ; AVX512VPOPCNTDQ:       # %bb.0:
1138 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1139 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1140 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1141 ; AVX512VPOPCNTDQ-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
1142 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1143 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1144 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1145 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
1146 ; AVX512VPOPCNTDQ-NEXT:    retq
1148 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i16:
1149 ; AVX512VPOPCNTDQVL:       # %bb.0:
1150 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1151 ; AVX512VPOPCNTDQVL-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1152 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1153 ; AVX512VPOPCNTDQVL-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
1154 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1155 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1156 ; AVX512VPOPCNTDQVL-NEXT:    retq
1158 ; BITALG_NOVLX-LABEL: eq_1_v8i16:
1159 ; BITALG_NOVLX:       # %bb.0:
1160 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1161 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
1162 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1163 ; BITALG_NOVLX-NEXT:    vzeroupper
1164 ; BITALG_NOVLX-NEXT:    retq
1166 ; BITALG-LABEL: eq_1_v8i16:
1167 ; BITALG:       # %bb.0:
1168 ; BITALG-NEXT:    vpopcntw %xmm0, %xmm0
1169 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1170 ; BITALG-NEXT:    retq
1171   %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)
1172   %3 = icmp eq <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1173   %4 = sext <8 x i1> %3 to <8 x i16>
1174   ret <8 x i16> %4
1177 define <8 x i16> @ne_1_v8i16(<8 x i16> %0) {
1178 ; SSE2-LABEL: ne_1_v8i16:
1179 ; SSE2:       # %bb.0:
1180 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1181 ; SSE2-NEXT:    paddw %xmm0, %xmm1
1182 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1183 ; SSE2-NEXT:    psubusw %xmm1, %xmm0
1184 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1185 ; SSE2-NEXT:    pcmpeqw %xmm1, %xmm0
1186 ; SSE2-NEXT:    retq
1188 ; SSE3-LABEL: ne_1_v8i16:
1189 ; SSE3:       # %bb.0:
1190 ; SSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1191 ; SSE3-NEXT:    paddw %xmm0, %xmm1
1192 ; SSE3-NEXT:    pxor %xmm1, %xmm0
1193 ; SSE3-NEXT:    psubusw %xmm1, %xmm0
1194 ; SSE3-NEXT:    pxor %xmm1, %xmm1
1195 ; SSE3-NEXT:    pcmpeqw %xmm1, %xmm0
1196 ; SSE3-NEXT:    retq
1198 ; SSSE3-LABEL: ne_1_v8i16:
1199 ; SSSE3:       # %bb.0:
1200 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1201 ; SSSE3-NEXT:    paddw %xmm0, %xmm1
1202 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
1203 ; SSSE3-NEXT:    psubusw %xmm1, %xmm0
1204 ; SSSE3-NEXT:    pxor %xmm1, %xmm1
1205 ; SSSE3-NEXT:    pcmpeqw %xmm1, %xmm0
1206 ; SSSE3-NEXT:    retq
1208 ; SSE41-LABEL: ne_1_v8i16:
1209 ; SSE41:       # %bb.0:
1210 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1211 ; SSE41-NEXT:    paddw %xmm0, %xmm1
1212 ; SSE41-NEXT:    pxor %xmm1, %xmm0
1213 ; SSE41-NEXT:    pminuw %xmm0, %xmm1
1214 ; SSE41-NEXT:    pcmpeqw %xmm1, %xmm0
1215 ; SSE41-NEXT:    retq
1217 ; AVX1OR2-LABEL: ne_1_v8i16:
1218 ; AVX1OR2:       # %bb.0:
1219 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1220 ; AVX1OR2-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1221 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1222 ; AVX1OR2-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
1223 ; AVX1OR2-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1224 ; AVX1OR2-NEXT:    retq
1226 ; XOP-LABEL: ne_1_v8i16:
1227 ; XOP:       # %bb.0:
1228 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1229 ; XOP-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1230 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1231 ; XOP-NEXT:    vpcomleuw %xmm1, %xmm0, %xmm0
1232 ; XOP-NEXT:    retq
1234 ; AVX512-LABEL: ne_1_v8i16:
1235 ; AVX512:       # %bb.0:
1236 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1237 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm1
1238 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1239 ; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm1
1240 ; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0
1241 ; AVX512-NEXT:    retq
1243 ; BITALG_NOVLX-LABEL: ne_1_v8i16:
1244 ; BITALG_NOVLX:       # %bb.0:
1245 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1246 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
1247 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1248 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1249 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1250 ; BITALG_NOVLX-NEXT:    vzeroupper
1251 ; BITALG_NOVLX-NEXT:    retq
1253 ; BITALG-LABEL: ne_1_v8i16:
1254 ; BITALG:       # %bb.0:
1255 ; BITALG-NEXT:    vpopcntw %xmm0, %xmm0
1256 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1257 ; BITALG-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1258 ; BITALG-NEXT:    retq
1259   %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)
1260   %3 = icmp ne <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1261   %4 = sext <8 x i1> %3 to <8 x i16>
1262   ret <8 x i16> %4
1265 define <16 x i8> @eq_1_v16i8(<16 x i8> %0) {
1266 ; SSE-LABEL: eq_1_v16i8:
1267 ; SSE:       # %bb.0:
1268 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
1269 ; SSE-NEXT:    movdqa %xmm0, %xmm2
1270 ; SSE-NEXT:    paddb %xmm1, %xmm2
1271 ; SSE-NEXT:    pxor %xmm2, %xmm0
1272 ; SSE-NEXT:    pminub %xmm0, %xmm2
1273 ; SSE-NEXT:    pcmpeqb %xmm2, %xmm0
1274 ; SSE-NEXT:    pxor %xmm1, %xmm0
1275 ; SSE-NEXT:    retq
1277 ; AVX1OR2-LABEL: eq_1_v16i8:
1278 ; AVX1OR2:       # %bb.0:
1279 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1280 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm0, %xmm2
1281 ; AVX1OR2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1282 ; AVX1OR2-NEXT:    vpminub %xmm2, %xmm0, %xmm2
1283 ; AVX1OR2-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
1284 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1285 ; AVX1OR2-NEXT:    retq
1287 ; XOP-LABEL: eq_1_v16i8:
1288 ; XOP:       # %bb.0:
1289 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1290 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1291 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1292 ; XOP-NEXT:    vpcomgtub %xmm1, %xmm0, %xmm0
1293 ; XOP-NEXT:    retq
1295 ; AVX512VPOPCNTDQ-LABEL: eq_1_v16i8:
1296 ; AVX512VPOPCNTDQ:       # %bb.0:
1297 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1298 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1299 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1300 ; AVX512VPOPCNTDQ-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1301 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1302 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1303 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1304 ; AVX512VPOPCNTDQ-NEXT:    vzeroupper
1305 ; AVX512VPOPCNTDQ-NEXT:    retq
1307 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i8:
1308 ; AVX512VPOPCNTDQVL:       # %bb.0:
1309 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1310 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1311 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1312 ; AVX512VPOPCNTDQVL-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1313 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1314 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1315 ; AVX512VPOPCNTDQVL-NEXT:    retq
1317 ; BITALG_NOVLX-LABEL: eq_1_v16i8:
1318 ; BITALG_NOVLX:       # %bb.0:
1319 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1320 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
1321 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1322 ; BITALG_NOVLX-NEXT:    vzeroupper
1323 ; BITALG_NOVLX-NEXT:    retq
1325 ; BITALG-LABEL: eq_1_v16i8:
1326 ; BITALG:       # %bb.0:
1327 ; BITALG-NEXT:    vpopcntb %xmm0, %xmm0
1328 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1329 ; BITALG-NEXT:    retq
1330   %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)
1331   %3 = icmp eq <16 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1332   %4 = sext <16 x i1> %3 to <16 x i8>
1333   ret <16 x i8> %4
1336 define <16 x i8> @ne_1_v16i8(<16 x i8> %0) {
1337 ; SSE-LABEL: ne_1_v16i8:
1338 ; SSE:       # %bb.0:
1339 ; SSE-NEXT:    pcmpeqd %xmm1, %xmm1
1340 ; SSE-NEXT:    paddb %xmm0, %xmm1
1341 ; SSE-NEXT:    pxor %xmm1, %xmm0
1342 ; SSE-NEXT:    pminub %xmm0, %xmm1
1343 ; SSE-NEXT:    pcmpeqb %xmm1, %xmm0
1344 ; SSE-NEXT:    retq
1346 ; AVX1OR2-LABEL: ne_1_v16i8:
1347 ; AVX1OR2:       # %bb.0:
1348 ; AVX1OR2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1349 ; AVX1OR2-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1350 ; AVX1OR2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1351 ; AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1352 ; AVX1OR2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1353 ; AVX1OR2-NEXT:    retq
1355 ; XOP-LABEL: ne_1_v16i8:
1356 ; XOP:       # %bb.0:
1357 ; XOP-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1358 ; XOP-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1359 ; XOP-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1360 ; XOP-NEXT:    vpcomleub %xmm1, %xmm0, %xmm0
1361 ; XOP-NEXT:    retq
1363 ; AVX512-LABEL: ne_1_v16i8:
1364 ; AVX512:       # %bb.0:
1365 ; AVX512-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1366 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm1
1367 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
1368 ; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1369 ; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1370 ; AVX512-NEXT:    retq
1372 ; BITALG_NOVLX-LABEL: ne_1_v16i8:
1373 ; BITALG_NOVLX:       # %bb.0:
1374 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1375 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
1376 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1377 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1378 ; BITALG_NOVLX-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1379 ; BITALG_NOVLX-NEXT:    vzeroupper
1380 ; BITALG_NOVLX-NEXT:    retq
1382 ; BITALG-LABEL: ne_1_v16i8:
1383 ; BITALG:       # %bb.0:
1384 ; BITALG-NEXT:    vpopcntb %xmm0, %xmm0
1385 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1386 ; BITALG-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
1387 ; BITALG-NEXT:    retq
1388   %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)
1389   %3 = icmp ne <16 x i8> %2, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
1390   %4 = sext <16 x i1> %3 to <16 x i8>
1391   ret <16 x i8> %4
1394 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
1395 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1396 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
1397 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)