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:
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
32 ; AVX2-LABEL: reduce_ctpop_v2i64:
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
49 ; AVX512VL-LABEL: reduce_ctpop_v2i64:
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
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)
78 define i32 @reduce_ctpop_v4i32(<4 x i32> %a0) {
79 ; SSE42-LABEL: reduce_ctpop_v4i32:
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
104 ; AVX2-LABEL: reduce_ctpop_v4i32:
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
127 ; AVX512VL-LABEL: reduce_ctpop_v4i32:
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)
161 define i16 @reduce_ctpop_v8i16(<8 x i16> %a0) {
162 ; SSE42-LABEL: reduce_ctpop_v8i16:
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
185 ; AVX2-LABEL: reduce_ctpop_v8i16:
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
205 ; AVX512VL-LABEL: reduce_ctpop_v8i16:
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)
241 define i8 @reduce_ctpop_v16i8(<16 x i8> %a0) {
242 ; SSE42-LABEL: reduce_ctpop_v16i8:
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
262 ; AVX2-LABEL: reduce_ctpop_v16i8:
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
280 ; AVX512VL-LABEL: reduce_ctpop_v16i8:
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)
316 define i64 @reduce_ctpop_v4i64(<4 x i64> %a0) {
317 ; SSE42-LABEL: reduce_ctpop_v4i64:
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: pxor %xmm1, %xmm1
331 ; SSE42-NEXT: psadbw %xmm1, %xmm3
332 ; SSE42-NEXT: movdqa %xmm0, %xmm5
333 ; SSE42-NEXT: pand %xmm2, %xmm5
334 ; SSE42-NEXT: movdqa %xmm4, %xmm6
335 ; SSE42-NEXT: pshufb %xmm5, %xmm6
336 ; SSE42-NEXT: psrlw $4, %xmm0
337 ; SSE42-NEXT: pand %xmm2, %xmm0
338 ; SSE42-NEXT: pshufb %xmm0, %xmm4
339 ; SSE42-NEXT: paddb %xmm6, %xmm4
340 ; SSE42-NEXT: psadbw %xmm1, %xmm4
341 ; SSE42-NEXT: paddq %xmm3, %xmm4
342 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
343 ; SSE42-NEXT: paddq %xmm4, %xmm0
344 ; SSE42-NEXT: movq %xmm0, %rax
347 ; AVX2-LABEL: reduce_ctpop_v4i64:
349 ; 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]
350 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
351 ; 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]
352 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
353 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
354 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
355 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
356 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
357 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
358 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
359 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
360 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
361 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
362 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
363 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
364 ; AVX2-NEXT: vmovq %xmm0, %rax
365 ; AVX2-NEXT: vzeroupper
368 ; AVX512VL-LABEL: reduce_ctpop_v4i64:
370 ; 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]
371 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm2
372 ; 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]
373 ; AVX512VL-NEXT: # ymm3 = mem[0,1,0,1]
374 ; AVX512VL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
375 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0
376 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm0
377 ; AVX512VL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
378 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
379 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
380 ; AVX512VL-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
381 ; AVX512VL-NEXT: vpmovqb %ymm0, %xmm0
382 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
383 ; AVX512VL-NEXT: vpsadbw %xmm1, %xmm0, %xmm0
384 ; AVX512VL-NEXT: vmovq %xmm0, %rax
385 ; AVX512VL-NEXT: vzeroupper
386 ; AVX512VL-NEXT: retq
388 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64:
389 ; AVX512VPOPCNT: # %bb.0:
390 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm0, %ymm0
391 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm0, %xmm0
392 ; AVX512VPOPCNT-NEXT: vpxor %xmm1, %xmm1, %xmm1
393 ; AVX512VPOPCNT-NEXT: vpsadbw %xmm1, %xmm0, %xmm0
394 ; AVX512VPOPCNT-NEXT: vmovq %xmm0, %rax
395 ; AVX512VPOPCNT-NEXT: vzeroupper
396 ; AVX512VPOPCNT-NEXT: retq
397 %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
398 %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
402 define i32 @reduce_ctpop_v8i32(<8 x i32> %a0) {
403 ; SSE42-LABEL: reduce_ctpop_v8i32:
405 ; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
406 ; SSE42-NEXT: movdqa %xmm1, %xmm4
407 ; SSE42-NEXT: pand %xmm3, %xmm4
408 ; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
409 ; SSE42-NEXT: movdqa %xmm2, %xmm5
410 ; SSE42-NEXT: pshufb %xmm4, %xmm5
411 ; SSE42-NEXT: psrlw $4, %xmm1
412 ; SSE42-NEXT: pand %xmm3, %xmm1
413 ; SSE42-NEXT: movdqa %xmm2, %xmm4
414 ; SSE42-NEXT: pshufb %xmm1, %xmm4
415 ; SSE42-NEXT: paddb %xmm5, %xmm4
416 ; SSE42-NEXT: pxor %xmm1, %xmm1
417 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
418 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm1[2],xmm4[3],xmm1[3]
419 ; SSE42-NEXT: psadbw %xmm1, %xmm4
420 ; SSE42-NEXT: psadbw %xmm1, %xmm5
421 ; SSE42-NEXT: packuswb %xmm4, %xmm5
422 ; SSE42-NEXT: movdqa %xmm0, %xmm4
423 ; SSE42-NEXT: pand %xmm3, %xmm4
424 ; SSE42-NEXT: movdqa %xmm2, %xmm6
425 ; SSE42-NEXT: pshufb %xmm4, %xmm6
426 ; SSE42-NEXT: psrlw $4, %xmm0
427 ; SSE42-NEXT: pand %xmm3, %xmm0
428 ; SSE42-NEXT: pshufb %xmm0, %xmm2
429 ; SSE42-NEXT: paddb %xmm6, %xmm2
430 ; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero
431 ; SSE42-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
432 ; SSE42-NEXT: psadbw %xmm1, %xmm2
433 ; SSE42-NEXT: psadbw %xmm1, %xmm0
434 ; SSE42-NEXT: packuswb %xmm2, %xmm0
435 ; SSE42-NEXT: paddd %xmm5, %xmm0
436 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
437 ; SSE42-NEXT: paddd %xmm0, %xmm1
438 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
439 ; SSE42-NEXT: paddd %xmm1, %xmm0
440 ; SSE42-NEXT: movd %xmm0, %eax
443 ; AVX2-LABEL: reduce_ctpop_v8i32:
445 ; 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]
446 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm2
447 ; 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]
448 ; AVX2-NEXT: # ymm3 = mem[0,1,0,1]
449 ; AVX2-NEXT: vpshufb %ymm2, %ymm3, %ymm2
450 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
451 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
452 ; AVX2-NEXT: vpshufb %ymm0, %ymm3, %ymm0
453 ; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0
454 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
455 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
456 ; AVX2-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
457 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
458 ; AVX2-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
459 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
460 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
461 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
462 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
463 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
464 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
465 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
466 ; AVX2-NEXT: vmovd %xmm0, %eax
467 ; AVX2-NEXT: vzeroupper
470 ; AVX512VL-LABEL: reduce_ctpop_v8i32:
472 ; 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]
473 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm2
474 ; 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]
475 ; AVX512VL-NEXT: # ymm3 = mem[0,1,0,1]
476 ; AVX512VL-NEXT: vpshufb %ymm2, %ymm3, %ymm2
477 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0
478 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm0
479 ; AVX512VL-NEXT: vpshufb %ymm0, %ymm3, %ymm0
480 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0
481 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
482 ; AVX512VL-NEXT: vpunpckhdq {{.*#+}} ymm2 = ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[6],ymm1[6],ymm0[7],ymm1[7]
483 ; AVX512VL-NEXT: vpsadbw %ymm1, %ymm2, %ymm2
484 ; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[4],ymm1[4],ymm0[5],ymm1[5]
485 ; AVX512VL-NEXT: vpsadbw %ymm1, %ymm0, %ymm0
486 ; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
487 ; AVX512VL-NEXT: vpmovdb %ymm0, %xmm0
488 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
489 ; AVX512VL-NEXT: vpsadbw %xmm1, %xmm0, %xmm0
490 ; AVX512VL-NEXT: vmovd %xmm0, %eax
491 ; AVX512VL-NEXT: vzeroupper
492 ; AVX512VL-NEXT: retq
494 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v8i32:
495 ; AVX512VPOPCNT: # %bb.0:
496 ; AVX512VPOPCNT-NEXT: vpopcntd %ymm0, %ymm0
497 ; AVX512VPOPCNT-NEXT: vpmovdb %ymm0, %xmm0
498 ; AVX512VPOPCNT-NEXT: vpxor %xmm1, %xmm1, %xmm1
499 ; AVX512VPOPCNT-NEXT: vpsadbw %xmm1, %xmm0, %xmm0
500 ; AVX512VPOPCNT-NEXT: vmovd %xmm0, %eax
501 ; AVX512VPOPCNT-NEXT: vzeroupper
502 ; AVX512VPOPCNT-NEXT: retq
503 %p0 = tail call <8 x i32> @llvm.ctpop.v8i32(<8 x i32> %a0)
504 %r0 = tail call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %p0)
509 ; Vector of reductions of per-element ctpop results (create vector of each count all bits in each vector)
512 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 {
513 ; SSE42-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
515 ; SSE42-NEXT: movdqa %xmm0, %xmm8
516 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
517 ; SSE42-NEXT: movdqa %xmm1, %xmm0
518 ; SSE42-NEXT: pand %xmm10, %xmm0
519 ; SSE42-NEXT: movdqa {{.*#+}} xmm9 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
520 ; SSE42-NEXT: movdqa %xmm9, %xmm11
521 ; SSE42-NEXT: pshufb %xmm0, %xmm11
522 ; SSE42-NEXT: psrlw $4, %xmm1
523 ; SSE42-NEXT: pand %xmm10, %xmm1
524 ; SSE42-NEXT: movdqa %xmm9, %xmm12
525 ; SSE42-NEXT: pshufb %xmm1, %xmm12
526 ; SSE42-NEXT: paddb %xmm11, %xmm12
527 ; SSE42-NEXT: pxor %xmm11, %xmm11
528 ; SSE42-NEXT: psadbw %xmm11, %xmm12
529 ; SSE42-NEXT: movdqa %xmm8, %xmm0
530 ; SSE42-NEXT: pand %xmm10, %xmm0
531 ; SSE42-NEXT: movdqa %xmm9, %xmm1
532 ; SSE42-NEXT: pshufb %xmm0, %xmm1
533 ; SSE42-NEXT: psrlw $4, %xmm8
534 ; SSE42-NEXT: pand %xmm10, %xmm8
535 ; SSE42-NEXT: movdqa %xmm9, %xmm0
536 ; SSE42-NEXT: pshufb %xmm8, %xmm0
537 ; SSE42-NEXT: paddb %xmm1, %xmm0
538 ; SSE42-NEXT: psadbw %xmm11, %xmm0
539 ; SSE42-NEXT: paddq %xmm12, %xmm0
540 ; SSE42-NEXT: movdqa %xmm3, %xmm1
541 ; SSE42-NEXT: pand %xmm10, %xmm1
542 ; SSE42-NEXT: movdqa %xmm9, %xmm8
543 ; SSE42-NEXT: pshufb %xmm1, %xmm8
544 ; SSE42-NEXT: psrlw $4, %xmm3
545 ; SSE42-NEXT: pand %xmm10, %xmm3
546 ; SSE42-NEXT: movdqa %xmm9, %xmm1
547 ; SSE42-NEXT: pshufb %xmm3, %xmm1
548 ; SSE42-NEXT: paddb %xmm8, %xmm1
549 ; SSE42-NEXT: psadbw %xmm11, %xmm1
550 ; SSE42-NEXT: movdqa %xmm2, %xmm3
551 ; SSE42-NEXT: pand %xmm10, %xmm3
552 ; SSE42-NEXT: movdqa %xmm9, %xmm8
553 ; SSE42-NEXT: pshufb %xmm3, %xmm8
554 ; SSE42-NEXT: psrlw $4, %xmm2
555 ; SSE42-NEXT: pand %xmm10, %xmm2
556 ; SSE42-NEXT: movdqa %xmm9, %xmm3
557 ; SSE42-NEXT: pshufb %xmm2, %xmm3
558 ; SSE42-NEXT: paddb %xmm8, %xmm3
559 ; SSE42-NEXT: psadbw %xmm11, %xmm3
560 ; SSE42-NEXT: paddq %xmm1, %xmm3
561 ; SSE42-NEXT: movdqa %xmm5, %xmm1
562 ; SSE42-NEXT: pand %xmm10, %xmm1
563 ; SSE42-NEXT: movdqa %xmm9, %xmm2
564 ; SSE42-NEXT: pshufb %xmm1, %xmm2
565 ; SSE42-NEXT: psrlw $4, %xmm5
566 ; SSE42-NEXT: pand %xmm10, %xmm5
567 ; SSE42-NEXT: movdqa %xmm9, %xmm8
568 ; SSE42-NEXT: pshufb %xmm5, %xmm8
569 ; SSE42-NEXT: paddb %xmm2, %xmm8
570 ; SSE42-NEXT: psadbw %xmm11, %xmm8
571 ; SSE42-NEXT: movdqa %xmm4, %xmm1
572 ; SSE42-NEXT: pand %xmm10, %xmm1
573 ; SSE42-NEXT: movdqa %xmm9, %xmm2
574 ; SSE42-NEXT: pshufb %xmm1, %xmm2
575 ; SSE42-NEXT: psrlw $4, %xmm4
576 ; SSE42-NEXT: pand %xmm10, %xmm4
577 ; SSE42-NEXT: movdqa %xmm9, %xmm1
578 ; SSE42-NEXT: pshufb %xmm4, %xmm1
579 ; SSE42-NEXT: paddb %xmm2, %xmm1
580 ; SSE42-NEXT: psadbw %xmm11, %xmm1
581 ; SSE42-NEXT: paddq %xmm8, %xmm1
582 ; SSE42-NEXT: movdqa %xmm7, %xmm2
583 ; SSE42-NEXT: pand %xmm10, %xmm2
584 ; SSE42-NEXT: movdqa %xmm9, %xmm4
585 ; SSE42-NEXT: pshufb %xmm2, %xmm4
586 ; SSE42-NEXT: psrlw $4, %xmm7
587 ; SSE42-NEXT: pand %xmm10, %xmm7
588 ; SSE42-NEXT: movdqa %xmm9, %xmm2
589 ; SSE42-NEXT: pshufb %xmm7, %xmm2
590 ; SSE42-NEXT: paddb %xmm4, %xmm2
591 ; SSE42-NEXT: psadbw %xmm11, %xmm2
592 ; SSE42-NEXT: movdqa %xmm6, %xmm4
593 ; SSE42-NEXT: pand %xmm10, %xmm4
594 ; SSE42-NEXT: movdqa %xmm9, %xmm5
595 ; SSE42-NEXT: pshufb %xmm4, %xmm5
596 ; SSE42-NEXT: psrlw $4, %xmm6
597 ; SSE42-NEXT: pand %xmm10, %xmm6
598 ; SSE42-NEXT: pshufb %xmm6, %xmm9
599 ; SSE42-NEXT: paddb %xmm5, %xmm9
600 ; SSE42-NEXT: psadbw %xmm11, %xmm9
601 ; SSE42-NEXT: paddq %xmm2, %xmm9
602 ; SSE42-NEXT: movdqa %xmm0, %xmm2
603 ; SSE42-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm3[1]
604 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
605 ; SSE42-NEXT: paddq %xmm2, %xmm0
606 ; SSE42-NEXT: movdqa %xmm1, %xmm2
607 ; SSE42-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm9[1]
608 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm9[0]
609 ; SSE42-NEXT: paddq %xmm2, %xmm1
612 ; AVX2-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
614 ; 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]
615 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm5
616 ; 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]
617 ; AVX2-NEXT: # ymm6 = mem[0,1,0,1]
618 ; AVX2-NEXT: vpshufb %ymm5, %ymm6, %ymm5
619 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
620 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
621 ; AVX2-NEXT: vpshufb %ymm0, %ymm6, %ymm0
622 ; AVX2-NEXT: vpaddb %ymm5, %ymm0, %ymm0
623 ; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5
624 ; AVX2-NEXT: vpsadbw %ymm5, %ymm0, %ymm0
625 ; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm7
626 ; AVX2-NEXT: vpshufb %ymm7, %ymm6, %ymm7
627 ; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
628 ; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1
629 ; AVX2-NEXT: vpshufb %ymm1, %ymm6, %ymm1
630 ; AVX2-NEXT: vpaddb %ymm7, %ymm1, %ymm1
631 ; AVX2-NEXT: vpsadbw %ymm5, %ymm1, %ymm1
632 ; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm7
633 ; AVX2-NEXT: vpshufb %ymm7, %ymm6, %ymm7
634 ; AVX2-NEXT: vpsrlw $4, %ymm2, %ymm2
635 ; AVX2-NEXT: vpand %ymm4, %ymm2, %ymm2
636 ; AVX2-NEXT: vpshufb %ymm2, %ymm6, %ymm2
637 ; AVX2-NEXT: vpaddb %ymm7, %ymm2, %ymm2
638 ; AVX2-NEXT: vpsadbw %ymm5, %ymm2, %ymm2
639 ; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm7
640 ; AVX2-NEXT: vpshufb %ymm7, %ymm6, %ymm7
641 ; AVX2-NEXT: vpsrlw $4, %ymm3, %ymm3
642 ; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
643 ; AVX2-NEXT: vpshufb %ymm3, %ymm6, %ymm3
644 ; AVX2-NEXT: vpaddb %ymm7, %ymm3, %ymm3
645 ; AVX2-NEXT: vpsadbw %ymm5, %ymm3, %ymm3
646 ; AVX2-NEXT: vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
647 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
648 ; AVX2-NEXT: vpaddq %ymm4, %ymm1, %ymm1
649 ; AVX2-NEXT: vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
650 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
651 ; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0
652 ; AVX2-NEXT: vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
653 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
654 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
657 ; AVX512VL-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
659 ; 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]
660 ; AVX512VL-NEXT: vpand %ymm4, %ymm0, %ymm5
661 ; 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]
662 ; AVX512VL-NEXT: # ymm6 = mem[0,1,0,1]
663 ; AVX512VL-NEXT: vpshufb %ymm5, %ymm6, %ymm5
664 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0
665 ; AVX512VL-NEXT: vpand %ymm4, %ymm0, %ymm0
666 ; AVX512VL-NEXT: vpshufb %ymm0, %ymm6, %ymm0
667 ; AVX512VL-NEXT: vpaddb %ymm5, %ymm0, %ymm0
668 ; AVX512VL-NEXT: vpxor %xmm5, %xmm5, %xmm5
669 ; AVX512VL-NEXT: vpsadbw %ymm5, %ymm0, %ymm0
670 ; AVX512VL-NEXT: vpand %ymm4, %ymm1, %ymm7
671 ; AVX512VL-NEXT: vpshufb %ymm7, %ymm6, %ymm7
672 ; AVX512VL-NEXT: vpsrlw $4, %ymm1, %ymm1
673 ; AVX512VL-NEXT: vpand %ymm4, %ymm1, %ymm1
674 ; AVX512VL-NEXT: vpshufb %ymm1, %ymm6, %ymm1
675 ; AVX512VL-NEXT: vpaddb %ymm7, %ymm1, %ymm1
676 ; AVX512VL-NEXT: vpsadbw %ymm5, %ymm1, %ymm1
677 ; AVX512VL-NEXT: vpand %ymm4, %ymm2, %ymm7
678 ; AVX512VL-NEXT: vpshufb %ymm7, %ymm6, %ymm7
679 ; AVX512VL-NEXT: vpsrlw $4, %ymm2, %ymm2
680 ; AVX512VL-NEXT: vpand %ymm4, %ymm2, %ymm2
681 ; AVX512VL-NEXT: vpshufb %ymm2, %ymm6, %ymm2
682 ; AVX512VL-NEXT: vpaddb %ymm7, %ymm2, %ymm2
683 ; AVX512VL-NEXT: vpsadbw %ymm5, %ymm2, %ymm2
684 ; AVX512VL-NEXT: vpand %ymm4, %ymm3, %ymm7
685 ; AVX512VL-NEXT: vpshufb %ymm7, %ymm6, %ymm7
686 ; AVX512VL-NEXT: vpsrlw $4, %ymm3, %ymm3
687 ; AVX512VL-NEXT: vpand %ymm4, %ymm3, %ymm3
688 ; AVX512VL-NEXT: vpshufb %ymm3, %ymm6, %ymm3
689 ; AVX512VL-NEXT: vpaddb %ymm7, %ymm3, %ymm3
690 ; AVX512VL-NEXT: vpsadbw %ymm5, %ymm3, %ymm3
691 ; AVX512VL-NEXT: vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
692 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
693 ; AVX512VL-NEXT: vpaddq %ymm4, %ymm1, %ymm1
694 ; AVX512VL-NEXT: vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
695 ; AVX512VL-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
696 ; AVX512VL-NEXT: vpaddq %ymm3, %ymm0, %ymm0
697 ; AVX512VL-NEXT: vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
698 ; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
699 ; AVX512VL-NEXT: vpaddq %ymm2, %ymm0, %ymm0
700 ; AVX512VL-NEXT: retq
702 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64_buildvector_v4i64:
703 ; AVX512VPOPCNT: # %bb.0:
704 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm0, %ymm0
705 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm1, %ymm1
706 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm2, %ymm2
707 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm3, %ymm3
708 ; AVX512VPOPCNT-NEXT: vperm2i128 {{.*#+}} ymm4 = ymm1[2,3],ymm3[2,3]
709 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1
710 ; AVX512VPOPCNT-NEXT: vpaddq %ymm4, %ymm1, %ymm1
711 ; AVX512VPOPCNT-NEXT: vperm2i128 {{.*#+}} ymm3 = ymm0[2,3],ymm2[2,3]
712 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
713 ; AVX512VPOPCNT-NEXT: vpaddq %ymm3, %ymm0, %ymm0
714 ; AVX512VPOPCNT-NEXT: vpunpckhqdq {{.*#+}} ymm2 = ymm0[1],ymm1[1],ymm0[3],ymm1[3]
715 ; AVX512VPOPCNT-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[2],ymm1[2]
716 ; AVX512VPOPCNT-NEXT: vpaddq %ymm2, %ymm0, %ymm0
717 ; AVX512VPOPCNT-NEXT: retq
718 %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
719 %p1 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a1)
720 %p2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a2)
721 %p3 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a3)
722 %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
723 %r1 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p1)
724 %r2 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p2)
725 %r3 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p3)
726 %v0 = insertelement <4 x i64> undef, i64 %r0, i64 0
727 %v1 = insertelement <4 x i64> %v0, i64 %r1, i64 1
728 %v2 = insertelement <4 x i64> %v1, i64 %r2, i64 2
729 %v3 = insertelement <4 x i64> %v2, i64 %r3, i64 3
733 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 {
734 ; SSE42-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
736 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
737 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
738 ; SSE42-NEXT: movdqa {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
739 ; SSE42-NEXT: movdqa %xmm1, %xmm12
740 ; SSE42-NEXT: pand %xmm10, %xmm12
741 ; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
742 ; SSE42-NEXT: movdqa %xmm8, %xmm13
743 ; SSE42-NEXT: pshufb %xmm12, %xmm13
744 ; SSE42-NEXT: psrlw $4, %xmm1
745 ; SSE42-NEXT: pand %xmm10, %xmm1
746 ; SSE42-NEXT: movdqa %xmm8, %xmm12
747 ; SSE42-NEXT: pshufb %xmm1, %xmm12
748 ; SSE42-NEXT: paddb %xmm13, %xmm12
749 ; SSE42-NEXT: movdqa %xmm0, %xmm1
750 ; SSE42-NEXT: pand %xmm10, %xmm1
751 ; SSE42-NEXT: movdqa %xmm8, %xmm13
752 ; SSE42-NEXT: pshufb %xmm1, %xmm13
753 ; SSE42-NEXT: psrlw $4, %xmm0
754 ; SSE42-NEXT: pand %xmm10, %xmm0
755 ; SSE42-NEXT: movdqa %xmm8, %xmm1
756 ; SSE42-NEXT: pshufb %xmm0, %xmm1
757 ; SSE42-NEXT: pxor %xmm0, %xmm0
758 ; SSE42-NEXT: psadbw %xmm0, %xmm12
759 ; SSE42-NEXT: paddb %xmm13, %xmm1
760 ; SSE42-NEXT: psadbw %xmm0, %xmm1
761 ; SSE42-NEXT: paddq %xmm12, %xmm1
762 ; SSE42-NEXT: movdqa %xmm3, %xmm12
763 ; SSE42-NEXT: pand %xmm10, %xmm12
764 ; SSE42-NEXT: movdqa %xmm8, %xmm13
765 ; SSE42-NEXT: pshufb %xmm12, %xmm13
766 ; SSE42-NEXT: psrlw $4, %xmm3
767 ; SSE42-NEXT: pand %xmm10, %xmm3
768 ; SSE42-NEXT: movdqa %xmm8, %xmm14
769 ; SSE42-NEXT: pshufb %xmm3, %xmm14
770 ; SSE42-NEXT: paddb %xmm13, %xmm14
771 ; SSE42-NEXT: movdqa %xmm2, %xmm3
772 ; SSE42-NEXT: pand %xmm10, %xmm3
773 ; SSE42-NEXT: movdqa %xmm8, %xmm13
774 ; SSE42-NEXT: pshufb %xmm3, %xmm13
775 ; SSE42-NEXT: psrlw $4, %xmm2
776 ; SSE42-NEXT: pand %xmm10, %xmm2
777 ; SSE42-NEXT: movdqa %xmm8, %xmm3
778 ; SSE42-NEXT: pshufb %xmm2, %xmm3
779 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12
780 ; SSE42-NEXT: psadbw %xmm0, %xmm14
781 ; SSE42-NEXT: paddb %xmm13, %xmm3
782 ; SSE42-NEXT: psadbw %xmm0, %xmm3
783 ; SSE42-NEXT: paddq %xmm14, %xmm3
784 ; SSE42-NEXT: movdqa %xmm5, %xmm2
785 ; SSE42-NEXT: pand %xmm10, %xmm2
786 ; SSE42-NEXT: movdqa %xmm8, %xmm13
787 ; SSE42-NEXT: pshufb %xmm2, %xmm13
788 ; SSE42-NEXT: psrlw $4, %xmm5
789 ; SSE42-NEXT: pand %xmm10, %xmm5
790 ; SSE42-NEXT: movdqa %xmm8, %xmm14
791 ; SSE42-NEXT: pshufb %xmm5, %xmm14
792 ; SSE42-NEXT: paddb %xmm13, %xmm14
793 ; SSE42-NEXT: movdqa %xmm4, %xmm2
794 ; SSE42-NEXT: pand %xmm10, %xmm2
795 ; SSE42-NEXT: movdqa %xmm8, %xmm5
796 ; SSE42-NEXT: pshufb %xmm2, %xmm5
797 ; SSE42-NEXT: psrlw $4, %xmm4
798 ; SSE42-NEXT: pand %xmm10, %xmm4
799 ; SSE42-NEXT: movdqa %xmm8, %xmm2
800 ; SSE42-NEXT: pshufb %xmm4, %xmm2
801 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13
802 ; SSE42-NEXT: psadbw %xmm0, %xmm14
803 ; SSE42-NEXT: paddb %xmm5, %xmm2
804 ; SSE42-NEXT: psadbw %xmm0, %xmm2
805 ; SSE42-NEXT: paddq %xmm14, %xmm2
806 ; SSE42-NEXT: movdqa %xmm7, %xmm4
807 ; SSE42-NEXT: pand %xmm10, %xmm4
808 ; SSE42-NEXT: movdqa %xmm8, %xmm5
809 ; SSE42-NEXT: pshufb %xmm4, %xmm5
810 ; SSE42-NEXT: psrlw $4, %xmm7
811 ; SSE42-NEXT: pand %xmm10, %xmm7
812 ; SSE42-NEXT: movdqa %xmm8, %xmm14
813 ; SSE42-NEXT: pshufb %xmm7, %xmm14
814 ; SSE42-NEXT: paddb %xmm5, %xmm14
815 ; SSE42-NEXT: movdqa %xmm6, %xmm4
816 ; SSE42-NEXT: pand %xmm10, %xmm4
817 ; SSE42-NEXT: movdqa %xmm8, %xmm5
818 ; SSE42-NEXT: pshufb %xmm4, %xmm5
819 ; SSE42-NEXT: psrlw $4, %xmm6
820 ; SSE42-NEXT: pand %xmm10, %xmm6
821 ; SSE42-NEXT: movdqa %xmm8, %xmm4
822 ; SSE42-NEXT: pshufb %xmm6, %xmm4
823 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm6
824 ; SSE42-NEXT: psadbw %xmm0, %xmm14
825 ; SSE42-NEXT: paddb %xmm5, %xmm4
826 ; SSE42-NEXT: psadbw %xmm0, %xmm4
827 ; SSE42-NEXT: paddq %xmm14, %xmm4
828 ; SSE42-NEXT: movdqa %xmm6, %xmm5
829 ; SSE42-NEXT: pand %xmm10, %xmm5
830 ; SSE42-NEXT: movdqa %xmm8, %xmm7
831 ; SSE42-NEXT: pshufb %xmm5, %xmm7
832 ; SSE42-NEXT: psrlw $4, %xmm6
833 ; SSE42-NEXT: pand %xmm10, %xmm6
834 ; SSE42-NEXT: movdqa %xmm8, %xmm14
835 ; SSE42-NEXT: pshufb %xmm6, %xmm14
836 ; SSE42-NEXT: paddb %xmm7, %xmm14
837 ; SSE42-NEXT: movdqa %xmm13, %xmm5
838 ; SSE42-NEXT: pand %xmm10, %xmm5
839 ; SSE42-NEXT: movdqa %xmm8, %xmm6
840 ; SSE42-NEXT: pshufb %xmm5, %xmm6
841 ; SSE42-NEXT: psrlw $4, %xmm13
842 ; SSE42-NEXT: pand %xmm10, %xmm13
843 ; SSE42-NEXT: movdqa %xmm8, %xmm5
844 ; SSE42-NEXT: pshufb %xmm13, %xmm5
845 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm7
846 ; SSE42-NEXT: psadbw %xmm0, %xmm14
847 ; SSE42-NEXT: paddb %xmm6, %xmm5
848 ; SSE42-NEXT: psadbw %xmm0, %xmm5
849 ; SSE42-NEXT: paddq %xmm14, %xmm5
850 ; SSE42-NEXT: movdqa %xmm7, %xmm6
851 ; SSE42-NEXT: pand %xmm10, %xmm6
852 ; SSE42-NEXT: movdqa %xmm8, %xmm13
853 ; SSE42-NEXT: pshufb %xmm6, %xmm13
854 ; SSE42-NEXT: psrlw $4, %xmm7
855 ; SSE42-NEXT: pand %xmm10, %xmm7
856 ; SSE42-NEXT: movdqa %xmm8, %xmm14
857 ; SSE42-NEXT: pshufb %xmm7, %xmm14
858 ; SSE42-NEXT: paddb %xmm13, %xmm14
859 ; SSE42-NEXT: movdqa %xmm12, %xmm6
860 ; SSE42-NEXT: pand %xmm10, %xmm6
861 ; SSE42-NEXT: movdqa %xmm8, %xmm7
862 ; SSE42-NEXT: pshufb %xmm6, %xmm7
863 ; SSE42-NEXT: psrlw $4, %xmm12
864 ; SSE42-NEXT: pand %xmm10, %xmm12
865 ; SSE42-NEXT: movdqa %xmm8, %xmm6
866 ; SSE42-NEXT: pshufb %xmm12, %xmm6
867 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12
868 ; SSE42-NEXT: psadbw %xmm0, %xmm14
869 ; SSE42-NEXT: paddb %xmm7, %xmm6
870 ; SSE42-NEXT: psadbw %xmm0, %xmm6
871 ; SSE42-NEXT: paddq %xmm14, %xmm6
872 ; SSE42-NEXT: movdqa %xmm12, %xmm7
873 ; SSE42-NEXT: pand %xmm10, %xmm7
874 ; SSE42-NEXT: movdqa %xmm8, %xmm13
875 ; SSE42-NEXT: pshufb %xmm7, %xmm13
876 ; SSE42-NEXT: psrlw $4, %xmm12
877 ; SSE42-NEXT: pand %xmm10, %xmm12
878 ; SSE42-NEXT: movdqa %xmm8, %xmm14
879 ; SSE42-NEXT: pshufb %xmm12, %xmm14
880 ; SSE42-NEXT: paddb %xmm13, %xmm14
881 ; SSE42-NEXT: movdqa %xmm11, %xmm7
882 ; SSE42-NEXT: pand %xmm10, %xmm7
883 ; SSE42-NEXT: movdqa %xmm8, %xmm12
884 ; SSE42-NEXT: pshufb %xmm7, %xmm12
885 ; SSE42-NEXT: psrlw $4, %xmm11
886 ; SSE42-NEXT: pand %xmm10, %xmm11
887 ; SSE42-NEXT: movdqa %xmm8, %xmm7
888 ; SSE42-NEXT: pshufb %xmm11, %xmm7
889 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
890 ; SSE42-NEXT: psadbw %xmm0, %xmm14
891 ; SSE42-NEXT: paddb %xmm12, %xmm7
892 ; SSE42-NEXT: psadbw %xmm0, %xmm7
893 ; SSE42-NEXT: paddq %xmm14, %xmm7
894 ; SSE42-NEXT: movdqa %xmm11, %xmm12
895 ; SSE42-NEXT: pand %xmm10, %xmm12
896 ; SSE42-NEXT: movdqa %xmm8, %xmm13
897 ; SSE42-NEXT: pshufb %xmm12, %xmm13
898 ; SSE42-NEXT: psrlw $4, %xmm11
899 ; SSE42-NEXT: pand %xmm10, %xmm11
900 ; SSE42-NEXT: movdqa %xmm8, %xmm12
901 ; SSE42-NEXT: pshufb %xmm11, %xmm12
902 ; SSE42-NEXT: paddb %xmm13, %xmm12
903 ; SSE42-NEXT: movdqa %xmm9, %xmm11
904 ; SSE42-NEXT: pand %xmm10, %xmm11
905 ; SSE42-NEXT: movdqa %xmm8, %xmm13
906 ; SSE42-NEXT: pshufb %xmm11, %xmm13
907 ; SSE42-NEXT: psrlw $4, %xmm9
908 ; SSE42-NEXT: pand %xmm10, %xmm9
909 ; SSE42-NEXT: pshufb %xmm9, %xmm8
910 ; SSE42-NEXT: paddb %xmm13, %xmm8
911 ; SSE42-NEXT: psadbw %xmm0, %xmm12
912 ; SSE42-NEXT: psadbw %xmm0, %xmm8
913 ; SSE42-NEXT: paddq %xmm12, %xmm8
914 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
915 ; SSE42-NEXT: paddq %xmm1, %xmm0
916 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
917 ; SSE42-NEXT: paddq %xmm3, %xmm1
918 ; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
919 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
920 ; SSE42-NEXT: paddq %xmm2, %xmm1
921 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm4[2,3,2,3]
922 ; SSE42-NEXT: paddq %xmm4, %xmm2
923 ; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
924 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
925 ; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
926 ; SSE42-NEXT: paddq %xmm5, %xmm1
927 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm6[2,3,2,3]
928 ; SSE42-NEXT: paddq %xmm6, %xmm2
929 ; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
930 ; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm7[2,3,2,3]
931 ; SSE42-NEXT: paddq %xmm7, %xmm2
932 ; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm8[2,3,2,3]
933 ; SSE42-NEXT: paddq %xmm8, %xmm3
934 ; SSE42-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
935 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
938 ; AVX2-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
940 ; 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]
941 ; AVX2-NEXT: vpand %ymm0, %ymm8, %ymm10
942 ; 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]
943 ; AVX2-NEXT: # ymm9 = mem[0,1,0,1]
944 ; AVX2-NEXT: vpshufb %ymm10, %ymm9, %ymm10
945 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm0
946 ; AVX2-NEXT: vpand %ymm0, %ymm8, %ymm0
947 ; AVX2-NEXT: vpshufb %ymm0, %ymm9, %ymm0
948 ; AVX2-NEXT: vpaddb %ymm0, %ymm10, %ymm0
949 ; AVX2-NEXT: vpxor %xmm10, %xmm10, %xmm10
950 ; AVX2-NEXT: vpsadbw %ymm0, %ymm10, %ymm0
951 ; AVX2-NEXT: vpand %ymm1, %ymm8, %ymm11
952 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
953 ; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
954 ; AVX2-NEXT: vpand %ymm1, %ymm8, %ymm1
955 ; AVX2-NEXT: vpshufb %ymm1, %ymm9, %ymm1
956 ; AVX2-NEXT: vpaddb %ymm1, %ymm11, %ymm1
957 ; AVX2-NEXT: vpsadbw %ymm1, %ymm10, %ymm1
958 ; AVX2-NEXT: vpand %ymm2, %ymm8, %ymm11
959 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
960 ; AVX2-NEXT: vpsrlw $4, %ymm2, %ymm2
961 ; AVX2-NEXT: vpand %ymm2, %ymm8, %ymm2
962 ; AVX2-NEXT: vpshufb %ymm2, %ymm9, %ymm2
963 ; AVX2-NEXT: vpaddb %ymm2, %ymm11, %ymm2
964 ; AVX2-NEXT: vpsadbw %ymm2, %ymm10, %ymm2
965 ; AVX2-NEXT: vpand %ymm3, %ymm8, %ymm11
966 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
967 ; AVX2-NEXT: vpsrlw $4, %ymm3, %ymm3
968 ; AVX2-NEXT: vpand %ymm3, %ymm8, %ymm3
969 ; AVX2-NEXT: vpshufb %ymm3, %ymm9, %ymm3
970 ; AVX2-NEXT: vpaddb %ymm3, %ymm11, %ymm3
971 ; AVX2-NEXT: vpsadbw %ymm3, %ymm10, %ymm3
972 ; AVX2-NEXT: vpand %ymm4, %ymm8, %ymm11
973 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
974 ; AVX2-NEXT: vpsrlw $4, %ymm4, %ymm4
975 ; AVX2-NEXT: vpand %ymm4, %ymm8, %ymm4
976 ; AVX2-NEXT: vpshufb %ymm4, %ymm9, %ymm4
977 ; AVX2-NEXT: vpaddb %ymm4, %ymm11, %ymm4
978 ; AVX2-NEXT: vpsadbw %ymm4, %ymm10, %ymm4
979 ; AVX2-NEXT: vpand %ymm5, %ymm8, %ymm11
980 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
981 ; AVX2-NEXT: vpsrlw $4, %ymm5, %ymm5
982 ; AVX2-NEXT: vpand %ymm5, %ymm8, %ymm5
983 ; AVX2-NEXT: vpshufb %ymm5, %ymm9, %ymm5
984 ; AVX2-NEXT: vpaddb %ymm5, %ymm11, %ymm5
985 ; AVX2-NEXT: vpsadbw %ymm5, %ymm10, %ymm5
986 ; AVX2-NEXT: vpand %ymm6, %ymm8, %ymm11
987 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
988 ; AVX2-NEXT: vpsrlw $4, %ymm6, %ymm6
989 ; AVX2-NEXT: vpand %ymm6, %ymm8, %ymm6
990 ; AVX2-NEXT: vpshufb %ymm6, %ymm9, %ymm6
991 ; AVX2-NEXT: vpaddb %ymm6, %ymm11, %ymm6
992 ; AVX2-NEXT: vpsadbw %ymm6, %ymm10, %ymm6
993 ; AVX2-NEXT: vpand %ymm7, %ymm8, %ymm11
994 ; AVX2-NEXT: vpshufb %ymm11, %ymm9, %ymm11
995 ; AVX2-NEXT: vpsrlw $4, %ymm7, %ymm7
996 ; AVX2-NEXT: vpand %ymm7, %ymm8, %ymm7
997 ; AVX2-NEXT: vpshufb %ymm7, %ymm9, %ymm7
998 ; AVX2-NEXT: vpaddb %ymm7, %ymm11, %ymm7
999 ; AVX2-NEXT: vpsadbw %ymm7, %ymm10, %ymm7
1000 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm8
1001 ; AVX2-NEXT: vpaddq %xmm0, %xmm8, %xmm0
1002 ; AVX2-NEXT: vpshufd {{.*#+}} xmm8 = xmm0[2,3,2,3]
1003 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm9
1004 ; AVX2-NEXT: vpaddq %xmm1, %xmm9, %xmm1
1005 ; AVX2-NEXT: vpshufd {{.*#+}} xmm9 = xmm1[2,3,2,3]
1006 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm10
1007 ; AVX2-NEXT: vpaddq %xmm2, %xmm10, %xmm2
1008 ; AVX2-NEXT: vpshufd {{.*#+}} xmm10 = xmm2[2,3,2,3]
1009 ; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm11
1010 ; AVX2-NEXT: vpaddq %xmm3, %xmm11, %xmm3
1011 ; AVX2-NEXT: vpshufd {{.*#+}} xmm11 = xmm3[2,3,2,3]
1012 ; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm12
1013 ; AVX2-NEXT: vpaddq %xmm4, %xmm12, %xmm4
1014 ; AVX2-NEXT: vpshufd {{.*#+}} xmm12 = xmm4[2,3,2,3]
1015 ; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm13
1016 ; AVX2-NEXT: vpaddq %xmm5, %xmm13, %xmm5
1017 ; AVX2-NEXT: vpshufd {{.*#+}} xmm13 = xmm5[2,3,2,3]
1018 ; AVX2-NEXT: vextracti128 $1, %ymm6, %xmm14
1019 ; AVX2-NEXT: vpaddq %xmm6, %xmm14, %xmm6
1020 ; AVX2-NEXT: vpshufd {{.*#+}} xmm14 = xmm6[2,3,2,3]
1021 ; AVX2-NEXT: vextracti128 $1, %ymm7, %xmm15
1022 ; AVX2-NEXT: vpaddq %xmm7, %xmm15, %xmm7
1023 ; AVX2-NEXT: vpshufd {{.*#+}} xmm15 = xmm7[2,3,2,3]
1024 ; AVX2-NEXT: vpaddq %xmm0, %xmm8, %xmm0
1025 ; AVX2-NEXT: vpaddq %xmm1, %xmm9, %xmm1
1026 ; AVX2-NEXT: vmovd %xmm1, %eax
1027 ; AVX2-NEXT: vpaddq %xmm2, %xmm10, %xmm1
1028 ; AVX2-NEXT: vmovd %xmm1, %ecx
1029 ; AVX2-NEXT: vpaddq %xmm3, %xmm11, %xmm1
1030 ; AVX2-NEXT: vmovd %xmm1, %edx
1031 ; AVX2-NEXT: vpaddq %xmm4, %xmm12, %xmm1
1032 ; AVX2-NEXT: vpaddq %xmm5, %xmm13, %xmm2
1033 ; AVX2-NEXT: vmovd %xmm2, %esi
1034 ; AVX2-NEXT: vpaddq %xmm6, %xmm14, %xmm2
1035 ; AVX2-NEXT: vmovd %xmm2, %edi
1036 ; AVX2-NEXT: vpaddq %xmm7, %xmm15, %xmm2
1037 ; AVX2-NEXT: vmovd %xmm2, %r8d
1038 ; AVX2-NEXT: vpinsrd $1, %esi, %xmm1, %xmm1
1039 ; AVX2-NEXT: vpinsrd $2, %edi, %xmm1, %xmm1
1040 ; AVX2-NEXT: vpinsrd $3, %r8d, %xmm1, %xmm1
1041 ; AVX2-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0
1042 ; AVX2-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm0
1043 ; AVX2-NEXT: vpinsrd $3, %edx, %xmm0, %xmm0
1044 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1047 ; AVX512VL-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1048 ; AVX512VL: # %bb.0:
1049 ; 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]
1050 ; AVX512VL-NEXT: vpand %ymm0, %ymm8, %ymm9
1051 ; 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]
1052 ; AVX512VL-NEXT: # ymm10 = mem[0,1,0,1]
1053 ; AVX512VL-NEXT: vpshufb %ymm9, %ymm10, %ymm9
1054 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm0
1055 ; AVX512VL-NEXT: vpand %ymm0, %ymm8, %ymm0
1056 ; AVX512VL-NEXT: vpshufb %ymm0, %ymm10, %ymm0
1057 ; AVX512VL-NEXT: vpaddb %ymm0, %ymm9, %ymm9
1058 ; AVX512VL-NEXT: vpxor %xmm0, %xmm0, %xmm0
1059 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm9, %ymm9
1060 ; AVX512VL-NEXT: vpand %ymm1, %ymm8, %ymm11
1061 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1062 ; AVX512VL-NEXT: vpsrlw $4, %ymm1, %ymm1
1063 ; AVX512VL-NEXT: vpand %ymm1, %ymm8, %ymm1
1064 ; AVX512VL-NEXT: vpshufb %ymm1, %ymm10, %ymm1
1065 ; AVX512VL-NEXT: vpaddb %ymm1, %ymm11, %ymm1
1066 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm1, %ymm1
1067 ; AVX512VL-NEXT: vpand %ymm2, %ymm8, %ymm11
1068 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1069 ; AVX512VL-NEXT: vpsrlw $4, %ymm2, %ymm2
1070 ; AVX512VL-NEXT: vpand %ymm2, %ymm8, %ymm2
1071 ; AVX512VL-NEXT: vpshufb %ymm2, %ymm10, %ymm2
1072 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm11, %ymm2
1073 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm2, %ymm2
1074 ; AVX512VL-NEXT: vpand %ymm3, %ymm8, %ymm11
1075 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1076 ; AVX512VL-NEXT: vpsrlw $4, %ymm3, %ymm3
1077 ; AVX512VL-NEXT: vpand %ymm3, %ymm8, %ymm3
1078 ; AVX512VL-NEXT: vpshufb %ymm3, %ymm10, %ymm3
1079 ; AVX512VL-NEXT: vpaddb %ymm3, %ymm11, %ymm3
1080 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm3, %ymm3
1081 ; AVX512VL-NEXT: vpand %ymm4, %ymm8, %ymm11
1082 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1083 ; AVX512VL-NEXT: vpsrlw $4, %ymm4, %ymm4
1084 ; AVX512VL-NEXT: vpand %ymm4, %ymm8, %ymm4
1085 ; AVX512VL-NEXT: vpshufb %ymm4, %ymm10, %ymm4
1086 ; AVX512VL-NEXT: vpaddb %ymm4, %ymm11, %ymm4
1087 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm4, %ymm4
1088 ; AVX512VL-NEXT: vpand %ymm5, %ymm8, %ymm11
1089 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1090 ; AVX512VL-NEXT: vpsrlw $4, %ymm5, %ymm5
1091 ; AVX512VL-NEXT: vpand %ymm5, %ymm8, %ymm5
1092 ; AVX512VL-NEXT: vpshufb %ymm5, %ymm10, %ymm5
1093 ; AVX512VL-NEXT: vpaddb %ymm5, %ymm11, %ymm5
1094 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm5, %ymm5
1095 ; AVX512VL-NEXT: vpand %ymm6, %ymm8, %ymm11
1096 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1097 ; AVX512VL-NEXT: vpsrlw $4, %ymm6, %ymm6
1098 ; AVX512VL-NEXT: vpand %ymm6, %ymm8, %ymm6
1099 ; AVX512VL-NEXT: vpshufb %ymm6, %ymm10, %ymm6
1100 ; AVX512VL-NEXT: vpaddb %ymm6, %ymm11, %ymm6
1101 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm6, %ymm6
1102 ; AVX512VL-NEXT: vpand %ymm7, %ymm8, %ymm11
1103 ; AVX512VL-NEXT: vpshufb %ymm11, %ymm10, %ymm11
1104 ; AVX512VL-NEXT: vpsrlw $4, %ymm7, %ymm7
1105 ; AVX512VL-NEXT: vpand %ymm7, %ymm8, %ymm7
1106 ; AVX512VL-NEXT: vpshufb %ymm7, %ymm10, %ymm7
1107 ; AVX512VL-NEXT: vpaddb %ymm7, %ymm11, %ymm7
1108 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm7, %ymm7
1109 ; AVX512VL-NEXT: vpmovqb %ymm9, %xmm8
1110 ; AVX512VL-NEXT: vpxor %xmm9, %xmm9, %xmm9
1111 ; AVX512VL-NEXT: vpsadbw %xmm9, %xmm8, %xmm8
1112 ; AVX512VL-NEXT: vpmovqb %ymm1, %xmm1
1113 ; AVX512VL-NEXT: vpsadbw %xmm1, %xmm9, %xmm1
1114 ; AVX512VL-NEXT: vpmovqb %ymm2, %xmm2
1115 ; AVX512VL-NEXT: vpmovqb %ymm3, %xmm3
1116 ; AVX512VL-NEXT: vpmovqb %ymm4, %xmm4
1117 ; AVX512VL-NEXT: vpmovqb %ymm5, %xmm5
1118 ; AVX512VL-NEXT: vpmovqb %ymm6, %xmm6
1119 ; AVX512VL-NEXT: vpmovqb %ymm7, %xmm7
1120 ; AVX512VL-NEXT: vinserti128 $1, %xmm7, %ymm6, %ymm6
1121 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm6, %ymm6
1122 ; AVX512VL-NEXT: vinserti128 $1, %xmm5, %ymm4, %ymm4
1123 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm4, %ymm4
1124 ; AVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm5 = [0,4,8,12,0,4,8,12]
1125 ; AVX512VL-NEXT: # ymm5 = mem[0,1,0,1]
1126 ; AVX512VL-NEXT: vpermi2d %ymm6, %ymm4, %ymm5
1127 ; AVX512VL-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm8[0],xmm1[0],xmm8[1],xmm1[1]
1128 ; AVX512VL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2
1129 ; AVX512VL-NEXT: vpsadbw %ymm0, %ymm2, %ymm0
1130 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm2 = [0,4,0,4]
1131 ; AVX512VL-NEXT: vpermd %ymm0, %ymm2, %ymm0
1132 ; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1133 ; AVX512VL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm5[4,5,6,7]
1134 ; AVX512VL-NEXT: retq
1136 ; AVX512VPOPCNT-LABEL: reduce_ctpop_v4i64_buildvector_v8i32:
1137 ; AVX512VPOPCNT: # %bb.0:
1138 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm0, %ymm0
1139 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm1, %ymm1
1140 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm2, %ymm2
1141 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm3, %ymm3
1142 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm4, %ymm4
1143 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm5, %ymm5
1144 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm6, %ymm6
1145 ; AVX512VPOPCNT-NEXT: vpopcntq %ymm7, %ymm7
1146 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm0, %xmm0
1147 ; AVX512VPOPCNT-NEXT: vpxor %xmm8, %xmm8, %xmm8
1148 ; AVX512VPOPCNT-NEXT: vpsadbw %xmm0, %xmm8, %xmm0
1149 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm1, %xmm1
1150 ; AVX512VPOPCNT-NEXT: vpsadbw %xmm1, %xmm8, %xmm1
1151 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm2, %xmm2
1152 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm3, %xmm3
1153 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm4, %xmm4
1154 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm5, %xmm5
1155 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm6, %xmm6
1156 ; AVX512VPOPCNT-NEXT: vpmovqb %ymm7, %xmm7
1157 ; AVX512VPOPCNT-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1158 ; AVX512VPOPCNT-NEXT: vpbroadcastq {{.*#+}} xmm1 = [0,4,0,4]
1159 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2
1160 ; AVX512VPOPCNT-NEXT: vpxor %xmm3, %xmm3, %xmm3
1161 ; AVX512VPOPCNT-NEXT: vpsadbw %ymm3, %ymm2, %ymm2
1162 ; AVX512VPOPCNT-NEXT: vpermd %ymm2, %ymm1, %ymm1
1163 ; AVX512VPOPCNT-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
1164 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm7, %ymm6, %ymm1
1165 ; AVX512VPOPCNT-NEXT: vpsadbw %ymm3, %ymm1, %ymm1
1166 ; AVX512VPOPCNT-NEXT: vinserti128 $1, %xmm5, %ymm4, %ymm2
1167 ; AVX512VPOPCNT-NEXT: vpsadbw %ymm3, %ymm2, %ymm2
1168 ; AVX512VPOPCNT-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [0,4,8,12,0,4,8,12]
1169 ; AVX512VPOPCNT-NEXT: # ymm3 = mem[0,1,0,1]
1170 ; AVX512VPOPCNT-NEXT: vpermi2d %ymm1, %ymm2, %ymm3
1171 ; AVX512VPOPCNT-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm3[4,5,6,7]
1172 ; AVX512VPOPCNT-NEXT: retq
1173 %p0 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a0)
1174 %p1 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a1)
1175 %p2 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a2)
1176 %p3 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a3)
1177 %p4 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a4)
1178 %p5 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a5)
1179 %p6 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a6)
1180 %p7 = tail call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> %a7)
1181 %r0 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p0)
1182 %r1 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p1)
1183 %r2 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p2)
1184 %r3 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p3)
1185 %r4 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p4)
1186 %r5 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p5)
1187 %r6 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p6)
1188 %r7 = tail call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %p7)
1189 %t0 = trunc i64 %r0 to i32
1190 %t1 = trunc i64 %r1 to i32
1191 %t2 = trunc i64 %r2 to i32
1192 %t3 = trunc i64 %r3 to i32
1193 %t4 = trunc i64 %r4 to i32
1194 %t5 = trunc i64 %r5 to i32
1195 %t6 = trunc i64 %r6 to i32
1196 %t7 = trunc i64 %r7 to i32
1197 %v0 = insertelement <8 x i32> undef, i32 %t0, i64 0
1198 %v1 = insertelement <8 x i32> %v0, i32 %t1, i64 1
1199 %v2 = insertelement <8 x i32> %v1, i32 %t2, i64 2
1200 %v3 = insertelement <8 x i32> %v2, i32 %t3, i64 3
1201 %v4 = insertelement <8 x i32> %v3, i32 %t4, i64 4
1202 %v5 = insertelement <8 x i32> %v4, i32 %t5, i64 5
1203 %v6 = insertelement <8 x i32> %v5, i32 %t6, i64 6
1204 %v7 = insertelement <8 x i32> %v6, i32 %t7, i64 7
1208 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
1209 declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1210 declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1211 declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
1212 declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
1213 declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
1215 declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)
1216 declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)
1217 declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)
1218 declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)
1219 declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)
1220 declare i8 @llvm.vector.reduce.add.v16i8(<16 x i8>)