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