xref: /llvm-project/llvm/test/CodeGen/X86/vector-reduce-ctpop.ll (revision 066773c4117512a76e127741631630fef57caf14)
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
6
7
8;
9; Reductions of per-element ctpop results (count all bits in a vector)
10;
11
12define 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
31;
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
48;
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
65;
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
76}
77
78define 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
103;
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
126;
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
147;
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
159}
160
161define 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
184;
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
204;
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
224;
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
239}
240
241define 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
261;
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
279;
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
297;
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
314}
315
316define 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
345;
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
366;
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
386;
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
399}
400
401define 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
441;
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
468;
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
492;
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
505}
506
507define 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
556;
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
584;
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
604;
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
617}
618
619define 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
689;
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
728;
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
754;
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
769}
770
771define 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
860;
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
902;
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
933;
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
951}
952
953;
954; Vector of reductions of per-element ctpop results (create vector of each count all bits in each vector)
955;
956
957define <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
1052;
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
1097;
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
1142;
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
1172}
1173
1174define <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
1370;
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
1479;
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
1567;
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
1637}
1638
1639declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
1640declare <4 x i64> @llvm.ctpop.v4i64(<4 x i64>)
1641declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)
1642declare <8 x i32> @llvm.ctpop.v8i32(<8 x i32>)
1643declare <8 x i16> @llvm.ctpop.v8i16(<8 x i16>)
1644declare <16 x i8> @llvm.ctpop.v16i8(<16 x i8>)
1645
1646declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)
1647declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)
1648declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)
1649declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)
1650declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)
1651declare i8  @llvm.vector.reduce.add.v16i8(<16 x i8>)
1652