[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-ctpop.ll
blob2511fbf99fc46cb36233110383d168f3fdf0cd12
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE42
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VL
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl,+avx512vpopcntdq | FileCheck %s --check-prefixes=AVX512VPOPCNT
9 ; Reductions of per-element ctpop results (count all bits in a vector)
12 define i64 @reduce_ctpop_v2i64(<2 x i64> %a0) {
13 ; SSE42-LABEL: reduce_ctpop_v2i64:
14 ; SSE42:       # %bb.0:
15 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
16 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
17 ; SSE42-NEXT:    pand %xmm1, %xmm2
18 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
19 ; SSE42-NEXT:    movdqa %xmm3, %xmm4
20 ; SSE42-NEXT:    pshufb %xmm2, %xmm4
21 ; SSE42-NEXT:    psrlw $4, %xmm0
22 ; SSE42-NEXT:    pand %xmm1, %xmm0
23 ; SSE42-NEXT:    pshufb %xmm0, %xmm3
24 ; SSE42-NEXT:    paddb %xmm4, %xmm3
25 ; SSE42-NEXT:    pxor %xmm0, %xmm0
26 ; SSE42-NEXT:    psadbw %xmm3, %xmm0
27 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
28 ; SSE42-NEXT:    paddq %xmm0, %xmm1
29 ; SSE42-NEXT:    movq %xmm1, %rax
30 ; SSE42-NEXT:    retq
32 ; AVX2-LABEL: reduce_ctpop_v2i64:
33 ; AVX2:       # %bb.0:
34 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
35 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
36 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
37 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
38 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
39 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
40 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
41 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
42 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
43 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
44 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
45 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
46 ; AVX2-NEXT:    vmovq %xmm0, %rax
47 ; AVX2-NEXT:    retq
49 ; AVX512VL-LABEL: reduce_ctpop_v2i64:
50 ; AVX512VL:       # %bb.0:
51 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
52 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm2
53 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
54 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
55 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
56 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm0
57 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
58 ; AVX512VL-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
59 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
60 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
61 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
62 ; AVX512VL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
63 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
64 ; AVX512VL-NEXT:    retq
66 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v2i64:
67 ; AVX512VPOPCNT:       # %bb.0:
68 ; AVX512VPOPCNT-NEXT:    vpopcntq %xmm0, %xmm0
69 ; AVX512VPOPCNT-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
70 ; AVX512VPOPCNT-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
71 ; AVX512VPOPCNT-NEXT:    vmovq %xmm0, %rax
72 ; AVX512VPOPCNT-NEXT:    retq
73   %p0 = tail call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a0)
74   %r0 = tail call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %p0)
75   ret i64 %r0
78 define i32 @reduce_ctpop_v4i32(<4 x i32> %a0) {
79 ; SSE42-LABEL: reduce_ctpop_v4i32:
80 ; SSE42:       # %bb.0:
81 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
82 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
83 ; SSE42-NEXT:    pand %xmm1, %xmm2
84 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
85 ; SSE42-NEXT:    movdqa %xmm3, %xmm4
86 ; SSE42-NEXT:    pshufb %xmm2, %xmm4
87 ; SSE42-NEXT:    psrlw $4, %xmm0
88 ; SSE42-NEXT:    pand %xmm1, %xmm0
89 ; SSE42-NEXT:    pshufb %xmm0, %xmm3
90 ; SSE42-NEXT:    paddb %xmm4, %xmm3
91 ; SSE42-NEXT:    pxor %xmm0, %xmm0
92 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero
93 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm0[2],xmm3[3],xmm0[3]
94 ; SSE42-NEXT:    psadbw %xmm0, %xmm3
95 ; SSE42-NEXT:    psadbw %xmm0, %xmm1
96 ; SSE42-NEXT:    packuswb %xmm3, %xmm1
97 ; SSE42-NEXT:    packuswb %xmm3, %xmm3
98 ; SSE42-NEXT:    paddd %xmm1, %xmm3
99 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
100 ; SSE42-NEXT:    paddd %xmm3, %xmm0
101 ; SSE42-NEXT:    movd %xmm0, %eax
102 ; SSE42-NEXT:    retq
104 ; AVX2-LABEL: reduce_ctpop_v4i32:
105 ; AVX2:       # %bb.0:
106 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
107 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
108 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
109 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
110 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
111 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
112 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
113 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
114 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
115 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
116 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
117 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
118 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
119 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
120 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm2, %xmm1
121 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
122 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
123 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
124 ; AVX2-NEXT:    vmovd %xmm0, %eax
125 ; AVX2-NEXT:    retq
127 ; AVX512VL-LABEL: reduce_ctpop_v4i32:
128 ; AVX512VL:       # %bb.0:
129 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
130 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm2
131 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
132 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
133 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
134 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm0
135 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
136 ; AVX512VL-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
137 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
138 ; AVX512VL-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
139 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm2, %xmm2
140 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
141 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
142 ; AVX512VL-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
143 ; AVX512VL-NEXT:    vpmovdb %xmm0, %xmm0
144 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
145 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
146 ; AVX512VL-NEXT:    retq
148 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i32:
149 ; AVX512VPOPCNT:       # %bb.0:
150 ; AVX512VPOPCNT-NEXT:    vpopcntd %xmm0, %xmm0
151 ; AVX512VPOPCNT-NEXT:    vpmovdb %xmm0, %xmm0
152 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
153 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
154 ; AVX512VPOPCNT-NEXT:    vmovd %xmm0, %eax
155 ; AVX512VPOPCNT-NEXT:    retq
156   %p0 = tail call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %a0)
157   %r0 = tail call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %p0)
158   ret i32 %r0
161 define i16 @reduce_ctpop_v8i16(<8 x i16> %a0) {
162 ; SSE42-LABEL: reduce_ctpop_v8i16:
163 ; SSE42:       # %bb.0:
164 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
165 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
166 ; SSE42-NEXT:    pand %xmm1, %xmm2
167 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
168 ; SSE42-NEXT:    movdqa %xmm3, %xmm4
169 ; SSE42-NEXT:    pshufb %xmm2, %xmm4
170 ; SSE42-NEXT:    psrlw $4, %xmm0
171 ; SSE42-NEXT:    pand %xmm1, %xmm0
172 ; SSE42-NEXT:    pshufb %xmm0, %xmm3
173 ; SSE42-NEXT:    paddb %xmm4, %xmm3
174 ; SSE42-NEXT:    movdqa %xmm3, %xmm0
175 ; SSE42-NEXT:    psllw $8, %xmm0
176 ; SSE42-NEXT:    paddb %xmm3, %xmm0
177 ; SSE42-NEXT:    psrlw $8, %xmm0
178 ; SSE42-NEXT:    packuswb %xmm0, %xmm0
179 ; SSE42-NEXT:    pxor %xmm1, %xmm1
180 ; SSE42-NEXT:    psadbw %xmm0, %xmm1
181 ; SSE42-NEXT:    movd %xmm1, %eax
182 ; SSE42-NEXT:    # kill: def $ax killed $ax killed $eax
183 ; SSE42-NEXT:    retq
185 ; AVX2-LABEL: reduce_ctpop_v8i16:
186 ; AVX2:       # %bb.0:
187 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
188 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
189 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
190 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
191 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
192 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
193 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
194 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
195 ; AVX2-NEXT:    vpsllw $8, %xmm0, %xmm1
196 ; AVX2-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
197 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm0
198 ; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
199 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
200 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
201 ; AVX2-NEXT:    vmovd %xmm0, %eax
202 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
203 ; AVX2-NEXT:    retq
205 ; AVX512VL-LABEL: reduce_ctpop_v8i16:
206 ; AVX512VL:       # %bb.0:
207 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
208 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm2
209 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
210 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
211 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
212 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm0
213 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
214 ; AVX512VL-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
215 ; AVX512VL-NEXT:    vpsllw $8, %xmm0, %xmm1
216 ; AVX512VL-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
217 ; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm0
218 ; AVX512VL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
219 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
220 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
221 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
222 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
223 ; AVX512VL-NEXT:    retq
225 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v8i16:
226 ; AVX512VPOPCNT:       # %bb.0:
227 ; AVX512VPOPCNT-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
228 ; AVX512VPOPCNT-NEXT:    vpopcntd %ymm0, %ymm0
229 ; AVX512VPOPCNT-NEXT:    vpmovdb %ymm0, %xmm0
230 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
231 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
232 ; AVX512VPOPCNT-NEXT:    vmovd %xmm0, %eax
233 ; AVX512VPOPCNT-NEXT:    # kill: def $ax killed $ax killed $eax
234 ; AVX512VPOPCNT-NEXT:    vzeroupper
235 ; AVX512VPOPCNT-NEXT:    retq
236   %p0 = tail call <8 x i16> @llvm.ctpop.v8i16(<8 x i16> %a0)
237   %r0 = tail call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %p0)
238   ret i16 %r0
241 define i8 @reduce_ctpop_v16i8(<16 x i8> %a0) {
242 ; SSE42-LABEL: reduce_ctpop_v16i8:
243 ; SSE42:       # %bb.0:
244 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
245 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
246 ; SSE42-NEXT:    pand %xmm1, %xmm2
247 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
248 ; SSE42-NEXT:    movdqa %xmm3, %xmm4
249 ; SSE42-NEXT:    pshufb %xmm2, %xmm4
250 ; SSE42-NEXT:    psrlw $4, %xmm0
251 ; SSE42-NEXT:    pand %xmm1, %xmm0
252 ; SSE42-NEXT:    pshufb %xmm0, %xmm3
253 ; SSE42-NEXT:    paddb %xmm4, %xmm3
254 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
255 ; SSE42-NEXT:    paddb %xmm3, %xmm0
256 ; SSE42-NEXT:    pxor %xmm1, %xmm1
257 ; SSE42-NEXT:    psadbw %xmm0, %xmm1
258 ; SSE42-NEXT:    movd %xmm1, %eax
259 ; SSE42-NEXT:    # kill: def $al killed $al killed $eax
260 ; SSE42-NEXT:    retq
262 ; AVX2-LABEL: reduce_ctpop_v16i8:
263 ; AVX2:       # %bb.0:
264 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
265 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
266 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
267 ; AVX2-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
268 ; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
269 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
270 ; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
271 ; AVX2-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
272 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
273 ; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
274 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
275 ; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
276 ; AVX2-NEXT:    vmovd %xmm0, %eax
277 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
278 ; AVX2-NEXT:    retq
280 ; AVX512VL-LABEL: reduce_ctpop_v16i8:
281 ; AVX512VL:       # %bb.0:
282 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
283 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm2
284 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
285 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
286 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
287 ; AVX512VL-NEXT:    vpand %xmm1, %xmm0, %xmm0
288 ; AVX512VL-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
289 ; AVX512VL-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
290 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
291 ; AVX512VL-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
292 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
293 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
294 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
295 ; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
296 ; AVX512VL-NEXT:    retq
298 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v16i8:
299 ; AVX512VPOPCNT:       # %bb.0:
300 ; AVX512VPOPCNT-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
301 ; AVX512VPOPCNT-NEXT:    vpopcntd %zmm0, %zmm0
302 ; AVX512VPOPCNT-NEXT:    vpmovdb %zmm0, %xmm0
303 ; AVX512VPOPCNT-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
304 ; AVX512VPOPCNT-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
305 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
306 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
307 ; AVX512VPOPCNT-NEXT:    vmovd %xmm0, %eax
308 ; AVX512VPOPCNT-NEXT:    # kill: def $al killed $al killed $eax
309 ; AVX512VPOPCNT-NEXT:    vzeroupper
310 ; AVX512VPOPCNT-NEXT:    retq
311   %p0 = tail call <16 x i8> @llvm.ctpop.v16i8(<16 x i8> %a0)
312   %r0 = tail call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %p0)
313   ret i8 %r0
316 define i64 @reduce_ctpop_v4i64(<4 x i64> %a0) {
317 ; SSE42-LABEL: reduce_ctpop_v4i64:
318 ; SSE42:       # %bb.0:
319 ; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
320 ; SSE42-NEXT:    movdqa %xmm1, %xmm3
321 ; SSE42-NEXT:    pand %xmm2, %xmm3
322 ; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
323 ; SSE42-NEXT:    movdqa %xmm4, %xmm5
324 ; SSE42-NEXT:    pshufb %xmm3, %xmm5
325 ; SSE42-NEXT:    psrlw $4, %xmm1
326 ; SSE42-NEXT:    pand %xmm2, %xmm1
327 ; SSE42-NEXT:    movdqa %xmm4, %xmm3
328 ; SSE42-NEXT:    pshufb %xmm1, %xmm3
329 ; SSE42-NEXT:    paddb %xmm5, %xmm3
330 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
331 ; SSE42-NEXT:    pand %xmm2, %xmm1
332 ; SSE42-NEXT:    movdqa %xmm4, %xmm5
333 ; SSE42-NEXT:    pshufb %xmm1, %xmm5
334 ; SSE42-NEXT:    psrlw $4, %xmm0
335 ; SSE42-NEXT:    pand %xmm2, %xmm0
336 ; SSE42-NEXT:    pshufb %xmm0, %xmm4
337 ; SSE42-NEXT:    paddb %xmm5, %xmm4
338 ; SSE42-NEXT:    paddb %xmm3, %xmm4
339 ; SSE42-NEXT:    pxor %xmm0, %xmm0
340 ; SSE42-NEXT:    psadbw %xmm4, %xmm0
341 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
342 ; SSE42-NEXT:    paddq %xmm0, %xmm1
343 ; SSE42-NEXT:    movq %xmm1, %rax
344 ; SSE42-NEXT:    retq
346 ; AVX2-LABEL: reduce_ctpop_v4i64:
347 ; AVX2:       # %bb.0:
348 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} 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]
349 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
350 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} 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]
351 ; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]
352 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
353 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
354 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
355 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
356 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
357 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
358 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
359 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
360 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
361 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
362 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
363 ; AVX2-NEXT:    vmovq %xmm0, %rax
364 ; AVX2-NEXT:    vzeroupper
365 ; AVX2-NEXT:    retq
367 ; AVX512VL-LABEL: reduce_ctpop_v4i64:
368 ; AVX512VL:       # %bb.0:
369 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} 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]
370 ; AVX512VL-NEXT:    vpand %ymm1, %ymm0, %ymm2
371 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} 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]
372 ; AVX512VL-NEXT:    # ymm3 = mem[0,1,0,1]
373 ; AVX512VL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
374 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm0
375 ; AVX512VL-NEXT:    vpand %ymm1, %ymm0, %ymm0
376 ; AVX512VL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
377 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
378 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
379 ; AVX512VL-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
380 ; AVX512VL-NEXT:    vpmovqb %ymm0, %xmm0
381 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
382 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
383 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
384 ; AVX512VL-NEXT:    vzeroupper
385 ; AVX512VL-NEXT:    retq
387 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64:
388 ; AVX512VPOPCNT:       # %bb.0:
389 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm0, %ymm0
390 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm0, %xmm0
391 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
392 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
393 ; AVX512VPOPCNT-NEXT:    vmovq %xmm0, %rax
394 ; AVX512VPOPCNT-NEXT:    vzeroupper
395 ; AVX512VPOPCNT-NEXT:    retq
396   %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
397   %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
398   ret i64 %r0
401 define i32 @reduce_ctpop_v8i32(<8 x i32> %a0) {
402 ; SSE42-LABEL: reduce_ctpop_v8i32:
403 ; SSE42:       # %bb.0:
404 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
405 ; SSE42-NEXT:    movdqa %xmm1, %xmm4
406 ; SSE42-NEXT:    pand %xmm3, %xmm4
407 ; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
408 ; SSE42-NEXT:    movdqa %xmm2, %xmm5
409 ; SSE42-NEXT:    pshufb %xmm4, %xmm5
410 ; SSE42-NEXT:    psrlw $4, %xmm1
411 ; SSE42-NEXT:    pand %xmm3, %xmm1
412 ; SSE42-NEXT:    movdqa %xmm2, %xmm4
413 ; SSE42-NEXT:    pshufb %xmm1, %xmm4
414 ; SSE42-NEXT:    paddb %xmm5, %xmm4
415 ; SSE42-NEXT:    pxor %xmm1, %xmm1
416 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
417 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm1[2],xmm4[3],xmm1[3]
418 ; SSE42-NEXT:    psadbw %xmm1, %xmm4
419 ; SSE42-NEXT:    psadbw %xmm1, %xmm5
420 ; SSE42-NEXT:    packuswb %xmm4, %xmm5
421 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
422 ; SSE42-NEXT:    pand %xmm3, %xmm4
423 ; SSE42-NEXT:    movdqa %xmm2, %xmm6
424 ; SSE42-NEXT:    pshufb %xmm4, %xmm6
425 ; SSE42-NEXT:    psrlw $4, %xmm0
426 ; SSE42-NEXT:    pand %xmm3, %xmm0
427 ; SSE42-NEXT:    pshufb %xmm0, %xmm2
428 ; SSE42-NEXT:    paddb %xmm6, %xmm2
429 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero
430 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
431 ; SSE42-NEXT:    psadbw %xmm1, %xmm2
432 ; SSE42-NEXT:    psadbw %xmm1, %xmm0
433 ; SSE42-NEXT:    packuswb %xmm2, %xmm0
434 ; SSE42-NEXT:    paddd %xmm5, %xmm0
435 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
436 ; SSE42-NEXT:    paddd %xmm0, %xmm1
437 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
438 ; SSE42-NEXT:    paddd %xmm1, %xmm0
439 ; SSE42-NEXT:    movd %xmm0, %eax
440 ; SSE42-NEXT:    retq
442 ; AVX2-LABEL: reduce_ctpop_v8i32:
443 ; AVX2:       # %bb.0:
444 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} 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]
445 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
446 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} 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]
447 ; AVX2-NEXT:    # ymm3 = mem[0,1,0,1]
448 ; AVX2-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
449 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
450 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
451 ; AVX2-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
452 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
453 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
454 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
455 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2
456 ; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
457 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
458 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
459 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
460 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
461 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
462 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
463 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
464 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
465 ; AVX2-NEXT:    vmovd %xmm0, %eax
466 ; AVX2-NEXT:    vzeroupper
467 ; AVX2-NEXT:    retq
469 ; AVX512VL-LABEL: reduce_ctpop_v8i32:
470 ; AVX512VL:       # %bb.0:
471 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} 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]
472 ; AVX512VL-NEXT:    vpand %ymm1, %ymm0, %ymm2
473 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} 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]
474 ; AVX512VL-NEXT:    # ymm3 = mem[0,1,0,1]
475 ; AVX512VL-NEXT:    vpshufb %ymm2, %ymm3, %ymm2
476 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm0
477 ; AVX512VL-NEXT:    vpand %ymm1, %ymm0, %ymm0
478 ; AVX512VL-NEXT:    vpshufb %ymm0, %ymm3, %ymm0
479 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
480 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
481 ; AVX512VL-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
482 ; AVX512VL-NEXT:    vpsadbw %ymm1, %ymm2, %ymm2
483 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
484 ; AVX512VL-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
485 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
486 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
487 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
488 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
489 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
490 ; AVX512VL-NEXT:    vzeroupper
491 ; AVX512VL-NEXT:    retq
493 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v8i32:
494 ; AVX512VPOPCNT:       # %bb.0:
495 ; AVX512VPOPCNT-NEXT:    vpopcntd %ymm0, %ymm0
496 ; AVX512VPOPCNT-NEXT:    vpmovdb %ymm0, %xmm0
497 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
498 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
499 ; AVX512VPOPCNT-NEXT:    vmovd %xmm0, %eax
500 ; AVX512VPOPCNT-NEXT:    vzeroupper
501 ; AVX512VPOPCNT-NEXT:    retq
502   %p0 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %a0)
503   %r0 = tail call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %p0)
504   ret i32 %r0
507 define i64 @reduce_ctpop_v8i64(<8 x i64> %a0) {
508 ; SSE42-LABEL: reduce_ctpop_v8i64:
509 ; SSE42:       # %bb.0:
510 ; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
511 ; SSE42-NEXT:    movdqa %xmm2, %xmm6
512 ; SSE42-NEXT:    pand %xmm5, %xmm6
513 ; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
514 ; SSE42-NEXT:    movdqa %xmm4, %xmm7
515 ; SSE42-NEXT:    pshufb %xmm6, %xmm7
516 ; SSE42-NEXT:    psrlw $4, %xmm2
517 ; SSE42-NEXT:    pand %xmm5, %xmm2
518 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
519 ; SSE42-NEXT:    pshufb %xmm2, %xmm6
520 ; SSE42-NEXT:    paddb %xmm7, %xmm6
521 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
522 ; SSE42-NEXT:    pand %xmm5, %xmm2
523 ; SSE42-NEXT:    movdqa %xmm4, %xmm7
524 ; SSE42-NEXT:    pshufb %xmm2, %xmm7
525 ; SSE42-NEXT:    psrlw $4, %xmm0
526 ; SSE42-NEXT:    pand %xmm5, %xmm0
527 ; SSE42-NEXT:    movdqa %xmm4, %xmm2
528 ; SSE42-NEXT:    pshufb %xmm0, %xmm2
529 ; SSE42-NEXT:    paddb %xmm7, %xmm2
530 ; SSE42-NEXT:    paddb %xmm6, %xmm2
531 ; SSE42-NEXT:    movdqa %xmm3, %xmm0
532 ; SSE42-NEXT:    pand %xmm5, %xmm0
533 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
534 ; SSE42-NEXT:    pshufb %xmm0, %xmm6
535 ; SSE42-NEXT:    psrlw $4, %xmm3
536 ; SSE42-NEXT:    pand %xmm5, %xmm3
537 ; SSE42-NEXT:    movdqa %xmm4, %xmm0
538 ; SSE42-NEXT:    pshufb %xmm3, %xmm0
539 ; SSE42-NEXT:    paddb %xmm6, %xmm0
540 ; SSE42-NEXT:    movdqa %xmm1, %xmm3
541 ; SSE42-NEXT:    pand %xmm5, %xmm3
542 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
543 ; SSE42-NEXT:    pshufb %xmm3, %xmm6
544 ; SSE42-NEXT:    psrlw $4, %xmm1
545 ; SSE42-NEXT:    pand %xmm5, %xmm1
546 ; SSE42-NEXT:    pshufb %xmm1, %xmm4
547 ; SSE42-NEXT:    paddb %xmm6, %xmm4
548 ; SSE42-NEXT:    paddb %xmm0, %xmm4
549 ; SSE42-NEXT:    paddb %xmm2, %xmm4
550 ; SSE42-NEXT:    pxor %xmm0, %xmm0
551 ; SSE42-NEXT:    psadbw %xmm4, %xmm0
552 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
553 ; SSE42-NEXT:    paddq %xmm0, %xmm1
554 ; SSE42-NEXT:    movq %xmm1, %rax
555 ; SSE42-NEXT:    retq
557 ; AVX2-LABEL: reduce_ctpop_v8i64:
558 ; AVX2:       # %bb.0:
559 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [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]
560 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
561 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [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]
562 ; AVX2-NEXT:    # ymm4 = mem[0,1,0,1]
563 ; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
564 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
565 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
566 ; AVX2-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
567 ; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
568 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm3
569 ; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
570 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
571 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
572 ; AVX2-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
573 ; AVX2-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
574 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
575 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
576 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
577 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
578 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
579 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
580 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
581 ; AVX2-NEXT:    vmovq %xmm0, %rax
582 ; AVX2-NEXT:    vzeroupper
583 ; AVX2-NEXT:    retq
585 ; AVX512VL-LABEL: reduce_ctpop_v8i64:
586 ; AVX512VL:       # %bb.0:
587 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} zmm1 = [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,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]
588 ; AVX512VL-NEXT:    vpandq %zmm1, %zmm0, %zmm2
589 ; AVX512VL-NEXT:    vbroadcasti32x4 {{.*#+}} zmm3 = [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,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]
590 ; AVX512VL-NEXT:    # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
591 ; AVX512VL-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
592 ; AVX512VL-NEXT:    vpsrlw $4, %zmm0, %zmm0
593 ; AVX512VL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
594 ; AVX512VL-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
595 ; AVX512VL-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
596 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
597 ; AVX512VL-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
598 ; AVX512VL-NEXT:    vpmovqb %zmm0, %xmm0
599 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
600 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
601 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
602 ; AVX512VL-NEXT:    vzeroupper
603 ; AVX512VL-NEXT:    retq
605 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v8i64:
606 ; AVX512VPOPCNT:       # %bb.0:
607 ; AVX512VPOPCNT-NEXT:    vpopcntq %zmm0, %zmm0
608 ; AVX512VPOPCNT-NEXT:    vpmovqb %zmm0, %xmm0
609 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
610 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
611 ; AVX512VPOPCNT-NEXT:    vmovq %xmm0, %rax
612 ; AVX512VPOPCNT-NEXT:    vzeroupper
613 ; AVX512VPOPCNT-NEXT:    retq
614   %p0 = tail call <8 x i64> @llvm.ctpop.v8i64(<8 x i64> %a0)
615   %r0 = tail call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %p0)
616   ret i64 %r0
619 define i32 @reduce_ctpop_v16i32(<16 x i32> %a0) {
620 ; SSE42-LABEL: reduce_ctpop_v16i32:
621 ; SSE42:       # %bb.0:
622 ; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
623 ; SSE42-NEXT:    movdqa %xmm2, %xmm6
624 ; SSE42-NEXT:    pand %xmm5, %xmm6
625 ; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
626 ; SSE42-NEXT:    movdqa %xmm4, %xmm7
627 ; SSE42-NEXT:    pshufb %xmm6, %xmm7
628 ; SSE42-NEXT:    psrlw $4, %xmm2
629 ; SSE42-NEXT:    pand %xmm5, %xmm2
630 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
631 ; SSE42-NEXT:    pshufb %xmm2, %xmm6
632 ; SSE42-NEXT:    paddb %xmm7, %xmm6
633 ; SSE42-NEXT:    pxor %xmm2, %xmm2
634 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm7 = xmm6[0],zero,xmm6[1],zero
635 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm6 = xmm6[2],xmm2[2],xmm6[3],xmm2[3]
636 ; SSE42-NEXT:    psadbw %xmm2, %xmm6
637 ; SSE42-NEXT:    psadbw %xmm2, %xmm7
638 ; SSE42-NEXT:    packuswb %xmm6, %xmm7
639 ; SSE42-NEXT:    movdqa %xmm0, %xmm6
640 ; SSE42-NEXT:    pand %xmm5, %xmm6
641 ; SSE42-NEXT:    movdqa %xmm4, %xmm8
642 ; SSE42-NEXT:    pshufb %xmm6, %xmm8
643 ; SSE42-NEXT:    psrlw $4, %xmm0
644 ; SSE42-NEXT:    pand %xmm5, %xmm0
645 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
646 ; SSE42-NEXT:    pshufb %xmm0, %xmm6
647 ; SSE42-NEXT:    paddb %xmm8, %xmm6
648 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm6[0],zero,xmm6[1],zero
649 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm6 = xmm6[2],xmm2[2],xmm6[3],xmm2[3]
650 ; SSE42-NEXT:    psadbw %xmm2, %xmm6
651 ; SSE42-NEXT:    psadbw %xmm2, %xmm0
652 ; SSE42-NEXT:    packuswb %xmm6, %xmm0
653 ; SSE42-NEXT:    paddd %xmm7, %xmm0
654 ; SSE42-NEXT:    movdqa %xmm3, %xmm6
655 ; SSE42-NEXT:    pand %xmm5, %xmm6
656 ; SSE42-NEXT:    movdqa %xmm4, %xmm7
657 ; SSE42-NEXT:    pshufb %xmm6, %xmm7
658 ; SSE42-NEXT:    psrlw $4, %xmm3
659 ; SSE42-NEXT:    pand %xmm5, %xmm3
660 ; SSE42-NEXT:    movdqa %xmm4, %xmm6
661 ; SSE42-NEXT:    pshufb %xmm3, %xmm6
662 ; SSE42-NEXT:    paddb %xmm7, %xmm6
663 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm6[0],zero,xmm6[1],zero
664 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm6 = xmm6[2],xmm2[2],xmm6[3],xmm2[3]
665 ; SSE42-NEXT:    psadbw %xmm2, %xmm6
666 ; SSE42-NEXT:    psadbw %xmm2, %xmm3
667 ; SSE42-NEXT:    packuswb %xmm6, %xmm3
668 ; SSE42-NEXT:    movdqa %xmm1, %xmm6
669 ; SSE42-NEXT:    pand %xmm5, %xmm6
670 ; SSE42-NEXT:    movdqa %xmm4, %xmm7
671 ; SSE42-NEXT:    pshufb %xmm6, %xmm7
672 ; SSE42-NEXT:    psrlw $4, %xmm1
673 ; SSE42-NEXT:    pand %xmm5, %xmm1
674 ; SSE42-NEXT:    pshufb %xmm1, %xmm4
675 ; SSE42-NEXT:    paddb %xmm7, %xmm4
676 ; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero
677 ; SSE42-NEXT:    punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm2[2],xmm4[3],xmm2[3]
678 ; SSE42-NEXT:    psadbw %xmm2, %xmm4
679 ; SSE42-NEXT:    psadbw %xmm2, %xmm1
680 ; SSE42-NEXT:    packuswb %xmm4, %xmm1
681 ; SSE42-NEXT:    paddd %xmm3, %xmm1
682 ; SSE42-NEXT:    paddd %xmm0, %xmm1
683 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
684 ; SSE42-NEXT:    paddd %xmm1, %xmm0
685 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
686 ; SSE42-NEXT:    paddd %xmm0, %xmm1
687 ; SSE42-NEXT:    movd %xmm1, %eax
688 ; SSE42-NEXT:    retq
690 ; AVX2-LABEL: reduce_ctpop_v16i32:
691 ; AVX2:       # %bb.0:
692 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [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]
693 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
694 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [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]
695 ; AVX2-NEXT:    # ymm4 = mem[0,1,0,1]
696 ; AVX2-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
697 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
698 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
699 ; AVX2-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
700 ; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
701 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
702 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm5 = ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[6],ymm3[6],ymm1[7],ymm3[7]
703 ; AVX2-NEXT:    vpsadbw %ymm3, %ymm5, %ymm5
704 ; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[4],ymm3[4],ymm1[5],ymm3[5]
705 ; AVX2-NEXT:    vpsadbw %ymm3, %ymm1, %ymm1
706 ; AVX2-NEXT:    vpackuswb %ymm5, %ymm1, %ymm1
707 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm5
708 ; AVX2-NEXT:    vpshufb %ymm5, %ymm4, %ymm5
709 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
710 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
711 ; AVX2-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
712 ; AVX2-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
713 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm3[2],ymm0[3],ymm3[3],ymm0[6],ymm3[6],ymm0[7],ymm3[7]
714 ; AVX2-NEXT:    vpsadbw %ymm3, %ymm2, %ymm2
715 ; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm3[0],ymm0[1],ymm3[1],ymm0[4],ymm3[4],ymm0[5],ymm3[5]
716 ; AVX2-NEXT:    vpsadbw %ymm3, %ymm0, %ymm0
717 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
718 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
719 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
720 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
721 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
722 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
723 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
724 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
725 ; AVX2-NEXT:    vmovd %xmm0, %eax
726 ; AVX2-NEXT:    vzeroupper
727 ; AVX2-NEXT:    retq
729 ; AVX512VL-LABEL: reduce_ctpop_v16i32:
730 ; AVX512VL:       # %bb.0:
731 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} zmm1 = [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,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]
732 ; AVX512VL-NEXT:    vpandq %zmm1, %zmm0, %zmm2
733 ; AVX512VL-NEXT:    vbroadcasti32x4 {{.*#+}} zmm3 = [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,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]
734 ; AVX512VL-NEXT:    # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
735 ; AVX512VL-NEXT:    vpshufb %zmm2, %zmm3, %zmm2
736 ; AVX512VL-NEXT:    vpsrlw $4, %zmm0, %zmm0
737 ; AVX512VL-NEXT:    vpandq %zmm1, %zmm0, %zmm0
738 ; AVX512VL-NEXT:    vpshufb %zmm0, %zmm3, %zmm0
739 ; AVX512VL-NEXT:    vpaddb %zmm2, %zmm0, %zmm0
740 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
741 ; AVX512VL-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
742 ; AVX512VL-NEXT:    vpsadbw %zmm1, %zmm2, %zmm2
743 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
744 ; AVX512VL-NEXT:    vpsadbw %zmm1, %zmm0, %zmm0
745 ; AVX512VL-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0
746 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
747 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
748 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
749 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
750 ; AVX512VL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
751 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
752 ; AVX512VL-NEXT:    vzeroupper
753 ; AVX512VL-NEXT:    retq
755 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v16i32:
756 ; AVX512VPOPCNT:       # %bb.0:
757 ; AVX512VPOPCNT-NEXT:    vpopcntd %zmm0, %zmm0
758 ; AVX512VPOPCNT-NEXT:    vpmovdb %zmm0, %xmm0
759 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
760 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
761 ; AVX512VPOPCNT-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
762 ; AVX512VPOPCNT-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
763 ; AVX512VPOPCNT-NEXT:    vmovd %xmm0, %eax
764 ; AVX512VPOPCNT-NEXT:    vzeroupper
765 ; AVX512VPOPCNT-NEXT:    retq
766   %p0 = tail call <16 x i32> @llvm.ctpop.v16i32(<16 x i32> %a0)
767   %r0 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %p0)
768   ret i32 %r0
771 define i64 @reduce_ctpop_v16i64(<16 x i64> %a0) {
772 ; SSE42-LABEL: reduce_ctpop_v16i64:
773 ; SSE42:       # %bb.0:
774 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
775 ; SSE42-NEXT:    movdqa %xmm5, %xmm10
776 ; SSE42-NEXT:    pand %xmm9, %xmm10
777 ; SSE42-NEXT:    movdqa {{.*#+}} xmm8 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
778 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
779 ; SSE42-NEXT:    pshufb %xmm10, %xmm11
780 ; SSE42-NEXT:    psrlw $4, %xmm5
781 ; SSE42-NEXT:    pand %xmm9, %xmm5
782 ; SSE42-NEXT:    movdqa %xmm8, %xmm10
783 ; SSE42-NEXT:    pshufb %xmm5, %xmm10
784 ; SSE42-NEXT:    paddb %xmm11, %xmm10
785 ; SSE42-NEXT:    movdqa %xmm1, %xmm5
786 ; SSE42-NEXT:    pand %xmm9, %xmm5
787 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
788 ; SSE42-NEXT:    pshufb %xmm5, %xmm11
789 ; SSE42-NEXT:    psrlw $4, %xmm1
790 ; SSE42-NEXT:    pand %xmm9, %xmm1
791 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
792 ; SSE42-NEXT:    pshufb %xmm1, %xmm5
793 ; SSE42-NEXT:    paddb %xmm11, %xmm5
794 ; SSE42-NEXT:    paddb %xmm10, %xmm5
795 ; SSE42-NEXT:    movdqa %xmm7, %xmm1
796 ; SSE42-NEXT:    pand %xmm9, %xmm1
797 ; SSE42-NEXT:    movdqa %xmm8, %xmm10
798 ; SSE42-NEXT:    pshufb %xmm1, %xmm10
799 ; SSE42-NEXT:    psrlw $4, %xmm7
800 ; SSE42-NEXT:    pand %xmm9, %xmm7
801 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
802 ; SSE42-NEXT:    pshufb %xmm7, %xmm11
803 ; SSE42-NEXT:    paddb %xmm10, %xmm11
804 ; SSE42-NEXT:    movdqa %xmm3, %xmm1
805 ; SSE42-NEXT:    pand %xmm9, %xmm1
806 ; SSE42-NEXT:    movdqa %xmm8, %xmm7
807 ; SSE42-NEXT:    pshufb %xmm1, %xmm7
808 ; SSE42-NEXT:    psrlw $4, %xmm3
809 ; SSE42-NEXT:    pand %xmm9, %xmm3
810 ; SSE42-NEXT:    movdqa %xmm8, %xmm1
811 ; SSE42-NEXT:    pshufb %xmm3, %xmm1
812 ; SSE42-NEXT:    paddb %xmm7, %xmm1
813 ; SSE42-NEXT:    paddb %xmm11, %xmm1
814 ; SSE42-NEXT:    paddb %xmm5, %xmm1
815 ; SSE42-NEXT:    movdqa %xmm4, %xmm3
816 ; SSE42-NEXT:    pand %xmm9, %xmm3
817 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
818 ; SSE42-NEXT:    pshufb %xmm3, %xmm5
819 ; SSE42-NEXT:    psrlw $4, %xmm4
820 ; SSE42-NEXT:    pand %xmm9, %xmm4
821 ; SSE42-NEXT:    movdqa %xmm8, %xmm7
822 ; SSE42-NEXT:    pshufb %xmm4, %xmm7
823 ; SSE42-NEXT:    paddb %xmm5, %xmm7
824 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
825 ; SSE42-NEXT:    pand %xmm9, %xmm3
826 ; SSE42-NEXT:    movdqa %xmm8, %xmm4
827 ; SSE42-NEXT:    pshufb %xmm3, %xmm4
828 ; SSE42-NEXT:    psrlw $4, %xmm0
829 ; SSE42-NEXT:    pand %xmm9, %xmm0
830 ; SSE42-NEXT:    movdqa %xmm8, %xmm3
831 ; SSE42-NEXT:    pshufb %xmm0, %xmm3
832 ; SSE42-NEXT:    paddb %xmm4, %xmm3
833 ; SSE42-NEXT:    paddb %xmm7, %xmm3
834 ; SSE42-NEXT:    movdqa %xmm6, %xmm0
835 ; SSE42-NEXT:    pand %xmm9, %xmm0
836 ; SSE42-NEXT:    movdqa %xmm8, %xmm4
837 ; SSE42-NEXT:    pshufb %xmm0, %xmm4
838 ; SSE42-NEXT:    psrlw $4, %xmm6
839 ; SSE42-NEXT:    pand %xmm9, %xmm6
840 ; SSE42-NEXT:    movdqa %xmm8, %xmm0
841 ; SSE42-NEXT:    pshufb %xmm6, %xmm0
842 ; SSE42-NEXT:    paddb %xmm4, %xmm0
843 ; SSE42-NEXT:    movdqa %xmm2, %xmm4
844 ; SSE42-NEXT:    pand %xmm9, %xmm4
845 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
846 ; SSE42-NEXT:    pshufb %xmm4, %xmm5
847 ; SSE42-NEXT:    psrlw $4, %xmm2
848 ; SSE42-NEXT:    pand %xmm9, %xmm2
849 ; SSE42-NEXT:    pshufb %xmm2, %xmm8
850 ; SSE42-NEXT:    paddb %xmm5, %xmm8
851 ; SSE42-NEXT:    paddb %xmm0, %xmm8
852 ; SSE42-NEXT:    paddb %xmm3, %xmm8
853 ; SSE42-NEXT:    paddb %xmm1, %xmm8
854 ; SSE42-NEXT:    pxor %xmm0, %xmm0
855 ; SSE42-NEXT:    psadbw %xmm8, %xmm0
856 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
857 ; SSE42-NEXT:    paddq %xmm0, %xmm1
858 ; SSE42-NEXT:    movq %xmm1, %rax
859 ; SSE42-NEXT:    retq
861 ; AVX2-LABEL: reduce_ctpop_v16i64:
862 ; AVX2:       # %bb.0:
863 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm4 = [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]
864 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm5
865 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm6 = [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]
866 ; AVX2-NEXT:    # ymm6 = mem[0,1,0,1]
867 ; AVX2-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
868 ; AVX2-NEXT:    vpsrlw $4, %ymm2, %ymm2
869 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
870 ; AVX2-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
871 ; AVX2-NEXT:    vpaddb %ymm5, %ymm2, %ymm2
872 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm5
873 ; AVX2-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
874 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
875 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
876 ; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
877 ; AVX2-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
878 ; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm0
879 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm2
880 ; AVX2-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
881 ; AVX2-NEXT:    vpsrlw $4, %ymm3, %ymm3
882 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
883 ; AVX2-NEXT:    vpshufb %ymm3, %ymm6, %ymm3
884 ; AVX2-NEXT:    vpaddb %ymm2, %ymm3, %ymm2
885 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm3
886 ; AVX2-NEXT:    vpshufb %ymm3, %ymm6, %ymm3
887 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
888 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
889 ; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
890 ; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
891 ; AVX2-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
892 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
893 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
894 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0
895 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
896 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
897 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
898 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
899 ; AVX2-NEXT:    vmovq %xmm0, %rax
900 ; AVX2-NEXT:    vzeroupper
901 ; AVX2-NEXT:    retq
903 ; AVX512VL-LABEL: reduce_ctpop_v16i64:
904 ; AVX512VL:       # %bb.0:
905 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} zmm2 = [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,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]
906 ; AVX512VL-NEXT:    vpandq %zmm2, %zmm0, %zmm3
907 ; AVX512VL-NEXT:    vbroadcasti32x4 {{.*#+}} zmm4 = [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,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]
908 ; AVX512VL-NEXT:    # zmm4 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
909 ; AVX512VL-NEXT:    vpshufb %zmm3, %zmm4, %zmm3
910 ; AVX512VL-NEXT:    vpsrlw $4, %zmm0, %zmm0
911 ; AVX512VL-NEXT:    vpandq %zmm2, %zmm0, %zmm0
912 ; AVX512VL-NEXT:    vpshufb %zmm0, %zmm4, %zmm0
913 ; AVX512VL-NEXT:    vpaddb %zmm3, %zmm0, %zmm0
914 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
915 ; AVX512VL-NEXT:    vpsadbw %zmm3, %zmm0, %zmm0
916 ; AVX512VL-NEXT:    vpandq %zmm2, %zmm1, %zmm5
917 ; AVX512VL-NEXT:    vpshufb %zmm5, %zmm4, %zmm5
918 ; AVX512VL-NEXT:    vpsrlw $4, %zmm1, %zmm1
919 ; AVX512VL-NEXT:    vpandq %zmm2, %zmm1, %zmm1
920 ; AVX512VL-NEXT:    vpshufb %zmm1, %zmm4, %zmm1
921 ; AVX512VL-NEXT:    vpaddb %zmm5, %zmm1, %zmm1
922 ; AVX512VL-NEXT:    vpsadbw %zmm3, %zmm1, %zmm1
923 ; AVX512VL-NEXT:    vpmovqb %zmm1, %xmm1
924 ; AVX512VL-NEXT:    vpmovqb %zmm0, %xmm0
925 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
926 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
927 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
928 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
929 ; AVX512VL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
930 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
931 ; AVX512VL-NEXT:    vzeroupper
932 ; AVX512VL-NEXT:    retq
934 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v16i64:
935 ; AVX512VPOPCNT:       # %bb.0:
936 ; AVX512VPOPCNT-NEXT:    vpopcntq %zmm0, %zmm0
937 ; AVX512VPOPCNT-NEXT:    vpopcntq %zmm1, %zmm1
938 ; AVX512VPOPCNT-NEXT:    vpmovqb %zmm1, %xmm1
939 ; AVX512VPOPCNT-NEXT:    vpmovqb %zmm0, %xmm0
940 ; AVX512VPOPCNT-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
941 ; AVX512VPOPCNT-NEXT:    vpxor %xmm1, %xmm1, %xmm1
942 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0
943 ; AVX512VPOPCNT-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
944 ; AVX512VPOPCNT-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
945 ; AVX512VPOPCNT-NEXT:    vmovq %xmm0, %rax
946 ; AVX512VPOPCNT-NEXT:    vzeroupper
947 ; AVX512VPOPCNT-NEXT:    retq
948   %p0 = tail call <16 x i64> @llvm.ctpop.v16i64(<16 x i64> %a0)
949   %r0 = tail call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> %p0)
950   ret i64 %r0
954 ; Vector of reductions of per-element ctpop results (create vector of each count all bits in each vector)
957 define <4 x i64> @reduce_ctpop_v4i64_buildvector_v4i64(<4 x i64> %a0, <4 x i64> %a1, <4 x i64> %a2, <4 x i64> %a3) nounwind {
958 ; SSE42-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
959 ; SSE42:       # %bb.0:
960 ; SSE42-NEXT:    movdqa %xmm0, %xmm8
961 ; SSE42-NEXT:    movdqa {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
962 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
963 ; SSE42-NEXT:    pand %xmm10, %xmm0
964 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
965 ; SSE42-NEXT:    movdqa %xmm9, %xmm11
966 ; SSE42-NEXT:    pshufb %xmm0, %xmm11
967 ; SSE42-NEXT:    psrlw $4, %xmm1
968 ; SSE42-NEXT:    pand %xmm10, %xmm1
969 ; SSE42-NEXT:    movdqa %xmm9, %xmm12
970 ; SSE42-NEXT:    pshufb %xmm1, %xmm12
971 ; SSE42-NEXT:    paddb %xmm11, %xmm12
972 ; SSE42-NEXT:    movdqa %xmm8, %xmm0
973 ; SSE42-NEXT:    pand %xmm10, %xmm0
974 ; SSE42-NEXT:    movdqa %xmm9, %xmm1
975 ; SSE42-NEXT:    pshufb %xmm0, %xmm1
976 ; SSE42-NEXT:    psrlw $4, %xmm8
977 ; SSE42-NEXT:    pand %xmm10, %xmm8
978 ; SSE42-NEXT:    movdqa %xmm9, %xmm0
979 ; SSE42-NEXT:    pshufb %xmm8, %xmm0
980 ; SSE42-NEXT:    paddb %xmm1, %xmm0
981 ; SSE42-NEXT:    paddb %xmm12, %xmm0
982 ; SSE42-NEXT:    movdqa %xmm3, %xmm1
983 ; SSE42-NEXT:    pand %xmm10, %xmm1
984 ; SSE42-NEXT:    movdqa %xmm9, %xmm8
985 ; SSE42-NEXT:    pshufb %xmm1, %xmm8
986 ; SSE42-NEXT:    psrlw $4, %xmm3
987 ; SSE42-NEXT:    pand %xmm10, %xmm3
988 ; SSE42-NEXT:    movdqa %xmm9, %xmm1
989 ; SSE42-NEXT:    pshufb %xmm3, %xmm1
990 ; SSE42-NEXT:    paddb %xmm8, %xmm1
991 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
992 ; SSE42-NEXT:    pand %xmm10, %xmm3
993 ; SSE42-NEXT:    movdqa %xmm9, %xmm8
994 ; SSE42-NEXT:    pshufb %xmm3, %xmm8
995 ; SSE42-NEXT:    psrlw $4, %xmm2
996 ; SSE42-NEXT:    pand %xmm10, %xmm2
997 ; SSE42-NEXT:    movdqa %xmm9, %xmm3
998 ; SSE42-NEXT:    pshufb %xmm2, %xmm3
999 ; SSE42-NEXT:    paddb %xmm8, %xmm3
1000 ; SSE42-NEXT:    paddb %xmm1, %xmm3
1001 ; SSE42-NEXT:    movdqa %xmm5, %xmm1
1002 ; SSE42-NEXT:    pand %xmm10, %xmm1
1003 ; SSE42-NEXT:    movdqa %xmm9, %xmm2
1004 ; SSE42-NEXT:    pshufb %xmm1, %xmm2
1005 ; SSE42-NEXT:    psrlw $4, %xmm5
1006 ; SSE42-NEXT:    pand %xmm10, %xmm5
1007 ; SSE42-NEXT:    movdqa %xmm9, %xmm8
1008 ; SSE42-NEXT:    pshufb %xmm5, %xmm8
1009 ; SSE42-NEXT:    paddb %xmm2, %xmm8
1010 ; SSE42-NEXT:    movdqa %xmm4, %xmm1
1011 ; SSE42-NEXT:    pand %xmm10, %xmm1
1012 ; SSE42-NEXT:    movdqa %xmm9, %xmm2
1013 ; SSE42-NEXT:    pshufb %xmm1, %xmm2
1014 ; SSE42-NEXT:    psrlw $4, %xmm4
1015 ; SSE42-NEXT:    pand %xmm10, %xmm4
1016 ; SSE42-NEXT:    movdqa %xmm9, %xmm1
1017 ; SSE42-NEXT:    pshufb %xmm4, %xmm1
1018 ; SSE42-NEXT:    paddb %xmm2, %xmm1
1019 ; SSE42-NEXT:    paddb %xmm8, %xmm1
1020 ; SSE42-NEXT:    movdqa %xmm7, %xmm2
1021 ; SSE42-NEXT:    pand %xmm10, %xmm2
1022 ; SSE42-NEXT:    movdqa %xmm9, %xmm4
1023 ; SSE42-NEXT:    pshufb %xmm2, %xmm4
1024 ; SSE42-NEXT:    psrlw $4, %xmm7
1025 ; SSE42-NEXT:    pand %xmm10, %xmm7
1026 ; SSE42-NEXT:    movdqa %xmm9, %xmm2
1027 ; SSE42-NEXT:    pshufb %xmm7, %xmm2
1028 ; SSE42-NEXT:    paddb %xmm4, %xmm2
1029 ; SSE42-NEXT:    movdqa %xmm6, %xmm4
1030 ; SSE42-NEXT:    pand %xmm10, %xmm4
1031 ; SSE42-NEXT:    movdqa %xmm9, %xmm5
1032 ; SSE42-NEXT:    pshufb %xmm4, %xmm5
1033 ; SSE42-NEXT:    psrlw $4, %xmm6
1034 ; SSE42-NEXT:    pand %xmm10, %xmm6
1035 ; SSE42-NEXT:    pshufb %xmm6, %xmm9
1036 ; SSE42-NEXT:    paddb %xmm5, %xmm9
1037 ; SSE42-NEXT:    paddb %xmm2, %xmm9
1038 ; SSE42-NEXT:    pxor %xmm2, %xmm2
1039 ; SSE42-NEXT:    psadbw %xmm2, %xmm0
1040 ; SSE42-NEXT:    psadbw %xmm2, %xmm3
1041 ; SSE42-NEXT:    psadbw %xmm2, %xmm1
1042 ; SSE42-NEXT:    psadbw %xmm2, %xmm9
1043 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
1044 ; SSE42-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm3[1]
1045 ; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
1046 ; SSE42-NEXT:    paddq %xmm2, %xmm0
1047 ; SSE42-NEXT:    movdqa %xmm1, %xmm2
1048 ; SSE42-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm9[1]
1049 ; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm9[0]
1050 ; SSE42-NEXT:    paddq %xmm2, %xmm1
1051 ; SSE42-NEXT:    retq
1053 ; AVX2-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
1054 ; AVX2:       # %bb.0:
1055 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm4 = [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]
1056 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm5
1057 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm6 = [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]
1058 ; AVX2-NEXT:    # ymm6 = mem[0,1,0,1]
1059 ; AVX2-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
1060 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1061 ; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
1062 ; AVX2-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
1063 ; AVX2-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
1064 ; AVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1065 ; AVX2-NEXT:    vpsadbw %ymm5, %ymm0, %ymm0
1066 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm7
1067 ; AVX2-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1068 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
1069 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
1070 ; AVX2-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
1071 ; AVX2-NEXT:    vpaddb %ymm7, %ymm1, %ymm1
1072 ; AVX2-NEXT:    vpsadbw %ymm5, %ymm1, %ymm1
1073 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm7
1074 ; AVX2-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1075 ; AVX2-NEXT:    vpsrlw $4, %ymm2, %ymm2
1076 ; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2
1077 ; AVX2-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
1078 ; AVX2-NEXT:    vpaddb %ymm7, %ymm2, %ymm2
1079 ; AVX2-NEXT:    vpsadbw %ymm5, %ymm2, %ymm2
1080 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm7
1081 ; AVX2-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1082 ; AVX2-NEXT:    vpsrlw $4, %ymm3, %ymm3
1083 ; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
1084 ; AVX2-NEXT:    vpshufb %ymm3, %ymm6, %ymm3
1085 ; AVX2-NEXT:    vpaddb %ymm7, %ymm3, %ymm3
1086 ; AVX2-NEXT:    vpsadbw %ymm5, %ymm3, %ymm3
1087 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
1088 ; AVX2-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
1089 ; AVX2-NEXT:    vpaddq %ymm4, %ymm1, %ymm1
1090 ; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
1091 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1092 ; AVX2-NEXT:    vpaddq %ymm3, %ymm0, %ymm0
1093 ; AVX2-NEXT:    vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
1094 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1095 ; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1096 ; AVX2-NEXT:    retq
1098 ; AVX512VL-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
1099 ; AVX512VL:       # %bb.0:
1100 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} ymm4 = [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]
1101 ; AVX512VL-NEXT:    vpand %ymm4, %ymm0, %ymm5
1102 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm6 = [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]
1103 ; AVX512VL-NEXT:    # ymm6 = mem[0,1,0,1]
1104 ; AVX512VL-NEXT:    vpshufb %ymm5, %ymm6, %ymm5
1105 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm0
1106 ; AVX512VL-NEXT:    vpand %ymm4, %ymm0, %ymm0
1107 ; AVX512VL-NEXT:    vpshufb %ymm0, %ymm6, %ymm0
1108 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm0, %ymm0
1109 ; AVX512VL-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1110 ; AVX512VL-NEXT:    vpsadbw %ymm5, %ymm0, %ymm0
1111 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm7
1112 ; AVX512VL-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1113 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm1
1114 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm1
1115 ; AVX512VL-NEXT:    vpshufb %ymm1, %ymm6, %ymm1
1116 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm1, %ymm1
1117 ; AVX512VL-NEXT:    vpsadbw %ymm5, %ymm1, %ymm1
1118 ; AVX512VL-NEXT:    vpand %ymm4, %ymm2, %ymm7
1119 ; AVX512VL-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1120 ; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm2
1121 ; AVX512VL-NEXT:    vpand %ymm4, %ymm2, %ymm2
1122 ; AVX512VL-NEXT:    vpshufb %ymm2, %ymm6, %ymm2
1123 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm2, %ymm2
1124 ; AVX512VL-NEXT:    vpsadbw %ymm5, %ymm2, %ymm2
1125 ; AVX512VL-NEXT:    vpand %ymm4, %ymm3, %ymm7
1126 ; AVX512VL-NEXT:    vpshufb %ymm7, %ymm6, %ymm7
1127 ; AVX512VL-NEXT:    vpsrlw $4, %ymm3, %ymm3
1128 ; AVX512VL-NEXT:    vpand %ymm4, %ymm3, %ymm3
1129 ; AVX512VL-NEXT:    vpshufb %ymm3, %ymm6, %ymm3
1130 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm3, %ymm3
1131 ; AVX512VL-NEXT:    vpsadbw %ymm5, %ymm3, %ymm3
1132 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
1133 ; AVX512VL-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
1134 ; AVX512VL-NEXT:    vpaddq %ymm4, %ymm1, %ymm1
1135 ; AVX512VL-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
1136 ; AVX512VL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1137 ; AVX512VL-NEXT:    vpaddq %ymm3, %ymm0, %ymm0
1138 ; AVX512VL-NEXT:    vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
1139 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1140 ; AVX512VL-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1141 ; AVX512VL-NEXT:    retq
1143 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
1144 ; AVX512VPOPCNT:       # %bb.0:
1145 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm0, %ymm0
1146 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm1, %ymm1
1147 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm2, %ymm2
1148 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm3, %ymm3
1149 ; AVX512VPOPCNT-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
1150 ; AVX512VPOPCNT-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
1151 ; AVX512VPOPCNT-NEXT:    vpaddq %ymm4, %ymm1, %ymm1
1152 ; AVX512VPOPCNT-NEXT:    vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
1153 ; AVX512VPOPCNT-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1154 ; AVX512VPOPCNT-NEXT:    vpaddq %ymm3, %ymm0, %ymm0
1155 ; AVX512VPOPCNT-NEXT:    vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
1156 ; AVX512VPOPCNT-NEXT:    vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
1157 ; AVX512VPOPCNT-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
1158 ; AVX512VPOPCNT-NEXT:    retq
1159   %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
1160   %p1 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a1)
1161   %p2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a2)
1162   %p3 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a3)
1163   %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
1164   %r1 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p1)
1165   %r2 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p2)
1166   %r3 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p3)
1167   %v0 = insertelement <4 x i64> undef, i64 %r0, i64 0
1168   %v1 = insertelement <4 x i64> %v0,   i64 %r1, i64 1
1169   %v2 = insertelement <4 x i64> %v1,   i64 %r2, i64 2
1170   %v3 = insertelement <4 x i64> %v2,   i64 %r3, i64 3
1171   ret <4 x i64> %v3
1174 define <8 x i32> @reduce_ctpop_v4i64_buildvector_v8i32(<4 x i64> %a0, <4 x i64> %a1, <4 x i64> %a2, <4 x i64> %a3, <4 x i64> %a4, <4 x i64> %a5, <4 x i64> %a6, <4 x i64> %a7) nounwind {
1175 ; SSE42-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1176 ; SSE42:       # %bb.0:
1177 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm9
1178 ; SSE42-NEXT:    movdqa {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1179 ; SSE42-NEXT:    movdqa %xmm1, %xmm11
1180 ; SSE42-NEXT:    pand %xmm10, %xmm11
1181 ; SSE42-NEXT:    movdqa {{.*#+}} xmm8 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
1182 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1183 ; SSE42-NEXT:    pshufb %xmm11, %xmm12
1184 ; SSE42-NEXT:    psrlw $4, %xmm1
1185 ; SSE42-NEXT:    pand %xmm10, %xmm1
1186 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
1187 ; SSE42-NEXT:    pshufb %xmm1, %xmm11
1188 ; SSE42-NEXT:    paddb %xmm12, %xmm11
1189 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
1190 ; SSE42-NEXT:    pand %xmm10, %xmm1
1191 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1192 ; SSE42-NEXT:    pshufb %xmm1, %xmm12
1193 ; SSE42-NEXT:    psrlw $4, %xmm0
1194 ; SSE42-NEXT:    pand %xmm10, %xmm0
1195 ; SSE42-NEXT:    movdqa %xmm8, %xmm1
1196 ; SSE42-NEXT:    pshufb %xmm0, %xmm1
1197 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0
1198 ; SSE42-NEXT:    paddb %xmm12, %xmm1
1199 ; SSE42-NEXT:    paddb %xmm11, %xmm1
1200 ; SSE42-NEXT:    movdqa %xmm3, %xmm11
1201 ; SSE42-NEXT:    pand %xmm10, %xmm11
1202 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1203 ; SSE42-NEXT:    pshufb %xmm11, %xmm12
1204 ; SSE42-NEXT:    psrlw $4, %xmm3
1205 ; SSE42-NEXT:    pand %xmm10, %xmm3
1206 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1207 ; SSE42-NEXT:    pshufb %xmm3, %xmm13
1208 ; SSE42-NEXT:    paddb %xmm12, %xmm13
1209 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
1210 ; SSE42-NEXT:    pand %xmm10, %xmm3
1211 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1212 ; SSE42-NEXT:    pshufb %xmm3, %xmm12
1213 ; SSE42-NEXT:    psrlw $4, %xmm2
1214 ; SSE42-NEXT:    pand %xmm10, %xmm2
1215 ; SSE42-NEXT:    movdqa %xmm8, %xmm3
1216 ; SSE42-NEXT:    pshufb %xmm2, %xmm3
1217 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
1218 ; SSE42-NEXT:    paddb %xmm12, %xmm3
1219 ; SSE42-NEXT:    paddb %xmm13, %xmm3
1220 ; SSE42-NEXT:    movdqa %xmm5, %xmm2
1221 ; SSE42-NEXT:    pand %xmm10, %xmm2
1222 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1223 ; SSE42-NEXT:    pshufb %xmm2, %xmm12
1224 ; SSE42-NEXT:    psrlw $4, %xmm5
1225 ; SSE42-NEXT:    pand %xmm10, %xmm5
1226 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1227 ; SSE42-NEXT:    pshufb %xmm5, %xmm13
1228 ; SSE42-NEXT:    paddb %xmm12, %xmm13
1229 ; SSE42-NEXT:    movdqa %xmm4, %xmm2
1230 ; SSE42-NEXT:    pand %xmm10, %xmm2
1231 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
1232 ; SSE42-NEXT:    pshufb %xmm2, %xmm5
1233 ; SSE42-NEXT:    psrlw $4, %xmm4
1234 ; SSE42-NEXT:    pand %xmm10, %xmm4
1235 ; SSE42-NEXT:    movdqa %xmm8, %xmm2
1236 ; SSE42-NEXT:    pshufb %xmm4, %xmm2
1237 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm12
1238 ; SSE42-NEXT:    paddb %xmm5, %xmm2
1239 ; SSE42-NEXT:    paddb %xmm13, %xmm2
1240 ; SSE42-NEXT:    movdqa %xmm7, %xmm4
1241 ; SSE42-NEXT:    pand %xmm10, %xmm4
1242 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
1243 ; SSE42-NEXT:    pshufb %xmm4, %xmm5
1244 ; SSE42-NEXT:    psrlw $4, %xmm7
1245 ; SSE42-NEXT:    pand %xmm10, %xmm7
1246 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1247 ; SSE42-NEXT:    pshufb %xmm7, %xmm13
1248 ; SSE42-NEXT:    paddb %xmm5, %xmm13
1249 ; SSE42-NEXT:    movdqa %xmm6, %xmm4
1250 ; SSE42-NEXT:    pand %xmm10, %xmm4
1251 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
1252 ; SSE42-NEXT:    pshufb %xmm4, %xmm5
1253 ; SSE42-NEXT:    psrlw $4, %xmm6
1254 ; SSE42-NEXT:    pand %xmm10, %xmm6
1255 ; SSE42-NEXT:    movdqa %xmm8, %xmm4
1256 ; SSE42-NEXT:    pshufb %xmm6, %xmm4
1257 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm6
1258 ; SSE42-NEXT:    paddb %xmm5, %xmm4
1259 ; SSE42-NEXT:    paddb %xmm13, %xmm4
1260 ; SSE42-NEXT:    movdqa %xmm6, %xmm5
1261 ; SSE42-NEXT:    pand %xmm10, %xmm5
1262 ; SSE42-NEXT:    movdqa %xmm8, %xmm7
1263 ; SSE42-NEXT:    pshufb %xmm5, %xmm7
1264 ; SSE42-NEXT:    psrlw $4, %xmm6
1265 ; SSE42-NEXT:    pand %xmm10, %xmm6
1266 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1267 ; SSE42-NEXT:    pshufb %xmm6, %xmm13
1268 ; SSE42-NEXT:    paddb %xmm7, %xmm13
1269 ; SSE42-NEXT:    movdqa %xmm12, %xmm5
1270 ; SSE42-NEXT:    pand %xmm10, %xmm5
1271 ; SSE42-NEXT:    movdqa %xmm8, %xmm6
1272 ; SSE42-NEXT:    pshufb %xmm5, %xmm6
1273 ; SSE42-NEXT:    psrlw $4, %xmm12
1274 ; SSE42-NEXT:    pand %xmm10, %xmm12
1275 ; SSE42-NEXT:    movdqa %xmm8, %xmm5
1276 ; SSE42-NEXT:    pshufb %xmm12, %xmm5
1277 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm7
1278 ; SSE42-NEXT:    paddb %xmm6, %xmm5
1279 ; SSE42-NEXT:    paddb %xmm13, %xmm5
1280 ; SSE42-NEXT:    movdqa %xmm7, %xmm6
1281 ; SSE42-NEXT:    pand %xmm10, %xmm6
1282 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1283 ; SSE42-NEXT:    pshufb %xmm6, %xmm12
1284 ; SSE42-NEXT:    psrlw $4, %xmm7
1285 ; SSE42-NEXT:    pand %xmm10, %xmm7
1286 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1287 ; SSE42-NEXT:    pshufb %xmm7, %xmm13
1288 ; SSE42-NEXT:    paddb %xmm12, %xmm13
1289 ; SSE42-NEXT:    movdqa %xmm11, %xmm6
1290 ; SSE42-NEXT:    pand %xmm10, %xmm6
1291 ; SSE42-NEXT:    movdqa %xmm8, %xmm7
1292 ; SSE42-NEXT:    pshufb %xmm6, %xmm7
1293 ; SSE42-NEXT:    psrlw $4, %xmm11
1294 ; SSE42-NEXT:    pand %xmm10, %xmm11
1295 ; SSE42-NEXT:    movdqa %xmm8, %xmm6
1296 ; SSE42-NEXT:    pshufb %xmm11, %xmm6
1297 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm11
1298 ; SSE42-NEXT:    paddb %xmm7, %xmm6
1299 ; SSE42-NEXT:    paddb %xmm13, %xmm6
1300 ; SSE42-NEXT:    movdqa %xmm11, %xmm7
1301 ; SSE42-NEXT:    pand %xmm10, %xmm7
1302 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1303 ; SSE42-NEXT:    pshufb %xmm7, %xmm12
1304 ; SSE42-NEXT:    psrlw $4, %xmm11
1305 ; SSE42-NEXT:    pand %xmm10, %xmm11
1306 ; SSE42-NEXT:    movdqa %xmm8, %xmm13
1307 ; SSE42-NEXT:    pshufb %xmm11, %xmm13
1308 ; SSE42-NEXT:    paddb %xmm12, %xmm13
1309 ; SSE42-NEXT:    movdqa %xmm0, %xmm7
1310 ; SSE42-NEXT:    pand %xmm10, %xmm7
1311 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
1312 ; SSE42-NEXT:    pshufb %xmm7, %xmm11
1313 ; SSE42-NEXT:    psrlw $4, %xmm0
1314 ; SSE42-NEXT:    pand %xmm10, %xmm0
1315 ; SSE42-NEXT:    movdqa %xmm8, %xmm7
1316 ; SSE42-NEXT:    pshufb %xmm0, %xmm7
1317 ; SSE42-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0
1318 ; SSE42-NEXT:    paddb %xmm11, %xmm7
1319 ; SSE42-NEXT:    paddb %xmm13, %xmm7
1320 ; SSE42-NEXT:    movdqa %xmm0, %xmm11
1321 ; SSE42-NEXT:    pand %xmm10, %xmm11
1322 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1323 ; SSE42-NEXT:    pshufb %xmm11, %xmm12
1324 ; SSE42-NEXT:    psrlw $4, %xmm0
1325 ; SSE42-NEXT:    pand %xmm10, %xmm0
1326 ; SSE42-NEXT:    movdqa %xmm8, %xmm11
1327 ; SSE42-NEXT:    pshufb %xmm0, %xmm11
1328 ; SSE42-NEXT:    paddb %xmm12, %xmm11
1329 ; SSE42-NEXT:    movdqa %xmm9, %xmm0
1330 ; SSE42-NEXT:    pand %xmm10, %xmm0
1331 ; SSE42-NEXT:    movdqa %xmm8, %xmm12
1332 ; SSE42-NEXT:    pshufb %xmm0, %xmm12
1333 ; SSE42-NEXT:    psrlw $4, %xmm9
1334 ; SSE42-NEXT:    pand %xmm10, %xmm9
1335 ; SSE42-NEXT:    pshufb %xmm9, %xmm8
1336 ; SSE42-NEXT:    paddb %xmm12, %xmm8
1337 ; SSE42-NEXT:    paddb %xmm11, %xmm8
1338 ; SSE42-NEXT:    pxor %xmm9, %xmm9
1339 ; SSE42-NEXT:    psadbw %xmm9, %xmm1
1340 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1341 ; SSE42-NEXT:    paddq %xmm1, %xmm0
1342 ; SSE42-NEXT:    psadbw %xmm9, %xmm3
1343 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
1344 ; SSE42-NEXT:    paddq %xmm3, %xmm1
1345 ; SSE42-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1346 ; SSE42-NEXT:    psadbw %xmm9, %xmm2
1347 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
1348 ; SSE42-NEXT:    paddq %xmm2, %xmm1
1349 ; SSE42-NEXT:    psadbw %xmm9, %xmm4
1350 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
1351 ; SSE42-NEXT:    paddq %xmm4, %xmm2
1352 ; SSE42-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1353 ; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1354 ; SSE42-NEXT:    psadbw %xmm9, %xmm5
1355 ; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
1356 ; SSE42-NEXT:    paddq %xmm5, %xmm1
1357 ; SSE42-NEXT:    psadbw %xmm9, %xmm6
1358 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[2,3,2,3]
1359 ; SSE42-NEXT:    paddq %xmm6, %xmm2
1360 ; SSE42-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1361 ; SSE42-NEXT:    psadbw %xmm9, %xmm7
1362 ; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[2,3,2,3]
1363 ; SSE42-NEXT:    paddq %xmm7, %xmm2
1364 ; SSE42-NEXT:    psadbw %xmm9, %xmm8
1365 ; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm8[2,3,2,3]
1366 ; SSE42-NEXT:    paddq %xmm8, %xmm3
1367 ; SSE42-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
1368 ; SSE42-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1369 ; SSE42-NEXT:    retq
1371 ; AVX2-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1372 ; AVX2:       # %bb.0:
1373 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm8 = [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]
1374 ; AVX2-NEXT:    vpand %ymm0, %ymm8, %ymm10
1375 ; AVX2-NEXT:    vbroadcasti128 {{.*#+}} ymm9 = [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]
1376 ; AVX2-NEXT:    # ymm9 = mem[0,1,0,1]
1377 ; AVX2-NEXT:    vpshufb %ymm10, %ymm9, %ymm10
1378 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm0
1379 ; AVX2-NEXT:    vpand %ymm0, %ymm8, %ymm0
1380 ; AVX2-NEXT:    vpshufb %ymm0, %ymm9, %ymm0
1381 ; AVX2-NEXT:    vpaddb %ymm0, %ymm10, %ymm0
1382 ; AVX2-NEXT:    vpxor %xmm10, %xmm10, %xmm10
1383 ; AVX2-NEXT:    vpsadbw %ymm0, %ymm10, %ymm0
1384 ; AVX2-NEXT:    vpand %ymm1, %ymm8, %ymm11
1385 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1386 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
1387 ; AVX2-NEXT:    vpand %ymm1, %ymm8, %ymm1
1388 ; AVX2-NEXT:    vpshufb %ymm1, %ymm9, %ymm1
1389 ; AVX2-NEXT:    vpaddb %ymm1, %ymm11, %ymm1
1390 ; AVX2-NEXT:    vpsadbw %ymm1, %ymm10, %ymm1
1391 ; AVX2-NEXT:    vpand %ymm2, %ymm8, %ymm11
1392 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1393 ; AVX2-NEXT:    vpsrlw $4, %ymm2, %ymm2
1394 ; AVX2-NEXT:    vpand %ymm2, %ymm8, %ymm2
1395 ; AVX2-NEXT:    vpshufb %ymm2, %ymm9, %ymm2
1396 ; AVX2-NEXT:    vpaddb %ymm2, %ymm11, %ymm2
1397 ; AVX2-NEXT:    vpsadbw %ymm2, %ymm10, %ymm2
1398 ; AVX2-NEXT:    vpand %ymm3, %ymm8, %ymm11
1399 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1400 ; AVX2-NEXT:    vpsrlw $4, %ymm3, %ymm3
1401 ; AVX2-NEXT:    vpand %ymm3, %ymm8, %ymm3
1402 ; AVX2-NEXT:    vpshufb %ymm3, %ymm9, %ymm3
1403 ; AVX2-NEXT:    vpaddb %ymm3, %ymm11, %ymm3
1404 ; AVX2-NEXT:    vpsadbw %ymm3, %ymm10, %ymm3
1405 ; AVX2-NEXT:    vpand %ymm4, %ymm8, %ymm11
1406 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1407 ; AVX2-NEXT:    vpsrlw $4, %ymm4, %ymm4
1408 ; AVX2-NEXT:    vpand %ymm4, %ymm8, %ymm4
1409 ; AVX2-NEXT:    vpshufb %ymm4, %ymm9, %ymm4
1410 ; AVX2-NEXT:    vpaddb %ymm4, %ymm11, %ymm4
1411 ; AVX2-NEXT:    vpsadbw %ymm4, %ymm10, %ymm4
1412 ; AVX2-NEXT:    vpand %ymm5, %ymm8, %ymm11
1413 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1414 ; AVX2-NEXT:    vpsrlw $4, %ymm5, %ymm5
1415 ; AVX2-NEXT:    vpand %ymm5, %ymm8, %ymm5
1416 ; AVX2-NEXT:    vpshufb %ymm5, %ymm9, %ymm5
1417 ; AVX2-NEXT:    vpaddb %ymm5, %ymm11, %ymm5
1418 ; AVX2-NEXT:    vpsadbw %ymm5, %ymm10, %ymm5
1419 ; AVX2-NEXT:    vpand %ymm6, %ymm8, %ymm11
1420 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1421 ; AVX2-NEXT:    vpsrlw $4, %ymm6, %ymm6
1422 ; AVX2-NEXT:    vpand %ymm6, %ymm8, %ymm6
1423 ; AVX2-NEXT:    vpshufb %ymm6, %ymm9, %ymm6
1424 ; AVX2-NEXT:    vpaddb %ymm6, %ymm11, %ymm6
1425 ; AVX2-NEXT:    vpsadbw %ymm6, %ymm10, %ymm6
1426 ; AVX2-NEXT:    vpand %ymm7, %ymm8, %ymm11
1427 ; AVX2-NEXT:    vpshufb %ymm11, %ymm9, %ymm11
1428 ; AVX2-NEXT:    vpsrlw $4, %ymm7, %ymm7
1429 ; AVX2-NEXT:    vpand %ymm7, %ymm8, %ymm7
1430 ; AVX2-NEXT:    vpshufb %ymm7, %ymm9, %ymm7
1431 ; AVX2-NEXT:    vpaddb %ymm7, %ymm11, %ymm7
1432 ; AVX2-NEXT:    vpsadbw %ymm7, %ymm10, %ymm7
1433 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm8
1434 ; AVX2-NEXT:    vpaddq %xmm0, %xmm8, %xmm0
1435 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
1436 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm9
1437 ; AVX2-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
1438 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm9 = xmm1[2,3,2,3]
1439 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm10
1440 ; AVX2-NEXT:    vpaddq %xmm2, %xmm10, %xmm2
1441 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm10 = xmm2[2,3,2,3]
1442 ; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm11
1443 ; AVX2-NEXT:    vpaddq %xmm3, %xmm11, %xmm3
1444 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm11 = xmm3[2,3,2,3]
1445 ; AVX2-NEXT:    vextracti128 $1, %ymm4, %xmm12
1446 ; AVX2-NEXT:    vpaddq %xmm4, %xmm12, %xmm4
1447 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm12 = xmm4[2,3,2,3]
1448 ; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm13
1449 ; AVX2-NEXT:    vpaddq %xmm5, %xmm13, %xmm5
1450 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm13 = xmm5[2,3,2,3]
1451 ; AVX2-NEXT:    vextracti128 $1, %ymm6, %xmm14
1452 ; AVX2-NEXT:    vpaddq %xmm6, %xmm14, %xmm6
1453 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm14 = xmm6[2,3,2,3]
1454 ; AVX2-NEXT:    vextracti128 $1, %ymm7, %xmm15
1455 ; AVX2-NEXT:    vpaddq %xmm7, %xmm15, %xmm7
1456 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm15 = xmm7[2,3,2,3]
1457 ; AVX2-NEXT:    vpaddq %xmm0, %xmm8, %xmm0
1458 ; AVX2-NEXT:    vpaddq %xmm1, %xmm9, %xmm1
1459 ; AVX2-NEXT:    vmovd %xmm1, %eax
1460 ; AVX2-NEXT:    vpaddq %xmm2, %xmm10, %xmm1
1461 ; AVX2-NEXT:    vmovd %xmm1, %ecx
1462 ; AVX2-NEXT:    vpaddq %xmm3, %xmm11, %xmm1
1463 ; AVX2-NEXT:    vmovd %xmm1, %edx
1464 ; AVX2-NEXT:    vpaddq %xmm4, %xmm12, %xmm1
1465 ; AVX2-NEXT:    vpaddq %xmm5, %xmm13, %xmm2
1466 ; AVX2-NEXT:    vmovd %xmm2, %esi
1467 ; AVX2-NEXT:    vpaddq %xmm6, %xmm14, %xmm2
1468 ; AVX2-NEXT:    vmovd %xmm2, %edi
1469 ; AVX2-NEXT:    vpaddq %xmm7, %xmm15, %xmm2
1470 ; AVX2-NEXT:    vmovd %xmm2, %r8d
1471 ; AVX2-NEXT:    vpinsrd $1, %esi, %xmm1, %xmm1
1472 ; AVX2-NEXT:    vpinsrd $2, %edi, %xmm1, %xmm1
1473 ; AVX2-NEXT:    vpinsrd $3, %r8d, %xmm1, %xmm1
1474 ; AVX2-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
1475 ; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
1476 ; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
1477 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1478 ; AVX2-NEXT:    retq
1480 ; AVX512VL-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1481 ; AVX512VL:       # %bb.0:
1482 ; AVX512VL-NEXT:    vpbroadcastb {{.*#+}} ymm8 = [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]
1483 ; AVX512VL-NEXT:    vpand %ymm0, %ymm8, %ymm9
1484 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm10 = [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]
1485 ; AVX512VL-NEXT:    # ymm10 = mem[0,1,0,1]
1486 ; AVX512VL-NEXT:    vpshufb %ymm9, %ymm10, %ymm9
1487 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm0
1488 ; AVX512VL-NEXT:    vpand %ymm0, %ymm8, %ymm0
1489 ; AVX512VL-NEXT:    vpshufb %ymm0, %ymm10, %ymm0
1490 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm9, %ymm9
1491 ; AVX512VL-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1492 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm9, %ymm9
1493 ; AVX512VL-NEXT:    vpand %ymm1, %ymm8, %ymm11
1494 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1495 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm1
1496 ; AVX512VL-NEXT:    vpand %ymm1, %ymm8, %ymm1
1497 ; AVX512VL-NEXT:    vpshufb %ymm1, %ymm10, %ymm1
1498 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm11, %ymm1
1499 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm1, %ymm1
1500 ; AVX512VL-NEXT:    vpand %ymm2, %ymm8, %ymm11
1501 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1502 ; AVX512VL-NEXT:    vpsrlw $4, %ymm2, %ymm2
1503 ; AVX512VL-NEXT:    vpand %ymm2, %ymm8, %ymm2
1504 ; AVX512VL-NEXT:    vpshufb %ymm2, %ymm10, %ymm2
1505 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm11, %ymm2
1506 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm2, %ymm2
1507 ; AVX512VL-NEXT:    vpand %ymm3, %ymm8, %ymm11
1508 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1509 ; AVX512VL-NEXT:    vpsrlw $4, %ymm3, %ymm3
1510 ; AVX512VL-NEXT:    vpand %ymm3, %ymm8, %ymm3
1511 ; AVX512VL-NEXT:    vpshufb %ymm3, %ymm10, %ymm3
1512 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm11, %ymm3
1513 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm3, %ymm3
1514 ; AVX512VL-NEXT:    vpand %ymm4, %ymm8, %ymm11
1515 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1516 ; AVX512VL-NEXT:    vpsrlw $4, %ymm4, %ymm4
1517 ; AVX512VL-NEXT:    vpand %ymm4, %ymm8, %ymm4
1518 ; AVX512VL-NEXT:    vpshufb %ymm4, %ymm10, %ymm4
1519 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm11, %ymm4
1520 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm4, %ymm4
1521 ; AVX512VL-NEXT:    vpand %ymm5, %ymm8, %ymm11
1522 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1523 ; AVX512VL-NEXT:    vpsrlw $4, %ymm5, %ymm5
1524 ; AVX512VL-NEXT:    vpand %ymm5, %ymm8, %ymm5
1525 ; AVX512VL-NEXT:    vpshufb %ymm5, %ymm10, %ymm5
1526 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm11, %ymm5
1527 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm5, %ymm5
1528 ; AVX512VL-NEXT:    vpand %ymm6, %ymm8, %ymm11
1529 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1530 ; AVX512VL-NEXT:    vpsrlw $4, %ymm6, %ymm6
1531 ; AVX512VL-NEXT:    vpand %ymm6, %ymm8, %ymm6
1532 ; AVX512VL-NEXT:    vpshufb %ymm6, %ymm10, %ymm6
1533 ; AVX512VL-NEXT:    vpaddb %ymm6, %ymm11, %ymm6
1534 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm6, %ymm6
1535 ; AVX512VL-NEXT:    vpand %ymm7, %ymm8, %ymm11
1536 ; AVX512VL-NEXT:    vpshufb %ymm11, %ymm10, %ymm11
1537 ; AVX512VL-NEXT:    vpsrlw $4, %ymm7, %ymm7
1538 ; AVX512VL-NEXT:    vpand %ymm7, %ymm8, %ymm7
1539 ; AVX512VL-NEXT:    vpshufb %ymm7, %ymm10, %ymm7
1540 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm11, %ymm7
1541 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm7, %ymm7
1542 ; AVX512VL-NEXT:    vpmovqb %ymm9, %xmm8
1543 ; AVX512VL-NEXT:    vpxor %xmm9, %xmm9, %xmm9
1544 ; AVX512VL-NEXT:    vpsadbw %xmm9, %xmm8, %xmm8
1545 ; AVX512VL-NEXT:    vpmovqb %ymm1, %xmm1
1546 ; AVX512VL-NEXT:    vpsadbw %xmm1, %xmm9, %xmm1
1547 ; AVX512VL-NEXT:    vpmovqb %ymm2, %xmm2
1548 ; AVX512VL-NEXT:    vpmovqb %ymm3, %xmm3
1549 ; AVX512VL-NEXT:    vpmovqb %ymm4, %xmm4
1550 ; AVX512VL-NEXT:    vpmovqb %ymm5, %xmm5
1551 ; AVX512VL-NEXT:    vpmovqb %ymm6, %xmm6
1552 ; AVX512VL-NEXT:    vpmovqb %ymm7, %xmm7
1553 ; AVX512VL-NEXT:    vinserti128 $1, %xmm7, %ymm6, %ymm6
1554 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm6, %ymm6
1555 ; AVX512VL-NEXT:    vinserti128 $1, %xmm5, %ymm4, %ymm4
1556 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm4, %ymm4
1557 ; AVX512VL-NEXT:    vpmovsxbd {{.*#+}} ymm5 = [0,0,0,0,0,4,8,12]
1558 ; AVX512VL-NEXT:    vpermi2d %ymm6, %ymm4, %ymm5
1559 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm8[0],xmm1[0],xmm8[1],xmm1[1]
1560 ; AVX512VL-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1561 ; AVX512VL-NEXT:    vpsadbw %ymm0, %ymm2, %ymm0
1562 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,4,0,4]
1563 ; AVX512VL-NEXT:    vpermd %ymm0, %ymm2, %ymm0
1564 ; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1565 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm5[4,5,6,7]
1566 ; AVX512VL-NEXT:    retq
1568 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1569 ; AVX512VPOPCNT:       # %bb.0:
1570 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm0, %ymm0
1571 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm1, %ymm1
1572 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm2, %ymm2
1573 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm3, %ymm3
1574 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm4, %ymm4
1575 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm5, %ymm5
1576 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm6, %ymm6
1577 ; AVX512VPOPCNT-NEXT:    vpopcntq %ymm7, %ymm7
1578 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm0, %xmm0
1579 ; AVX512VPOPCNT-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1580 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm0, %xmm8, %xmm0
1581 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm1, %xmm1
1582 ; AVX512VPOPCNT-NEXT:    vpsadbw %xmm1, %xmm8, %xmm1
1583 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm2, %xmm2
1584 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm3, %xmm3
1585 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm4, %xmm4
1586 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm5, %xmm5
1587 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm6, %xmm6
1588 ; AVX512VPOPCNT-NEXT:    vpmovqb %ymm7, %xmm7
1589 ; AVX512VPOPCNT-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1590 ; AVX512VPOPCNT-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [0,4,0,4]
1591 ; AVX512VPOPCNT-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1592 ; AVX512VPOPCNT-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1593 ; AVX512VPOPCNT-NEXT:    vpsadbw %ymm3, %ymm2, %ymm2
1594 ; AVX512VPOPCNT-NEXT:    vpermd %ymm2, %ymm1, %ymm1
1595 ; AVX512VPOPCNT-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
1596 ; AVX512VPOPCNT-NEXT:    vinserti128 $1, %xmm7, %ymm6, %ymm1
1597 ; AVX512VPOPCNT-NEXT:    vpsadbw %ymm3, %ymm1, %ymm1
1598 ; AVX512VPOPCNT-NEXT:    vinserti128 $1, %xmm5, %ymm4, %ymm2
1599 ; AVX512VPOPCNT-NEXT:    vpsadbw %ymm3, %ymm2, %ymm2
1600 ; AVX512VPOPCNT-NEXT:    vpmovsxbd {{.*#+}} ymm3 = [0,0,0,0,0,4,8,12]
1601 ; AVX512VPOPCNT-NEXT:    vpermi2d %ymm1, %ymm2, %ymm3
1602 ; AVX512VPOPCNT-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm3[4,5,6,7]
1603 ; AVX512VPOPCNT-NEXT:    retq
1604   %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
1605   %p1 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a1)
1606   %p2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a2)
1607   %p3 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a3)
1608   %p4 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a4)
1609   %p5 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a5)
1610   %p6 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a6)
1611   %p7 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a7)
1612   %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
1613   %r1 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p1)
1614   %r2 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p2)
1615   %r3 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p3)
1616   %r4 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p4)
1617   %r5 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p5)
1618   %r6 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p6)
1619   %r7 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p7)
1620   %t0 = trunc i64 %r0 to i32
1621   %t1 = trunc i64 %r1 to i32
1622   %t2 = trunc i64 %r2 to i32
1623   %t3 = trunc i64 %r3 to i32
1624   %t4 = trunc i64 %r4 to i32
1625   %t5 = trunc i64 %r5 to i32
1626   %t6 = trunc i64 %r6 to i32
1627   %t7 = trunc i64 %r7 to i32
1628   %v0 = insertelement <8 x i32> undef, i32 %t0, i64 0
1629   %v1 = insertelement <8 x i32> %v0,   i32 %t1, i64 1
1630   %v2 = insertelement <8 x i32> %v1,   i32 %t2, i64 2
1631   %v3 = insertelement <8 x i32> %v2,   i32 %t3, i64 3
1632   %v4 = insertelement <8 x i32> %v3,   i32 %t4, i64 4
1633   %v5 = insertelement <8 x i32> %v4,   i32 %t5, i64 5
1634   %v6 = insertelement <8 x i32> %v5,   i32 %t6, i64 6
1635   %v7 = insertelement <8 x i32> %v6,   i32 %t7, i64 7
1636   ret <8 x i32> %v7
1639 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
1640 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1641 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1642 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
1643 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
1644 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
1646 declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)
1647 declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)
1648 declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)
1649 declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)
1650 declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)
1651 declare i8  @llvm.vector.reduce.add.v16i8(<16 x i8>)