[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-popcnt-256.ll
blob500cc8e06b6248ceb4e820014eb771378af3eb2d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQ
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vpopcntdq,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512VPOPCNTDQVL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg | FileCheck %s --check-prefixes=ALL,BITALG_NOVLX
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bitalg,+avx512vl | FileCheck %s --check-prefixes=ALL,BITALG
9 define <4 x i64> @testv4i64(<4 x i64> %in) nounwind {
10 ; AVX1-LABEL: testv4i64:
11 ; AVX1:       # %bb.0:
12 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
13 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
14 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
15 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
16 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
17 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
18 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
19 ; AVX1-NEXT:    vpshufb %xmm1, %xmm4, %xmm1
20 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
21 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
22 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm1, %xmm1
23 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm5
24 ; AVX1-NEXT:    vpshufb %xmm5, %xmm4, %xmm5
25 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
26 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
27 ; AVX1-NEXT:    vpshufb %xmm0, %xmm4, %xmm0
28 ; AVX1-NEXT:    vpaddb %xmm5, %xmm0, %xmm0
29 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm0, %xmm0
30 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
31 ; AVX1-NEXT:    retq
33 ; AVX2-LABEL: testv4i64:
34 ; AVX2:       # %bb.0:
35 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
36 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
37 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
38 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
39 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
40 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
41 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
42 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
43 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
44 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
45 ; AVX2-NEXT:    retq
47 ; AVX512VPOPCNTDQ-LABEL: testv4i64:
48 ; AVX512VPOPCNTDQ:       # %bb.0:
49 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
50 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
51 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
52 ; AVX512VPOPCNTDQ-NEXT:    retq
54 ; AVX512VPOPCNTDQVL-LABEL: testv4i64:
55 ; AVX512VPOPCNTDQVL:       # %bb.0:
56 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0
57 ; AVX512VPOPCNTDQVL-NEXT:    retq
59 ; BITALG_NOVLX-LABEL: testv4i64:
60 ; BITALG_NOVLX:       # %bb.0:
61 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
62 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
63 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
64 ; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
65 ; BITALG_NOVLX-NEXT:    retq
67 ; BITALG-LABEL: testv4i64:
68 ; BITALG:       # %bb.0:
69 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
70 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
71 ; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
72 ; BITALG-NEXT:    retq
73   %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %in)
74   ret <4 x i64> %out
77 define <8 x i32> @testv8i32(<8 x i32> %in) nounwind {
78 ; AVX1-LABEL: testv8i32:
79 ; AVX1:       # %bb.0:
80 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
81 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
82 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
83 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
84 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
85 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
86 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
87 ; AVX1-NEXT:    vpshufb %xmm1, %xmm4, %xmm1
88 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
89 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
90 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm5 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
91 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm5, %xmm5
92 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
93 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm1, %xmm1
94 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm1, %xmm1
95 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm5
96 ; AVX1-NEXT:    vpshufb %xmm5, %xmm4, %xmm5
97 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
98 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
99 ; AVX1-NEXT:    vpshufb %xmm0, %xmm4, %xmm0
100 ; AVX1-NEXT:    vpaddb %xmm5, %xmm0, %xmm0
101 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]
102 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm2, %xmm2
103 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
104 ; AVX1-NEXT:    vpsadbw %xmm3, %xmm0, %xmm0
105 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
106 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
107 ; AVX1-NEXT:    retq
109 ; AVX2-LABEL: testv8i32:
110 ; AVX2:       # %bb.0:
111 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
112 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
113 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
114 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
115 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
116 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
117 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
118 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
119 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
120 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
121 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2
122 ; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
123 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
124 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
125 ; AVX2-NEXT:    retq
127 ; AVX512VPOPCNTDQ-LABEL: testv8i32:
128 ; AVX512VPOPCNTDQ:       # %bb.0:
129 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
130 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
131 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
132 ; AVX512VPOPCNTDQ-NEXT:    retq
134 ; AVX512VPOPCNTDQVL-LABEL: testv8i32:
135 ; AVX512VPOPCNTDQVL:       # %bb.0:
136 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
137 ; AVX512VPOPCNTDQVL-NEXT:    retq
139 ; BITALG_NOVLX-LABEL: testv8i32:
140 ; BITALG_NOVLX:       # %bb.0:
141 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
142 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
143 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
144 ; BITALG_NOVLX-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
145 ; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2
146 ; BITALG_NOVLX-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
147 ; BITALG_NOVLX-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
148 ; BITALG_NOVLX-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
149 ; BITALG_NOVLX-NEXT:    retq
151 ; BITALG-LABEL: testv8i32:
152 ; BITALG:       # %bb.0:
153 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
154 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
155 ; BITALG-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
156 ; BITALG-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2
157 ; BITALG-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
158 ; BITALG-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
159 ; BITALG-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
160 ; BITALG-NEXT:    retq
161   %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %in)
162   ret <8 x i32> %out
165 define <16 x i16> @testv16i16(<16 x i16> %in) nounwind {
166 ; AVX1-LABEL: testv16i16:
167 ; AVX1:       # %bb.0:
168 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
169 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
170 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
171 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
172 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm4
173 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
174 ; AVX1-NEXT:    vpshufb %xmm4, %xmm3, %xmm4
175 ; AVX1-NEXT:    vpaddb %xmm2, %xmm4, %xmm2
176 ; AVX1-NEXT:    vpsllw $8, %xmm2, %xmm4
177 ; AVX1-NEXT:    vpaddb %xmm2, %xmm4, %xmm2
178 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
179 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
180 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm4
181 ; AVX1-NEXT:    vpshufb %xmm4, %xmm3, %xmm4
182 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
183 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
184 ; AVX1-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
185 ; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm0
186 ; AVX1-NEXT:    vpsllw $8, %xmm0, %xmm1
187 ; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
188 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
189 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
190 ; AVX1-NEXT:    retq
192 ; AVX2-LABEL: testv16i16:
193 ; AVX2:       # %bb.0:
194 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
195 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
196 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
197 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
198 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
199 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
200 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
201 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
202 ; AVX2-NEXT:    vpsllw $8, %ymm0, %ymm1
203 ; AVX2-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
204 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
205 ; AVX2-NEXT:    retq
207 ; AVX512VPOPCNTDQ-LABEL: testv16i16:
208 ; AVX512VPOPCNTDQ:       # %bb.0:
209 ; AVX512VPOPCNTDQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
210 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
211 ; AVX512VPOPCNTDQ-NEXT:    vpmovdw %zmm0, %ymm0
212 ; AVX512VPOPCNTDQ-NEXT:    retq
214 ; AVX512VPOPCNTDQVL-LABEL: testv16i16:
215 ; AVX512VPOPCNTDQVL:       # %bb.0:
216 ; AVX512VPOPCNTDQVL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
217 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %zmm0, %zmm0
218 ; AVX512VPOPCNTDQVL-NEXT:    vpmovdw %zmm0, %ymm0
219 ; AVX512VPOPCNTDQVL-NEXT:    retq
221 ; BITALG_NOVLX-LABEL: testv16i16:
222 ; BITALG_NOVLX:       # %bb.0:
223 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
224 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
225 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
226 ; BITALG_NOVLX-NEXT:    retq
228 ; BITALG-LABEL: testv16i16:
229 ; BITALG:       # %bb.0:
230 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
231 ; BITALG-NEXT:    retq
232   %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %in)
233   ret <16 x i16> %out
236 define <32 x i8> @testv32i8(<32 x i8> %in) nounwind {
237 ; AVX1-LABEL: testv32i8:
238 ; AVX1:       # %bb.0:
239 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
240 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
241 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
242 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
243 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
244 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
245 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
246 ; AVX1-NEXT:    vpshufb %xmm1, %xmm4, %xmm1
247 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
248 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm3
249 ; AVX1-NEXT:    vpshufb %xmm3, %xmm4, %xmm3
250 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm0
251 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
252 ; AVX1-NEXT:    vpshufb %xmm0, %xmm4, %xmm0
253 ; AVX1-NEXT:    vpaddb %xmm3, %xmm0, %xmm0
254 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
255 ; AVX1-NEXT:    retq
257 ; AVX2-LABEL: testv32i8:
258 ; AVX2:       # %bb.0:
259 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
260 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
261 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
262 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
263 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
264 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
265 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
266 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
267 ; AVX2-NEXT:    retq
269 ; AVX512VPOPCNTDQ-LABEL: testv32i8:
270 ; AVX512VPOPCNTDQ:       # %bb.0:
271 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
272 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm2
273 ; AVX512VPOPCNTDQ-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
274 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
275 ; AVX512VPOPCNTDQ-NEXT:    vpsrlw $4, %ymm0, %ymm0
276 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
277 ; AVX512VPOPCNTDQ-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
278 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
279 ; AVX512VPOPCNTDQ-NEXT:    retq
281 ; AVX512VPOPCNTDQVL-LABEL: testv32i8:
282 ; AVX512VPOPCNTDQVL:       # %bb.0:
283 ; AVX512VPOPCNTDQVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
284 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm2
285 ; AVX512VPOPCNTDQVL-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
286 ; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
287 ; AVX512VPOPCNTDQVL-NEXT:    vpsrlw $4, %ymm0, %ymm0
288 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm1, %ymm0, %ymm0
289 ; AVX512VPOPCNTDQVL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
290 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
291 ; AVX512VPOPCNTDQVL-NEXT:    retq
293 ; BITALG_NOVLX-LABEL: testv32i8:
294 ; BITALG_NOVLX:       # %bb.0:
295 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
296 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
297 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
298 ; BITALG_NOVLX-NEXT:    retq
300 ; BITALG-LABEL: testv32i8:
301 ; BITALG:       # %bb.0:
302 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
303 ; BITALG-NEXT:    retq
304   %out = call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %in)
305   ret <32 x i8> %out
308 define <4 x i64> @foldv4i64() nounwind {
309 ; ALL-LABEL: foldv4i64:
310 ; ALL:       # %bb.0:
311 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,64,0,8]
312 ; ALL-NEXT:    retq
313   %out = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> <i64 256, i64 -1, i64 0, i64 255>)
314   ret <4 x i64> %out
317 define <8 x i32> @foldv8i32() nounwind {
318 ; ALL-LABEL: foldv8i32:
319 ; ALL:       # %bb.0:
320 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,32,0,8,16,3,2,3]
321 ; ALL-NEXT:    retq
322   %out = call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> <i32 256, i32 -1, i32 0, i32 255, i32 -65536, i32 7, i32 24, i32 88>)
323   ret <8 x i32> %out
326 define <16 x i16> @foldv16i16() nounwind {
327 ; ALL-LABEL: foldv16i16:
328 ; ALL:       # %bb.0:
329 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [1,16,0,8,0,3,2,3,15,7,1,1,1,1,1,1]
330 ; ALL-NEXT:    retq
331   %out = call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> <i16 256, i16 -1, i16 0, i16 255, i16 -65536, i16 7, i16 24, i16 88, i16 -2, i16 254, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32>)
332   ret <16 x i16> %out
335 define <32 x i8> @foldv32i8() nounwind {
336 ; ALL-LABEL: foldv32i8:
337 ; ALL:       # %bb.0:
338 ; ALL-NEXT:    vmovaps {{.*#+}} ymm0 = [0,8,0,8,0,3,2,3,7,7,1,1,1,1,1,1,1,1,0,0,1,2,3,4,5,6,7,8,2,2,3,7]
339 ; ALL-NEXT:    retq
340   %out = call <32 x i8> @llvm.ctpop.v32i8(<32 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, i8 64, i8 128, i8 256, i8 -256, i8 -128, i8 -64, i8 -32, i8 -16, i8 -8, i8 -4, i8 -2, i8 -1, i8 3, i8 5, i8 7, i8 127>)
341   ret <32 x i8> %out
344 define <4 x i64> @eq_1_v4i64(<4 x i64> %0) {
345 ; AVX1-LABEL: eq_1_v4i64:
346 ; AVX1:       # %bb.0:
347 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
348 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
349 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm3
350 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm4
351 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
352 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
353 ; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm5
354 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
355 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
356 ; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm4
357 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
358 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
359 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
360 ; AVX1-NEXT:    vandnps %ymm0, %ymm3, %ymm0
361 ; AVX1-NEXT:    retq
363 ; AVX2-LABEL: eq_1_v4i64:
364 ; AVX2:       # %bb.0:
365 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
366 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
367 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
368 ; AVX2-NEXT:    vpaddq %ymm3, %ymm0, %ymm3
369 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
370 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
371 ; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
372 ; AVX2-NEXT:    retq
374 ; AVX512VPOPCNTDQ-LABEL: eq_1_v4i64:
375 ; AVX512VPOPCNTDQ:       # %bb.0:
376 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
377 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
378 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
379 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
380 ; AVX512VPOPCNTDQ-NEXT:    retq
382 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v4i64:
383 ; AVX512VPOPCNTDQVL:       # %bb.0:
384 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0
385 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
386 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
387 ; AVX512VPOPCNTDQVL-NEXT:    retq
389 ; BITALG_NOVLX-LABEL: eq_1_v4i64:
390 ; BITALG_NOVLX:       # %bb.0:
391 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
392 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
393 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
394 ; BITALG_NOVLX-NEXT:    vpaddq %ymm3, %ymm0, %ymm3
395 ; BITALG_NOVLX-NEXT:    vpand %ymm3, %ymm0, %ymm0
396 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
397 ; BITALG_NOVLX-NEXT:    vpandn %ymm0, %ymm2, %ymm0
398 ; BITALG_NOVLX-NEXT:    retq
400 ; BITALG-LABEL: eq_1_v4i64:
401 ; BITALG:       # %bb.0:
402 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
403 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
404 ; BITALG-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
405 ; BITALG-NEXT:    vpaddq %ymm3, %ymm0, %ymm3
406 ; BITALG-NEXT:    vpand %ymm3, %ymm0, %ymm0
407 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
408 ; BITALG-NEXT:    vpandn %ymm0, %ymm2, %ymm0
409 ; BITALG-NEXT:    retq
410   %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
411   %3 = icmp eq <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
412   %4 = sext <4 x i1> %3 to <4 x i64>
413   ret <4 x i64> %4
416 define <4 x i64> @ne_1_v4i64(<4 x i64> %0) {
417 ; AVX1-LABEL: ne_1_v4i64:
418 ; AVX1:       # %bb.0:
419 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
420 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
421 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm3
422 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm4
423 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
424 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
425 ; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm5
426 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
427 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
428 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
429 ; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm5
430 ; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
431 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
432 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
433 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
434 ; AVX1-NEXT:    vorps %ymm0, %ymm3, %ymm0
435 ; AVX1-NEXT:    retq
437 ; AVX2-LABEL: ne_1_v4i64:
438 ; AVX2:       # %bb.0:
439 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
440 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
441 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
442 ; AVX2-NEXT:    vpaddq %ymm3, %ymm0, %ymm4
443 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
444 ; AVX2-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
445 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm0
446 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
447 ; AVX2-NEXT:    retq
449 ; AVX512VPOPCNTDQ-LABEL: ne_1_v4i64:
450 ; AVX512VPOPCNTDQ:       # %bb.0:
451 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
452 ; AVX512VPOPCNTDQ-NEXT:    vpopcntq %zmm0, %zmm0
453 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
454 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
455 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
456 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
457 ; AVX512VPOPCNTDQ-NEXT:    retq
459 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v4i64:
460 ; AVX512VPOPCNTDQVL:       # %bb.0:
461 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntq %ymm0, %ymm0
462 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
463 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
464 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
465 ; AVX512VPOPCNTDQVL-NEXT:    retq
467 ; BITALG_NOVLX-LABEL: ne_1_v4i64:
468 ; BITALG_NOVLX:       # %bb.0:
469 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
470 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
471 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
472 ; BITALG_NOVLX-NEXT:    vpaddq %ymm3, %ymm0, %ymm3
473 ; BITALG_NOVLX-NEXT:    vpand %ymm3, %ymm0, %ymm0
474 ; BITALG_NOVLX-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
475 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
476 ; BITALG_NOVLX-NEXT:    vpor %ymm0, %ymm2, %ymm0
477 ; BITALG_NOVLX-NEXT:    retq
479 ; BITALG-LABEL: ne_1_v4i64:
480 ; BITALG:       # %bb.0:
481 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
482 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm2
483 ; BITALG-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
484 ; BITALG-NEXT:    vpaddq %ymm3, %ymm0, %ymm4
485 ; BITALG-NEXT:    vpand %ymm4, %ymm0, %ymm0
486 ; BITALG-NEXT:    vpcmpeqq %ymm1, %ymm0, %ymm0
487 ; BITALG-NEXT:    vpternlogq $222, %ymm3, %ymm2, %ymm0
488 ; BITALG-NEXT:    retq
489   %2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %0)
490   %3 = icmp ne <4 x i64> %2, <i64 1, i64 1, i64 1, i64 1>
491   %4 = sext <4 x i1> %3 to <4 x i64>
492   ret <4 x i64> %4
495 define <8 x i32> @eq_1_v8i32(<8 x i32> %0) {
496 ; AVX1-LABEL: eq_1_v8i32:
497 ; AVX1:       # %bb.0:
498 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
499 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
500 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm3
501 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm4
502 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
503 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
504 ; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm5
505 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
506 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
507 ; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm4
508 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
509 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
510 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
511 ; AVX1-NEXT:    vandnps %ymm0, %ymm3, %ymm0
512 ; AVX1-NEXT:    retq
514 ; AVX2-LABEL: eq_1_v8i32:
515 ; AVX2:       # %bb.0:
516 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
517 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
518 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
519 ; AVX2-NEXT:    vpaddd %ymm3, %ymm0, %ymm3
520 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
521 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
522 ; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
523 ; AVX2-NEXT:    retq
525 ; AVX512VPOPCNTDQ-LABEL: eq_1_v8i32:
526 ; AVX512VPOPCNTDQ:       # %bb.0:
527 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
528 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
529 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
530 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
531 ; AVX512VPOPCNTDQ-NEXT:    retq
533 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v8i32:
534 ; AVX512VPOPCNTDQVL:       # %bb.0:
535 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
536 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
537 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
538 ; AVX512VPOPCNTDQVL-NEXT:    retq
540 ; BITALG_NOVLX-LABEL: eq_1_v8i32:
541 ; BITALG_NOVLX:       # %bb.0:
542 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
543 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
544 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
545 ; BITALG_NOVLX-NEXT:    vpaddd %ymm3, %ymm0, %ymm3
546 ; BITALG_NOVLX-NEXT:    vpand %ymm3, %ymm0, %ymm0
547 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
548 ; BITALG_NOVLX-NEXT:    vpandn %ymm0, %ymm2, %ymm0
549 ; BITALG_NOVLX-NEXT:    retq
551 ; BITALG-LABEL: eq_1_v8i32:
552 ; BITALG:       # %bb.0:
553 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
554 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
555 ; BITALG-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
556 ; BITALG-NEXT:    vpaddd %ymm3, %ymm0, %ymm3
557 ; BITALG-NEXT:    vpand %ymm3, %ymm0, %ymm0
558 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
559 ; BITALG-NEXT:    vpandn %ymm0, %ymm2, %ymm0
560 ; BITALG-NEXT:    retq
561   %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
562   %3 = icmp eq <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
563   %4 = sext <8 x i1> %3 to <8 x i32>
564   ret <8 x i32> %4
567 define <8 x i32> @ne_1_v8i32(<8 x i32> %0) {
568 ; AVX1-LABEL: ne_1_v8i32:
569 ; AVX1:       # %bb.0:
570 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
571 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
572 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm3
573 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm4
574 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
575 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
576 ; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm5
577 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
578 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
579 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
580 ; AVX1-NEXT:    vpaddd %xmm4, %xmm0, %xmm5
581 ; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
582 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
583 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
584 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
585 ; AVX1-NEXT:    vorps %ymm0, %ymm3, %ymm0
586 ; AVX1-NEXT:    retq
588 ; AVX2-LABEL: ne_1_v8i32:
589 ; AVX2:       # %bb.0:
590 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
591 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
592 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
593 ; AVX2-NEXT:    vpaddd %ymm3, %ymm0, %ymm4
594 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
595 ; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
596 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm0
597 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
598 ; AVX2-NEXT:    retq
600 ; AVX512VPOPCNTDQ-LABEL: ne_1_v8i32:
601 ; AVX512VPOPCNTDQ:       # %bb.0:
602 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
603 ; AVX512VPOPCNTDQ-NEXT:    vpopcntd %zmm0, %zmm0
604 ; AVX512VPOPCNTDQ-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
605 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
606 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
607 ; AVX512VPOPCNTDQ-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
608 ; AVX512VPOPCNTDQ-NEXT:    retq
610 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v8i32:
611 ; AVX512VPOPCNTDQVL:       # %bb.0:
612 ; AVX512VPOPCNTDQVL-NEXT:    vpopcntd %ymm0, %ymm0
613 ; AVX512VPOPCNTDQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
614 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
615 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
616 ; AVX512VPOPCNTDQVL-NEXT:    retq
618 ; BITALG_NOVLX-LABEL: ne_1_v8i32:
619 ; BITALG_NOVLX:       # %bb.0:
620 ; BITALG_NOVLX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
621 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
622 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
623 ; BITALG_NOVLX-NEXT:    vpaddd %ymm3, %ymm0, %ymm3
624 ; BITALG_NOVLX-NEXT:    vpand %ymm3, %ymm0, %ymm0
625 ; BITALG_NOVLX-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
626 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
627 ; BITALG_NOVLX-NEXT:    vpor %ymm0, %ymm2, %ymm0
628 ; BITALG_NOVLX-NEXT:    retq
630 ; BITALG-LABEL: ne_1_v8i32:
631 ; BITALG:       # %bb.0:
632 ; BITALG-NEXT:    vpxor %xmm1, %xmm1, %xmm1
633 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm2
634 ; BITALG-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
635 ; BITALG-NEXT:    vpaddd %ymm3, %ymm0, %ymm4
636 ; BITALG-NEXT:    vpand %ymm4, %ymm0, %ymm0
637 ; BITALG-NEXT:    vpcmpeqd %ymm1, %ymm0, %ymm0
638 ; BITALG-NEXT:    vpternlogd $222, %ymm3, %ymm2, %ymm0
639 ; BITALG-NEXT:    retq
640   %2 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %0)
641   %3 = icmp ne <8 x i32> %2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
642   %4 = sext <8 x i1> %3 to <8 x i32>
643   ret <8 x i32> %4
646 define <16 x i16> @eq_1_v16i16(<16 x i16> %0) {
647 ; AVX1-LABEL: eq_1_v16i16:
648 ; AVX1:       # %bb.0:
649 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
650 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
651 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm3
652 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm4
653 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
654 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
655 ; AVX1-NEXT:    vpaddw %xmm4, %xmm1, %xmm5
656 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
657 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
658 ; AVX1-NEXT:    vpaddw %xmm4, %xmm0, %xmm4
659 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
660 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
661 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
662 ; AVX1-NEXT:    vandnps %ymm0, %ymm3, %ymm0
663 ; AVX1-NEXT:    retq
665 ; AVX2-LABEL: eq_1_v16i16:
666 ; AVX2:       # %bb.0:
667 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
668 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
669 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
670 ; AVX2-NEXT:    vpaddw %ymm3, %ymm0, %ymm3
671 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
672 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
673 ; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
674 ; AVX2-NEXT:    retq
676 ; AVX512VPOPCNTDQ-LABEL: eq_1_v16i16:
677 ; AVX512VPOPCNTDQ:       # %bb.0:
678 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
679 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
680 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
681 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm3, %ymm0, %ymm3
682 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
683 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
684 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm0, %ymm2, %ymm0
685 ; AVX512VPOPCNTDQ-NEXT:    retq
687 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v16i16:
688 ; AVX512VPOPCNTDQVL:       # %bb.0:
689 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
690 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
691 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
692 ; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm3, %ymm0, %ymm3
693 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
694 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
695 ; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm0, %ymm2, %ymm0
696 ; AVX512VPOPCNTDQVL-NEXT:    retq
698 ; BITALG_NOVLX-LABEL: eq_1_v16i16:
699 ; BITALG_NOVLX:       # %bb.0:
700 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
701 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
702 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
703 ; BITALG_NOVLX-NEXT:    retq
705 ; BITALG-LABEL: eq_1_v16i16:
706 ; BITALG:       # %bb.0:
707 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
708 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
709 ; BITALG-NEXT:    retq
710   %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
711   %3 = icmp eq <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
712   %4 = sext <16 x i1> %3 to <16 x i16>
713   ret <16 x i16> %4
716 define <16 x i16> @ne_1_v16i16(<16 x i16> %0) {
717 ; AVX1-LABEL: ne_1_v16i16:
718 ; AVX1:       # %bb.0:
719 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
720 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
721 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm3
722 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm4
723 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
724 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
725 ; AVX1-NEXT:    vpaddw %xmm4, %xmm1, %xmm5
726 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
727 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
728 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
729 ; AVX1-NEXT:    vpaddw %xmm4, %xmm0, %xmm5
730 ; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
731 ; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm0, %xmm0
732 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
733 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
734 ; AVX1-NEXT:    vorps %ymm0, %ymm3, %ymm0
735 ; AVX1-NEXT:    retq
737 ; AVX2-LABEL: ne_1_v16i16:
738 ; AVX2:       # %bb.0:
739 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
740 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
741 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
742 ; AVX2-NEXT:    vpaddw %ymm3, %ymm0, %ymm4
743 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
744 ; AVX2-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
745 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm0
746 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
747 ; AVX2-NEXT:    retq
749 ; AVX512VPOPCNTDQ-LABEL: ne_1_v16i16:
750 ; AVX512VPOPCNTDQ:       # %bb.0:
751 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
752 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
753 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
754 ; AVX512VPOPCNTDQ-NEXT:    vpaddw %ymm3, %ymm0, %ymm3
755 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
756 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
757 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
758 ; AVX512VPOPCNTDQ-NEXT:    vpor %ymm0, %ymm2, %ymm0
759 ; AVX512VPOPCNTDQ-NEXT:    retq
761 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v16i16:
762 ; AVX512VPOPCNTDQVL:       # %bb.0:
763 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
764 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm2
765 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
766 ; AVX512VPOPCNTDQVL-NEXT:    vpaddw %ymm3, %ymm0, %ymm4
767 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
768 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
769 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $222, %ymm3, %ymm2, %ymm0
770 ; AVX512VPOPCNTDQVL-NEXT:    retq
772 ; BITALG_NOVLX-LABEL: ne_1_v16i16:
773 ; BITALG_NOVLX:       # %bb.0:
774 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
775 ; BITALG_NOVLX-NEXT:    vpopcntw %zmm0, %zmm0
776 ; BITALG_NOVLX-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
777 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
778 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
779 ; BITALG_NOVLX-NEXT:    retq
781 ; BITALG-LABEL: ne_1_v16i16:
782 ; BITALG:       # %bb.0:
783 ; BITALG-NEXT:    vpopcntw %ymm0, %ymm0
784 ; BITALG-NEXT:    vpcmpeqw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
785 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
786 ; BITALG-NEXT:    retq
787   %2 = tail call <16 x i16> @llvm.ctpop.v16i16(<16 x i16> %0)
788   %3 = icmp ne <16 x i16> %2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
789   %4 = sext <16 x i1> %3 to <16 x i16>
790   ret <16 x i16> %4
793 define <32 x i8> @eq_1_v32i8(<32 x i8> %0) {
794 ; AVX1-LABEL: eq_1_v32i8:
795 ; AVX1:       # %bb.0:
796 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
797 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
798 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm3
799 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm4
800 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
801 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
802 ; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm5
803 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
804 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
805 ; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm4
806 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
807 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
808 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
809 ; AVX1-NEXT:    vandnps %ymm0, %ymm3, %ymm0
810 ; AVX1-NEXT:    retq
812 ; AVX2-LABEL: eq_1_v32i8:
813 ; AVX2:       # %bb.0:
814 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
815 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
816 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
817 ; AVX2-NEXT:    vpaddb %ymm3, %ymm0, %ymm3
818 ; AVX2-NEXT:    vpand %ymm3, %ymm0, %ymm0
819 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
820 ; AVX2-NEXT:    vpandn %ymm0, %ymm2, %ymm0
821 ; AVX2-NEXT:    retq
823 ; AVX512VPOPCNTDQ-LABEL: eq_1_v32i8:
824 ; AVX512VPOPCNTDQ:       # %bb.0:
825 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
826 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
827 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
828 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm3, %ymm0, %ymm3
829 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
830 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
831 ; AVX512VPOPCNTDQ-NEXT:    vpandn %ymm0, %ymm2, %ymm0
832 ; AVX512VPOPCNTDQ-NEXT:    retq
834 ; AVX512VPOPCNTDQVL-LABEL: eq_1_v32i8:
835 ; AVX512VPOPCNTDQVL:       # %bb.0:
836 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
837 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
838 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
839 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm3, %ymm0, %ymm3
840 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm3, %ymm0, %ymm0
841 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
842 ; AVX512VPOPCNTDQVL-NEXT:    vpandn %ymm0, %ymm2, %ymm0
843 ; AVX512VPOPCNTDQVL-NEXT:    retq
845 ; BITALG_NOVLX-LABEL: eq_1_v32i8:
846 ; BITALG_NOVLX:       # %bb.0:
847 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
848 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
849 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
850 ; BITALG_NOVLX-NEXT:    retq
852 ; BITALG-LABEL: eq_1_v32i8:
853 ; BITALG:       # %bb.0:
854 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
855 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
856 ; BITALG-NEXT:    retq
857   %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
858   %3 = icmp eq <32 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, 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>
859   %4 = sext <32 x i1> %3 to <32 x i8>
860   ret <32 x i8> %4
863 define <32 x i8> @ne_1_v32i8(<32 x i8> %0) {
864 ; AVX1-LABEL: ne_1_v32i8:
865 ; AVX1:       # %bb.0:
866 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
867 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
868 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm3
869 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm4
870 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
871 ; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
872 ; AVX1-NEXT:    vpaddb %xmm4, %xmm1, %xmm5
873 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
874 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
875 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm1
876 ; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm5
877 ; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
878 ; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
879 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
880 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
881 ; AVX1-NEXT:    vorps %ymm0, %ymm3, %ymm0
882 ; AVX1-NEXT:    retq
884 ; AVX2-LABEL: ne_1_v32i8:
885 ; AVX2:       # %bb.0:
886 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
887 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
888 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
889 ; AVX2-NEXT:    vpaddb %ymm3, %ymm0, %ymm4
890 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
891 ; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
892 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm0
893 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
894 ; AVX2-NEXT:    retq
896 ; AVX512VPOPCNTDQ-LABEL: ne_1_v32i8:
897 ; AVX512VPOPCNTDQ:       # %bb.0:
898 ; AVX512VPOPCNTDQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
899 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
900 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
901 ; AVX512VPOPCNTDQ-NEXT:    vpaddb %ymm3, %ymm0, %ymm3
902 ; AVX512VPOPCNTDQ-NEXT:    vpand %ymm3, %ymm0, %ymm0
903 ; AVX512VPOPCNTDQ-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
904 ; AVX512VPOPCNTDQ-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
905 ; AVX512VPOPCNTDQ-NEXT:    vpor %ymm0, %ymm2, %ymm0
906 ; AVX512VPOPCNTDQ-NEXT:    retq
908 ; AVX512VPOPCNTDQVL-LABEL: ne_1_v32i8:
909 ; AVX512VPOPCNTDQVL:       # %bb.0:
910 ; AVX512VPOPCNTDQVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
911 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm2
912 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
913 ; AVX512VPOPCNTDQVL-NEXT:    vpaddb %ymm3, %ymm0, %ymm4
914 ; AVX512VPOPCNTDQVL-NEXT:    vpand %ymm4, %ymm0, %ymm0
915 ; AVX512VPOPCNTDQVL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
916 ; AVX512VPOPCNTDQVL-NEXT:    vpternlogq $222, %ymm3, %ymm2, %ymm0
917 ; AVX512VPOPCNTDQVL-NEXT:    retq
919 ; BITALG_NOVLX-LABEL: ne_1_v32i8:
920 ; BITALG_NOVLX:       # %bb.0:
921 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
922 ; BITALG_NOVLX-NEXT:    vpopcntb %zmm0, %zmm0
923 ; BITALG_NOVLX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
924 ; BITALG_NOVLX-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
925 ; BITALG_NOVLX-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
926 ; BITALG_NOVLX-NEXT:    retq
928 ; BITALG-LABEL: ne_1_v32i8:
929 ; BITALG:       # %bb.0:
930 ; BITALG-NEXT:    vpopcntb %ymm0, %ymm0
931 ; BITALG-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
932 ; BITALG-NEXT:    vpternlogq $15, %ymm0, %ymm0, %ymm0
933 ; BITALG-NEXT:    retq
934   %2 = tail call <32 x i8> @llvm.ctpop.v32i8(<32 x i8> %0)
935   %3 = icmp ne <32 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, 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>
936   %4 = sext <32 x i1> %3 to <32 x i8>
937   ret <32 x i8> %4
940 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
941 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
942 declare <16 x i16> @llvm.ctpop.v16i16(<16 x i16>)
943 declare <32 x i8> @llvm.ctpop.v32i8(<32 x i8>)