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 ; SSE-LABEL: eq_1_v2i64:
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
739 ; AVX1OR2-LABEL: eq_1_v2i64:
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
748 ; XOP-LABEL: eq_1_v2i64:
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
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:
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
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>
798 define <2 x i64> @ne_1_v2i64(<2 x i64> %0) {
799 ; SSE-LABEL: ne_1_v2i64:
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
817 ; AVX1OR2-LABEL: ne_1_v2i64:
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
827 ; XOP-LABEL: ne_1_v2i64:
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
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:
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
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>
877 define <4 x i32> @eq_1_v4i32(<4 x i32> %0) {
878 ; SSE2-LABEL: eq_1_v4i32:
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
887 ; SSE3-LABEL: eq_1_v4i32:
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
896 ; SSSE3-LABEL: eq_1_v4i32:
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
905 ; SSE41-LABEL: eq_1_v4i32:
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
916 ; AVX1OR2-LABEL: eq_1_v4i32:
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
926 ; XOP-LABEL: eq_1_v4i32:
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
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:
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
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>
977 define <4 x i32> @ne_1_v4i32(<4 x i32> %0) {
978 ; SSE2-LABEL: ne_1_v4i32:
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
989 ; SSE3-LABEL: ne_1_v4i32:
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
1000 ; SSSE3-LABEL: ne_1_v4i32:
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
1011 ; SSE41-LABEL: ne_1_v4i32:
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
1020 ; AVX1OR2-LABEL: ne_1_v4i32:
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:
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
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:
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
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>
1079 define <8 x i16> @eq_1_v8i16(<8 x i16> %0) {
1080 ; SSE2-LABEL: eq_1_v8i16:
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
1089 ; SSE3-LABEL: eq_1_v8i16:
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
1098 ; SSSE3-LABEL: eq_1_v8i16:
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
1107 ; SSE41-LABEL: eq_1_v8i16:
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
1118 ; AVX1OR2-LABEL: eq_1_v8i16:
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:
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
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:
1168 ; BITALG-NEXT: vpopcntw %xmm0, %xmm0
1169 ; BITALG-NEXT: vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
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>
1177 define <8 x i16> @ne_1_v8i16(<8 x i16> %0) {
1178 ; SSE2-LABEL: ne_1_v8i16:
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
1188 ; SSE3-LABEL: ne_1_v8i16:
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
1198 ; SSSE3-LABEL: ne_1_v8i16:
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
1208 ; SSE41-LABEL: ne_1_v8i16:
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
1217 ; AVX1OR2-LABEL: ne_1_v8i16:
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:
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
1234 ; AVX512-LABEL: ne_1_v8i16:
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
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:
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
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>
1265 define <16 x i8> @eq_1_v16i8(<16 x i8> %0) {
1266 ; SSE-LABEL: eq_1_v16i8:
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
1277 ; AVX1OR2-LABEL: eq_1_v16i8:
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:
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
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:
1327 ; BITALG-NEXT: vpopcntb %xmm0, %xmm0
1328 ; BITALG-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
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>
1336 define <16 x i8> @ne_1_v16i8(<16 x i8> %0) {
1337 ; SSE-LABEL: ne_1_v16i8:
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
1346 ; AVX1OR2-LABEL: ne_1_v16i8:
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:
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
1363 ; AVX512-LABEL: ne_1_v16i8:
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
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:
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
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>
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>)