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:
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
35 ; SSE3-LABEL: testv2i64:
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
55 ; SSSE3-LABEL: testv2i64:
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
71 ; SSE41-LABEL: testv2i64:
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
87 ; AVX1-LABEL: testv2i64:
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
101 ; AVX2-LABEL: testv2i64:
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
115 ; XOP-LABEL: testv2i64:
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
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:
151 ; BITALG-NEXT: vpopcntb %xmm0, %xmm0
152 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
153 ; BITALG-NEXT: vpsadbw %xmm1, %xmm0, %xmm0
155 %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %in)
159 define <4 x i32> @testv4i32(<4 x i32> %in) nounwind {
160 ; SSE2-LABEL: testv4i32:
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
185 ; SSE3-LABEL: testv4i32:
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
210 ; SSSE3-LABEL: testv4i32:
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
232 ; SSE41-LABEL: testv4i32:
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
252 ; AVX1-LABEL: testv4i32:
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
270 ; AVX2-LABEL: testv4i32:
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
288 ; XOP-LABEL: testv4i32:
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
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:
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
340 %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %in)
344 define <8 x i16> @testv8i16(<8 x i16> %in) nounwind {
345 ; SSE2-LABEL: testv8i16:
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
367 ; SSE3-LABEL: testv8i16:
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
389 ; SSSE3-LABEL: testv8i16:
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
407 ; SSE41-LABEL: testv8i16:
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
425 ; AVX1-LABEL: testv8i16:
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
440 ; AVX2-LABEL: testv8i16:
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
455 ; XOP-LABEL: testv8i16:
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
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:
495 ; BITALG-NEXT: vpopcntw %xmm0, %xmm0
497 %out = call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %in)
501 define <16 x i8> @testv16i8(<16 x i8> %in) nounwind {
502 ; SSE2-LABEL: testv16i8:
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
520 ; SSE3-LABEL: testv16i8:
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
538 ; SSSE3-LABEL: testv16i8:
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
553 ; SSE41-LABEL: testv16i8:
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
568 ; AVX1-LABEL: testv16i8:
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
580 ; AVX2-LABEL: testv16i8:
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
592 ; XOP-LABEL: testv16i8:
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
602 ; AVX512-LABEL: testv16i8:
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
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:
620 ; BITALG-NEXT: vpopcntb %xmm0, %xmm0
622 %out = call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %in)
626 define <2 x i64> @foldv2i64() nounwind {
627 ; SSE-LABEL: foldv2i64:
629 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,64]
632 ; AVX-LABEL: foldv2i64:
634 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,64]
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:
644 ; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [1,64]
646 %out = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> <i64 256, i64 -1>)
650 define <4 x i32> @foldv4i32() nounwind {
651 ; SSE-LABEL: foldv4i32:
653 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,32,0,8]
656 ; AVX-LABEL: foldv4i32:
658 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,32,0,8]
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:
668 ; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [1,32,0,8]
670 %out = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> <i32 256, i32 -1, i32 0, i32 255>)
674 define <8 x i16> @foldv8i16() nounwind {
675 ; SSE-LABEL: foldv8i16:
677 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
680 ; AVX-LABEL: foldv8i16:
682 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
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:
692 ; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [1,16,0,8,0,3,2,3]
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>)
698 define <16 x i8> @foldv16i8() nounwind {
699 ; SSE-LABEL: foldv16i8:
701 ; SSE-NEXT: movaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
704 ; AVX-LABEL: foldv16i8:
706 ; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
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:
716 ; BITALG-NEXT: vmovaps {{.*#+}} xmm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1]
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>)
722 define <2 x i64> @eq_1_v2i64(<2 x i64> %0) {
723 ; SSE2-LABEL: eq_1_v2i64:
725 ; SSE2-NEXT: pxor %xmm1, %xmm1
726 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
727 ; SSE2-NEXT: paddq %xmm0, %xmm2
728 ; SSE2-NEXT: pand %xmm0, %xmm2
729 ; SSE2-NEXT: movdqa %xmm0, %xmm3
730 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
731 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,0,3,2]
732 ; SSE2-NEXT: pand %xmm3, %xmm0
733 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
734 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
735 ; SSE2-NEXT: pand %xmm2, %xmm1
736 ; SSE2-NEXT: pandn %xmm1, %xmm0
739 ; SSE3-LABEL: eq_1_v2i64:
741 ; SSE3-NEXT: pxor %xmm1, %xmm1
742 ; SSE3-NEXT: pcmpeqd %xmm2, %xmm2
743 ; SSE3-NEXT: paddq %xmm0, %xmm2
744 ; SSE3-NEXT: pand %xmm0, %xmm2
745 ; SSE3-NEXT: movdqa %xmm0, %xmm3
746 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm3
747 ; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,0,3,2]
748 ; SSE3-NEXT: pand %xmm3, %xmm0
749 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm2
750 ; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
751 ; SSE3-NEXT: pand %xmm2, %xmm1
752 ; SSE3-NEXT: pandn %xmm1, %xmm0
755 ; SSSE3-LABEL: eq_1_v2i64:
757 ; SSSE3-NEXT: pxor %xmm1, %xmm1
758 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
759 ; SSSE3-NEXT: paddq %xmm0, %xmm2
760 ; SSSE3-NEXT: pand %xmm0, %xmm2
761 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
762 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm3
763 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,0,3,2]
764 ; SSSE3-NEXT: pand %xmm3, %xmm0
765 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
766 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
767 ; SSSE3-NEXT: pand %xmm2, %xmm1
768 ; SSSE3-NEXT: pandn %xmm1, %xmm0
771 ; SSE41-LABEL: eq_1_v2i64:
773 ; SSE41-NEXT: pxor %xmm1, %xmm1
774 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
775 ; SSE41-NEXT: paddq %xmm0, %xmm2
776 ; SSE41-NEXT: pand %xmm0, %xmm2
777 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
778 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
779 ; SSE41-NEXT: pandn %xmm2, %xmm0
782 ; AVX1OR2-LABEL: eq_1_v2i64:
784 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
785 ; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
786 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
787 ; AVX1OR2-NEXT: vpaddq %xmm3, %xmm0, %xmm3
788 ; AVX1OR2-NEXT: vpand %xmm3, %xmm0, %xmm0
789 ; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
790 ; AVX1OR2-NEXT: vpandn %xmm0, %xmm2, %xmm0
793 ; XOP-LABEL: eq_1_v2i64:
795 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
796 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm2
797 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
798 ; XOP-NEXT: vpaddq %xmm3, %xmm0, %xmm3
799 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
800 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0
801 ; XOP-NEXT: vpand %xmm0, %xmm2, %xmm0
804 ; AVX512VPOPCNTDQ-LABEL: eq_1_v2i64:
805 ; AVX512VPOPCNTDQ: # %bb.0:
806 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
807 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
808 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
809 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
810 ; AVX512VPOPCNTDQ-NEXT: retq
812 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v2i64:
813 ; AVX512VPOPCNTDQVL: # %bb.0:
814 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0
815 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]
816 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
817 ; AVX512VPOPCNTDQVL-NEXT: retq
819 ; BITALG_NOVLX-LABEL: eq_1_v2i64:
820 ; BITALG_NOVLX: # %bb.0:
821 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
822 ; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
823 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
824 ; BITALG_NOVLX-NEXT: vpaddq %xmm3, %xmm0, %xmm3
825 ; BITALG_NOVLX-NEXT: vpand %xmm3, %xmm0, %xmm0
826 ; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
827 ; BITALG_NOVLX-NEXT: vpandn %xmm0, %xmm2, %xmm0
828 ; BITALG_NOVLX-NEXT: retq
830 ; BITALG-LABEL: eq_1_v2i64:
832 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
833 ; BITALG-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
834 ; BITALG-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
835 ; BITALG-NEXT: vpaddq %xmm3, %xmm0, %xmm3
836 ; BITALG-NEXT: vpand %xmm3, %xmm0, %xmm0
837 ; BITALG-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
838 ; BITALG-NEXT: vpandn %xmm0, %xmm2, %xmm0
840 %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)
841 %3 = icmp eq <2 x i64> %2, <i64 1, i64 1>
842 %4 = sext <2 x i1> %3 to <2 x i64>
846 define <2 x i64> @ne_1_v2i64(<2 x i64> %0) {
847 ; SSE2-LABEL: ne_1_v2i64:
849 ; SSE2-NEXT: pxor %xmm1, %xmm1
850 ; SSE2-NEXT: movdqa %xmm0, %xmm2
851 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
852 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
853 ; SSE2-NEXT: pand %xmm2, %xmm3
854 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
855 ; SSE2-NEXT: movdqa %xmm0, %xmm4
856 ; SSE2-NEXT: paddq %xmm2, %xmm4
857 ; SSE2-NEXT: pand %xmm4, %xmm0
858 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
859 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
860 ; SSE2-NEXT: pand %xmm1, %xmm0
861 ; SSE2-NEXT: pxor %xmm2, %xmm0
862 ; SSE2-NEXT: por %xmm3, %xmm0
865 ; SSE3-LABEL: ne_1_v2i64:
867 ; SSE3-NEXT: pxor %xmm1, %xmm1
868 ; SSE3-NEXT: movdqa %xmm0, %xmm2
869 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm2
870 ; SSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
871 ; SSE3-NEXT: pand %xmm2, %xmm3
872 ; SSE3-NEXT: pcmpeqd %xmm2, %xmm2
873 ; SSE3-NEXT: movdqa %xmm0, %xmm4
874 ; SSE3-NEXT: paddq %xmm2, %xmm4
875 ; SSE3-NEXT: pand %xmm4, %xmm0
876 ; SSE3-NEXT: pcmpeqd %xmm1, %xmm0
877 ; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
878 ; SSE3-NEXT: pand %xmm1, %xmm0
879 ; SSE3-NEXT: pxor %xmm2, %xmm0
880 ; SSE3-NEXT: por %xmm3, %xmm0
883 ; SSSE3-LABEL: ne_1_v2i64:
885 ; SSSE3-NEXT: pxor %xmm1, %xmm1
886 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
887 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
888 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,0,3,2]
889 ; SSSE3-NEXT: pand %xmm2, %xmm3
890 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
891 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
892 ; SSSE3-NEXT: paddq %xmm2, %xmm4
893 ; SSSE3-NEXT: pand %xmm4, %xmm0
894 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
895 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
896 ; SSSE3-NEXT: pand %xmm1, %xmm0
897 ; SSSE3-NEXT: pxor %xmm2, %xmm0
898 ; SSSE3-NEXT: por %xmm3, %xmm0
901 ; SSE41-LABEL: ne_1_v2i64:
903 ; SSE41-NEXT: pxor %xmm1, %xmm1
904 ; SSE41-NEXT: movdqa %xmm0, %xmm2
905 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm2
906 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
907 ; SSE41-NEXT: movdqa %xmm0, %xmm4
908 ; SSE41-NEXT: paddq %xmm3, %xmm4
909 ; SSE41-NEXT: pand %xmm4, %xmm0
910 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
911 ; SSE41-NEXT: pxor %xmm3, %xmm0
912 ; SSE41-NEXT: por %xmm2, %xmm0
915 ; AVX1OR2-LABEL: ne_1_v2i64:
917 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
918 ; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
919 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
920 ; AVX1OR2-NEXT: vpaddq %xmm3, %xmm0, %xmm4
921 ; AVX1OR2-NEXT: vpand %xmm4, %xmm0, %xmm0
922 ; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
923 ; AVX1OR2-NEXT: vpxor %xmm3, %xmm0, %xmm0
924 ; AVX1OR2-NEXT: vpor %xmm0, %xmm2, %xmm0
927 ; XOP-LABEL: ne_1_v2i64:
929 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
930 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm2
931 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
932 ; XOP-NEXT: vpaddq %xmm3, %xmm0, %xmm3
933 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
934 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0
935 ; XOP-NEXT: vpor %xmm0, %xmm2, %xmm0
938 ; AVX512VPOPCNTDQ-LABEL: ne_1_v2i64:
939 ; AVX512VPOPCNTDQ: # %bb.0:
940 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
941 ; AVX512VPOPCNTDQ-NEXT: vpopcntq %zmm0, %zmm0
942 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
943 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
944 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
945 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
946 ; AVX512VPOPCNTDQ-NEXT: retq
948 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v2i64:
949 ; AVX512VPOPCNTDQVL: # %bb.0:
950 ; AVX512VPOPCNTDQVL-NEXT: vpopcntq %xmm0, %xmm0
951 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [1,1]
952 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
953 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
954 ; AVX512VPOPCNTDQVL-NEXT: retq
956 ; BITALG_NOVLX-LABEL: ne_1_v2i64:
957 ; BITALG_NOVLX: # %bb.0:
958 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
959 ; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
960 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
961 ; BITALG_NOVLX-NEXT: vpaddq %xmm3, %xmm0, %xmm3
962 ; BITALG_NOVLX-NEXT: vpand %xmm3, %xmm0, %xmm0
963 ; BITALG_NOVLX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
964 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
965 ; BITALG_NOVLX-NEXT: vpor %xmm0, %xmm2, %xmm0
966 ; BITALG_NOVLX-NEXT: vzeroupper
967 ; BITALG_NOVLX-NEXT: retq
969 ; BITALG-LABEL: ne_1_v2i64:
971 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
972 ; BITALG-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm2
973 ; BITALG-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
974 ; BITALG-NEXT: vpaddq %xmm3, %xmm0, %xmm4
975 ; BITALG-NEXT: vpand %xmm4, %xmm0, %xmm0
976 ; BITALG-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
977 ; BITALG-NEXT: vpternlogq $222, %xmm3, %xmm2, %xmm0
979 %2 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %0)
980 %3 = icmp ne <2 x i64> %2, <i64 1, i64 1>
981 %4 = sext <2 x i1> %3 to <2 x i64>
985 define <4 x i32> @eq_1_v4i32(<4 x i32> %0) {
986 ; SSE-LABEL: eq_1_v4i32:
988 ; SSE-NEXT: pxor %xmm1, %xmm1
989 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
990 ; SSE-NEXT: paddd %xmm0, %xmm2
991 ; SSE-NEXT: pand %xmm0, %xmm2
992 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
993 ; SSE-NEXT: pcmpeqd %xmm1, %xmm2
994 ; SSE-NEXT: pandn %xmm2, %xmm0
997 ; AVX1OR2-LABEL: eq_1_v4i32:
999 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1000 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1001 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1002 ; AVX1OR2-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1003 ; AVX1OR2-NEXT: vpand %xmm3, %xmm0, %xmm0
1004 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1005 ; AVX1OR2-NEXT: vpandn %xmm0, %xmm2, %xmm0
1006 ; AVX1OR2-NEXT: retq
1008 ; XOP-LABEL: eq_1_v4i32:
1010 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1011 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm2
1012 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1013 ; XOP-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1014 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1015 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0
1016 ; XOP-NEXT: vpand %xmm0, %xmm2, %xmm0
1019 ; AVX512VPOPCNTDQ-LABEL: eq_1_v4i32:
1020 ; AVX512VPOPCNTDQ: # %bb.0:
1021 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1022 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
1023 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1024 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1025 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
1026 ; AVX512VPOPCNTDQ-NEXT: retq
1028 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i32:
1029 ; AVX512VPOPCNTDQVL: # %bb.0:
1030 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0
1031 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1032 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1033 ; AVX512VPOPCNTDQVL-NEXT: retq
1035 ; BITALG_NOVLX-LABEL: eq_1_v4i32:
1036 ; BITALG_NOVLX: # %bb.0:
1037 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1038 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1039 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1040 ; BITALG_NOVLX-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1041 ; BITALG_NOVLX-NEXT: vpand %xmm3, %xmm0, %xmm0
1042 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1043 ; BITALG_NOVLX-NEXT: vpandn %xmm0, %xmm2, %xmm0
1044 ; BITALG_NOVLX-NEXT: retq
1046 ; BITALG-LABEL: eq_1_v4i32:
1048 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
1049 ; BITALG-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1050 ; BITALG-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1051 ; BITALG-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1052 ; BITALG-NEXT: vpand %xmm3, %xmm0, %xmm0
1053 ; BITALG-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1054 ; BITALG-NEXT: vpandn %xmm0, %xmm2, %xmm0
1056 %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)
1057 %3 = icmp eq <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>
1058 %4 = sext <4 x i1> %3 to <4 x i32>
1062 define <4 x i32> @ne_1_v4i32(<4 x i32> %0) {
1063 ; SSE-LABEL: ne_1_v4i32:
1065 ; SSE-NEXT: pxor %xmm1, %xmm1
1066 ; SSE-NEXT: movdqa %xmm0, %xmm2
1067 ; SSE-NEXT: pcmpeqd %xmm1, %xmm2
1068 ; SSE-NEXT: pcmpeqd %xmm3, %xmm3
1069 ; SSE-NEXT: movdqa %xmm0, %xmm4
1070 ; SSE-NEXT: paddd %xmm3, %xmm4
1071 ; SSE-NEXT: pand %xmm4, %xmm0
1072 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
1073 ; SSE-NEXT: pxor %xmm3, %xmm0
1074 ; SSE-NEXT: por %xmm2, %xmm0
1077 ; AVX1OR2-LABEL: ne_1_v4i32:
1079 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1080 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1081 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1082 ; AVX1OR2-NEXT: vpaddd %xmm3, %xmm0, %xmm4
1083 ; AVX1OR2-NEXT: vpand %xmm4, %xmm0, %xmm0
1084 ; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1085 ; AVX1OR2-NEXT: vpxor %xmm3, %xmm0, %xmm0
1086 ; AVX1OR2-NEXT: vpor %xmm0, %xmm2, %xmm0
1087 ; AVX1OR2-NEXT: retq
1089 ; XOP-LABEL: ne_1_v4i32:
1091 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1092 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm2
1093 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1094 ; XOP-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1095 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1096 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0
1097 ; XOP-NEXT: vpor %xmm0, %xmm2, %xmm0
1100 ; AVX512VPOPCNTDQ-LABEL: ne_1_v4i32:
1101 ; AVX512VPOPCNTDQ: # %bb.0:
1102 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1103 ; AVX512VPOPCNTDQ-NEXT: vpopcntd %zmm0, %zmm0
1104 ; AVX512VPOPCNTDQ-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1105 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1106 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1107 ; AVX512VPOPCNTDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
1108 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
1109 ; AVX512VPOPCNTDQ-NEXT: retq
1111 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i32:
1112 ; AVX512VPOPCNTDQVL: # %bb.0:
1113 ; AVX512VPOPCNTDQVL-NEXT: vpopcntd %xmm0, %xmm0
1114 ; AVX512VPOPCNTDQVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
1115 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1116 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1117 ; AVX512VPOPCNTDQVL-NEXT: retq
1119 ; BITALG_NOVLX-LABEL: ne_1_v4i32:
1120 ; BITALG_NOVLX: # %bb.0:
1121 ; BITALG_NOVLX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1122 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1123 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1124 ; BITALG_NOVLX-NEXT: vpaddd %xmm3, %xmm0, %xmm3
1125 ; BITALG_NOVLX-NEXT: vpand %xmm3, %xmm0, %xmm0
1126 ; BITALG_NOVLX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1127 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1128 ; BITALG_NOVLX-NEXT: vpor %xmm0, %xmm2, %xmm0
1129 ; BITALG_NOVLX-NEXT: vzeroupper
1130 ; BITALG_NOVLX-NEXT: retq
1132 ; BITALG-LABEL: ne_1_v4i32:
1134 ; BITALG-NEXT: vpxor %xmm1, %xmm1, %xmm1
1135 ; BITALG-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm2
1136 ; BITALG-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1137 ; BITALG-NEXT: vpaddd %xmm3, %xmm0, %xmm4
1138 ; BITALG-NEXT: vpand %xmm4, %xmm0, %xmm0
1139 ; BITALG-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
1140 ; BITALG-NEXT: vpternlogd $222, %xmm3, %xmm2, %xmm0
1142 %2 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %0)
1143 %3 = icmp ne <4 x i32> %2, <i32 1, i32 1, i32 1, i32 1>
1144 %4 = sext <4 x i1> %3 to <4 x i32>
1148 define <8 x i16> @eq_1_v8i16(<8 x i16> %0) {
1149 ; SSE-LABEL: eq_1_v8i16:
1151 ; SSE-NEXT: pxor %xmm1, %xmm1
1152 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
1153 ; SSE-NEXT: paddw %xmm0, %xmm2
1154 ; SSE-NEXT: pand %xmm0, %xmm2
1155 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
1156 ; SSE-NEXT: pcmpeqw %xmm1, %xmm2
1157 ; SSE-NEXT: pandn %xmm2, %xmm0
1160 ; AVX1OR2-LABEL: eq_1_v8i16:
1162 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1163 ; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
1164 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1165 ; AVX1OR2-NEXT: vpaddw %xmm3, %xmm0, %xmm3
1166 ; AVX1OR2-NEXT: vpand %xmm3, %xmm0, %xmm0
1167 ; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
1168 ; AVX1OR2-NEXT: vpandn %xmm0, %xmm2, %xmm0
1169 ; AVX1OR2-NEXT: retq
1171 ; XOP-LABEL: eq_1_v8i16:
1173 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1174 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm2
1175 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1176 ; XOP-NEXT: vpaddw %xmm3, %xmm0, %xmm3
1177 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1178 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0
1179 ; XOP-NEXT: vpand %xmm0, %xmm2, %xmm0
1182 ; AVX512-LABEL: eq_1_v8i16:
1184 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
1185 ; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
1186 ; AVX512-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1187 ; AVX512-NEXT: vpaddw %xmm3, %xmm0, %xmm3
1188 ; AVX512-NEXT: vpand %xmm3, %xmm0, %xmm0
1189 ; AVX512-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
1190 ; AVX512-NEXT: vpandn %xmm0, %xmm2, %xmm0
1193 ; BITALG_NOVLX-LABEL: eq_1_v8i16:
1194 ; BITALG_NOVLX: # %bb.0:
1195 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1196 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
1197 ; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1198 ; BITALG_NOVLX-NEXT: vzeroupper
1199 ; BITALG_NOVLX-NEXT: retq
1201 ; BITALG-LABEL: eq_1_v8i16:
1203 ; BITALG-NEXT: vpopcntw %xmm0, %xmm0
1204 ; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1206 %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)
1207 %3 = icmp eq <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1208 %4 = sext <8 x i1> %3 to <8 x i16>
1212 define <8 x i16> @ne_1_v8i16(<8 x i16> %0) {
1213 ; SSE-LABEL: ne_1_v8i16:
1215 ; SSE-NEXT: pxor %xmm1, %xmm1
1216 ; SSE-NEXT: movdqa %xmm0, %xmm2
1217 ; SSE-NEXT: pcmpeqw %xmm1, %xmm2
1218 ; SSE-NEXT: pcmpeqd %xmm3, %xmm3
1219 ; SSE-NEXT: movdqa %xmm0, %xmm4
1220 ; SSE-NEXT: paddw %xmm3, %xmm4
1221 ; SSE-NEXT: pand %xmm4, %xmm0
1222 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
1223 ; SSE-NEXT: pxor %xmm3, %xmm0
1224 ; SSE-NEXT: por %xmm2, %xmm0
1227 ; AVX1OR2-LABEL: ne_1_v8i16:
1229 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1230 ; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
1231 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1232 ; AVX1OR2-NEXT: vpaddw %xmm3, %xmm0, %xmm4
1233 ; AVX1OR2-NEXT: vpand %xmm4, %xmm0, %xmm0
1234 ; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
1235 ; AVX1OR2-NEXT: vpxor %xmm3, %xmm0, %xmm0
1236 ; AVX1OR2-NEXT: vpor %xmm0, %xmm2, %xmm0
1237 ; AVX1OR2-NEXT: retq
1239 ; XOP-LABEL: ne_1_v8i16:
1241 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1242 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm2
1243 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1244 ; XOP-NEXT: vpaddw %xmm3, %xmm0, %xmm3
1245 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1246 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0
1247 ; XOP-NEXT: vpor %xmm0, %xmm2, %xmm0
1250 ; AVX512VPOPCNTDQ-LABEL: ne_1_v8i16:
1251 ; AVX512VPOPCNTDQ: # %bb.0:
1252 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
1253 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
1254 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1255 ; AVX512VPOPCNTDQ-NEXT: vpaddw %xmm3, %xmm0, %xmm3
1256 ; AVX512VPOPCNTDQ-NEXT: vpand %xmm3, %xmm0, %xmm0
1257 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
1258 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1259 ; AVX512VPOPCNTDQ-NEXT: vpor %xmm0, %xmm2, %xmm0
1260 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
1261 ; AVX512VPOPCNTDQ-NEXT: retq
1263 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v8i16:
1264 ; AVX512VPOPCNTDQVL: # %bb.0:
1265 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1266 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm2
1267 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1268 ; AVX512VPOPCNTDQVL-NEXT: vpaddw %xmm3, %xmm0, %xmm4
1269 ; AVX512VPOPCNTDQVL-NEXT: vpand %xmm4, %xmm0, %xmm0
1270 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
1271 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $222, %xmm3, %xmm2, %xmm0
1272 ; AVX512VPOPCNTDQVL-NEXT: retq
1274 ; BITALG_NOVLX-LABEL: ne_1_v8i16:
1275 ; BITALG_NOVLX: # %bb.0:
1276 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1277 ; BITALG_NOVLX-NEXT: vpopcntw %zmm0, %zmm0
1278 ; BITALG_NOVLX-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1279 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1280 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
1281 ; BITALG_NOVLX-NEXT: vzeroupper
1282 ; BITALG_NOVLX-NEXT: retq
1284 ; BITALG-LABEL: ne_1_v8i16:
1286 ; BITALG-NEXT: vpopcntw %xmm0, %xmm0
1287 ; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1288 ; BITALG-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1290 %2 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %0)
1291 %3 = icmp ne <8 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
1292 %4 = sext <8 x i1> %3 to <8 x i16>
1296 define <16 x i8> @eq_1_v16i8(<16 x i8> %0) {
1297 ; SSE-LABEL: eq_1_v16i8:
1299 ; SSE-NEXT: pxor %xmm1, %xmm1
1300 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
1301 ; SSE-NEXT: paddb %xmm0, %xmm2
1302 ; SSE-NEXT: pand %xmm0, %xmm2
1303 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
1304 ; SSE-NEXT: pcmpeqb %xmm1, %xmm2
1305 ; SSE-NEXT: pandn %xmm2, %xmm0
1308 ; AVX1OR2-LABEL: eq_1_v16i8:
1310 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1311 ; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm2
1312 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1313 ; AVX1OR2-NEXT: vpaddb %xmm3, %xmm0, %xmm3
1314 ; AVX1OR2-NEXT: vpand %xmm3, %xmm0, %xmm0
1315 ; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1316 ; AVX1OR2-NEXT: vpandn %xmm0, %xmm2, %xmm0
1317 ; AVX1OR2-NEXT: retq
1319 ; XOP-LABEL: eq_1_v16i8:
1321 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1322 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm2
1323 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1324 ; XOP-NEXT: vpaddb %xmm3, %xmm0, %xmm3
1325 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1326 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0
1327 ; XOP-NEXT: vpand %xmm0, %xmm2, %xmm0
1330 ; AVX512-LABEL: eq_1_v16i8:
1332 ; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
1333 ; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm2
1334 ; AVX512-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1335 ; AVX512-NEXT: vpaddb %xmm3, %xmm0, %xmm3
1336 ; AVX512-NEXT: vpand %xmm3, %xmm0, %xmm0
1337 ; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1338 ; AVX512-NEXT: vpandn %xmm0, %xmm2, %xmm0
1341 ; BITALG_NOVLX-LABEL: eq_1_v16i8:
1342 ; BITALG_NOVLX: # %bb.0:
1343 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1344 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
1345 ; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1346 ; BITALG_NOVLX-NEXT: vzeroupper
1347 ; BITALG_NOVLX-NEXT: retq
1349 ; BITALG-LABEL: eq_1_v16i8:
1351 ; BITALG-NEXT: vpopcntb %xmm0, %xmm0
1352 ; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1354 %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)
1355 %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>
1356 %4 = sext <16 x i1> %3 to <16 x i8>
1360 define <16 x i8> @ne_1_v16i8(<16 x i8> %0) {
1361 ; SSE-LABEL: ne_1_v16i8:
1363 ; SSE-NEXT: pxor %xmm1, %xmm1
1364 ; SSE-NEXT: movdqa %xmm0, %xmm2
1365 ; SSE-NEXT: pcmpeqb %xmm1, %xmm2
1366 ; SSE-NEXT: pcmpeqd %xmm3, %xmm3
1367 ; SSE-NEXT: movdqa %xmm0, %xmm4
1368 ; SSE-NEXT: paddb %xmm3, %xmm4
1369 ; SSE-NEXT: pand %xmm4, %xmm0
1370 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
1371 ; SSE-NEXT: pxor %xmm3, %xmm0
1372 ; SSE-NEXT: por %xmm2, %xmm0
1375 ; AVX1OR2-LABEL: ne_1_v16i8:
1377 ; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1378 ; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm2
1379 ; AVX1OR2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1380 ; AVX1OR2-NEXT: vpaddb %xmm3, %xmm0, %xmm4
1381 ; AVX1OR2-NEXT: vpand %xmm4, %xmm0, %xmm0
1382 ; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1383 ; AVX1OR2-NEXT: vpxor %xmm3, %xmm0, %xmm0
1384 ; AVX1OR2-NEXT: vpor %xmm0, %xmm2, %xmm0
1385 ; AVX1OR2-NEXT: retq
1387 ; XOP-LABEL: ne_1_v16i8:
1389 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
1390 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm2
1391 ; XOP-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1392 ; XOP-NEXT: vpaddb %xmm3, %xmm0, %xmm3
1393 ; XOP-NEXT: vpand %xmm3, %xmm0, %xmm0
1394 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0
1395 ; XOP-NEXT: vpor %xmm0, %xmm2, %xmm0
1398 ; AVX512VPOPCNTDQ-LABEL: ne_1_v16i8:
1399 ; AVX512VPOPCNTDQ: # %bb.0:
1400 ; AVX512VPOPCNTDQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
1401 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm2
1402 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1403 ; AVX512VPOPCNTDQ-NEXT: vpaddb %xmm3, %xmm0, %xmm3
1404 ; AVX512VPOPCNTDQ-NEXT: vpand %xmm3, %xmm0, %xmm0
1405 ; AVX512VPOPCNTDQ-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1406 ; AVX512VPOPCNTDQ-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1407 ; AVX512VPOPCNTDQ-NEXT: vpor %xmm0, %xmm2, %xmm0
1408 ; AVX512VPOPCNTDQ-NEXT: vzeroupper
1409 ; AVX512VPOPCNTDQ-NEXT: retq
1411 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v16i8:
1412 ; AVX512VPOPCNTDQVL: # %bb.0:
1413 ; AVX512VPOPCNTDQVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1414 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm2
1415 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
1416 ; AVX512VPOPCNTDQVL-NEXT: vpaddb %xmm3, %xmm0, %xmm4
1417 ; AVX512VPOPCNTDQVL-NEXT: vpand %xmm4, %xmm0, %xmm0
1418 ; AVX512VPOPCNTDQVL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
1419 ; AVX512VPOPCNTDQVL-NEXT: vpternlogq $222, %xmm3, %xmm2, %xmm0
1420 ; AVX512VPOPCNTDQVL-NEXT: retq
1422 ; BITALG_NOVLX-LABEL: ne_1_v16i8:
1423 ; BITALG_NOVLX: # %bb.0:
1424 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1425 ; BITALG_NOVLX-NEXT: vpopcntb %zmm0, %zmm0
1426 ; BITALG_NOVLX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1427 ; BITALG_NOVLX-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1428 ; BITALG_NOVLX-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
1429 ; BITALG_NOVLX-NEXT: vzeroupper
1430 ; BITALG_NOVLX-NEXT: retq
1432 ; BITALG-LABEL: ne_1_v16i8:
1434 ; BITALG-NEXT: vpopcntb %xmm0, %xmm0
1435 ; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1436 ; BITALG-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
1438 %2 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %0)
1439 %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>
1440 %4 = sext <16 x i1> %3 to <16 x i8>
1444 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
1445 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1446 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
1447 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)