brintos

brintos / llvm-project-archived public Read only

0
0
Text · 50.5 KiB · 3d85d55 Raw
1317 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1,AVX1-SLOW5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fast-hops | FileCheck %s --check-prefixes=AVX,AVX1,AVX1-FAST6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL9 10;11; vXi6412;13 14define i64 @test_v2i64_v2i32(<2 x i64> %a0) {15; SSE2-LABEL: test_v2i64_v2i32:16; SSE2:       # %bb.0:17; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm018; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]19; SSE2-NEXT:    paddq %xmm0, %xmm120; SSE2-NEXT:    movq %xmm1, %rax21; SSE2-NEXT:    retq22;23; SSE41-LABEL: test_v2i64_v2i32:24; SSE41:       # %bb.0:25; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm026; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]27; SSE41-NEXT:    paddq %xmm0, %xmm128; SSE41-NEXT:    movq %xmm1, %rax29; SSE41-NEXT:    retq30;31; AVX1-LABEL: test_v2i64_v2i32:32; AVX1:       # %bb.0:33; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm034; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]35; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm036; AVX1-NEXT:    vmovq %xmm0, %rax37; AVX1-NEXT:    retq38;39; AVX2-LABEL: test_v2i64_v2i32:40; AVX2:       # %bb.0:41; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm042; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]43; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm044; AVX2-NEXT:    vmovq %xmm0, %rax45; AVX2-NEXT:    retq46;47; AVX512BW-LABEL: test_v2i64_v2i32:48; AVX512BW:       # %bb.0:49; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm050; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]51; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm052; AVX512BW-NEXT:    vmovq %xmm0, %rax53; AVX512BW-NEXT:    retq54;55; AVX512BWVL-LABEL: test_v2i64_v2i32:56; AVX512BWVL:       # %bb.0:57; AVX512BWVL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm058; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]59; AVX512BWVL-NEXT:    vpaddq %xmm1, %xmm0, %xmm060; AVX512BWVL-NEXT:    vmovq %xmm0, %rax61; AVX512BWVL-NEXT:    retq62  %1 = and <2 x i64> %a0, <i64 255, i64 255>63  %2 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %1)64  ret i64 %265}66 67define i64 @test_v4i64_v4i16(<4 x i64> %a0) {68; SSE2-LABEL: test_v4i64_v4i16:69; SSE2:       # %bb.0:70; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm171; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm072; SSE2-NEXT:    paddq %xmm1, %xmm073; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]74; SSE2-NEXT:    paddq %xmm0, %xmm175; SSE2-NEXT:    movq %xmm1, %rax76; SSE2-NEXT:    retq77;78; SSE41-LABEL: test_v4i64_v4i16:79; SSE41:       # %bb.0:80; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm181; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm082; SSE41-NEXT:    paddq %xmm1, %xmm083; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]84; SSE41-NEXT:    paddq %xmm0, %xmm185; SSE41-NEXT:    movq %xmm1, %rax86; SSE41-NEXT:    retq87;88; AVX1-LABEL: test_v4i64_v4i16:89; AVX1:       # %bb.0:90; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm091; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm192; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm093; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]94; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm095; AVX1-NEXT:    vmovq %xmm0, %rax96; AVX1-NEXT:    vzeroupper97; AVX1-NEXT:    retq98;99; AVX2-LABEL: test_v4i64_v4i16:100; AVX2:       # %bb.0:101; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0102; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1103; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0104; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]105; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0106; AVX2-NEXT:    vmovq %xmm0, %rax107; AVX2-NEXT:    vzeroupper108; AVX2-NEXT:    retq109;110; AVX512BW-LABEL: test_v4i64_v4i16:111; AVX512BW:       # %bb.0:112; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0113; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0114; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1115; AVX512BW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]116; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1117; AVX512BW-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0118; AVX512BW-NEXT:    vmovq %xmm0, %rax119; AVX512BW-NEXT:    vzeroupper120; AVX512BW-NEXT:    retq121;122; AVX512BWVL-LABEL: test_v4i64_v4i16:123; AVX512BWVL:       # %bb.0:124; AVX512BWVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0125; AVX512BWVL-NEXT:    vpmovqb %ymm0, %xmm0126; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1127; AVX512BWVL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0128; AVX512BWVL-NEXT:    vmovq %xmm0, %rax129; AVX512BWVL-NEXT:    vzeroupper130; AVX512BWVL-NEXT:    retq131  %1 = and <4 x i64> %a0, <i64 15, i64 31, i64 63, i64 127>132  %2 = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %1)133  ret i64 %2134}135 136define i64 @test_v8i64_v8i8(<8 x i64> %a0) {137; SSE2-LABEL: test_v8i64_v8i8:138; SSE2:       # %bb.0:139; SSE2-NEXT:    psrlq $60, %xmm2140; SSE2-NEXT:    psrlq $60, %xmm0141; SSE2-NEXT:    paddq %xmm2, %xmm0142; SSE2-NEXT:    psrlq $60, %xmm3143; SSE2-NEXT:    psrlq $60, %xmm1144; SSE2-NEXT:    paddq %xmm3, %xmm1145; SSE2-NEXT:    paddq %xmm0, %xmm1146; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]147; SSE2-NEXT:    paddq %xmm1, %xmm0148; SSE2-NEXT:    movq %xmm0, %rax149; SSE2-NEXT:    retq150;151; SSE41-LABEL: test_v8i64_v8i8:152; SSE41:       # %bb.0:153; SSE41-NEXT:    psrlq $60, %xmm2154; SSE41-NEXT:    psrlq $60, %xmm0155; SSE41-NEXT:    paddq %xmm2, %xmm0156; SSE41-NEXT:    psrlq $60, %xmm3157; SSE41-NEXT:    psrlq $60, %xmm1158; SSE41-NEXT:    paddq %xmm3, %xmm1159; SSE41-NEXT:    paddq %xmm0, %xmm1160; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]161; SSE41-NEXT:    paddq %xmm1, %xmm0162; SSE41-NEXT:    movq %xmm0, %rax163; SSE41-NEXT:    retq164;165; AVX1-LABEL: test_v8i64_v8i8:166; AVX1:       # %bb.0:167; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm2168; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm3169; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2170; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1171; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm1172; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0173; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm0174; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0175; AVX1-NEXT:    vpaddq %xmm0, %xmm2, %xmm0176; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]177; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0178; AVX1-NEXT:    vmovq %xmm0, %rax179; AVX1-NEXT:    vzeroupper180; AVX1-NEXT:    retq181;182; AVX2-LABEL: test_v8i64_v8i8:183; AVX2:       # %bb.0:184; AVX2-NEXT:    vpsrlq $60, %ymm1, %ymm1185; AVX2-NEXT:    vpsrlq $60, %ymm0, %ymm0186; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0187; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1188; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0189; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]190; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0191; AVX2-NEXT:    vmovq %xmm0, %rax192; AVX2-NEXT:    vzeroupper193; AVX2-NEXT:    retq194;195; AVX512-LABEL: test_v8i64_v8i8:196; AVX512:       # %bb.0:197; AVX512-NEXT:    vpsrlq $60, %zmm0, %zmm0198; AVX512-NEXT:    vpmovqb %zmm0, %xmm0199; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1200; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0201; AVX512-NEXT:    vmovq %xmm0, %rax202; AVX512-NEXT:    vzeroupper203; AVX512-NEXT:    retq204  %1 = lshr <8 x i64> %a0, <i64 60, i64 60, i64 60, i64 60, i64 60, i64 60, i64 60, i64 60>205  %2 = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %1)206  ret i64 %2207}208 209define i64 @test_v16i64_v16i8(<16 x i64> %a0) {210; SSE2-LABEL: test_v16i64_v16i8:211; SSE2:       # %bb.0:212; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [1,1]213; SSE2-NEXT:    pand %xmm8, %xmm5214; SSE2-NEXT:    pand %xmm8, %xmm1215; SSE2-NEXT:    paddq %xmm5, %xmm1216; SSE2-NEXT:    pand %xmm8, %xmm7217; SSE2-NEXT:    pand %xmm8, %xmm3218; SSE2-NEXT:    paddq %xmm7, %xmm3219; SSE2-NEXT:    paddq %xmm1, %xmm3220; SSE2-NEXT:    pand %xmm8, %xmm4221; SSE2-NEXT:    pand %xmm8, %xmm0222; SSE2-NEXT:    paddq %xmm4, %xmm0223; SSE2-NEXT:    pand %xmm8, %xmm6224; SSE2-NEXT:    pand %xmm8, %xmm2225; SSE2-NEXT:    paddq %xmm6, %xmm2226; SSE2-NEXT:    paddq %xmm0, %xmm2227; SSE2-NEXT:    paddq %xmm3, %xmm2228; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]229; SSE2-NEXT:    paddq %xmm2, %xmm0230; SSE2-NEXT:    movq %xmm0, %rax231; SSE2-NEXT:    retq232;233; SSE41-LABEL: test_v16i64_v16i8:234; SSE41:       # %bb.0:235; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm8 = [1,1]236; SSE41-NEXT:    pand %xmm8, %xmm5237; SSE41-NEXT:    pand %xmm8, %xmm1238; SSE41-NEXT:    paddq %xmm5, %xmm1239; SSE41-NEXT:    pand %xmm8, %xmm7240; SSE41-NEXT:    pand %xmm8, %xmm3241; SSE41-NEXT:    paddq %xmm7, %xmm3242; SSE41-NEXT:    paddq %xmm1, %xmm3243; SSE41-NEXT:    pand %xmm8, %xmm4244; SSE41-NEXT:    pand %xmm8, %xmm0245; SSE41-NEXT:    paddq %xmm4, %xmm0246; SSE41-NEXT:    pand %xmm8, %xmm6247; SSE41-NEXT:    pand %xmm8, %xmm2248; SSE41-NEXT:    paddq %xmm6, %xmm2249; SSE41-NEXT:    paddq %xmm0, %xmm2250; SSE41-NEXT:    paddq %xmm3, %xmm2251; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]252; SSE41-NEXT:    paddq %xmm2, %xmm0253; SSE41-NEXT:    movq %xmm0, %rax254; SSE41-NEXT:    retq255;256; AVX1-LABEL: test_v16i64_v16i8:257; AVX1:       # %bb.0:258; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [1,1,1,1]259; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0260; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2261; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1262; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3263; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm4264; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm5265; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4266; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3267; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1268; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1269; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2270; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0271; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0272; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0273; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0274; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]275; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0276; AVX1-NEXT:    vmovq %xmm0, %rax277; AVX1-NEXT:    vzeroupper278; AVX1-NEXT:    retq279;280; AVX2-LABEL: test_v16i64_v16i8:281; AVX2:       # %bb.0:282; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [1,1,1,1]283; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2284; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0285; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0286; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm2287; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1288; AVX2-NEXT:    vpaddq %ymm2, %ymm1, %ymm1289; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0290; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1291; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0292; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]293; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0294; AVX2-NEXT:    vmovq %xmm0, %rax295; AVX2-NEXT:    vzeroupper296; AVX2-NEXT:    retq297;298; AVX512BW-LABEL: test_v16i64_v16i8:299; AVX512BW:       # %bb.0:300; AVX512BW-NEXT:    vpmovqb %zmm1, %xmm1301; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0302; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]303; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0304; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1305; AVX512BW-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0306; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]307; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm0308; AVX512BW-NEXT:    vmovq %xmm0, %rax309; AVX512BW-NEXT:    vzeroupper310; AVX512BW-NEXT:    retq311;312; AVX512BWVL-LABEL: test_v16i64_v16i8:313; AVX512BWVL:       # %bb.0:314; AVX512BWVL-NEXT:    vpmovqb %zmm1, %xmm1315; AVX512BWVL-NEXT:    vpmovqb %zmm0, %xmm0316; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]317; AVX512BWVL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0318; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1319; AVX512BWVL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0320; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]321; AVX512BWVL-NEXT:    vpaddq %xmm1, %xmm0, %xmm0322; AVX512BWVL-NEXT:    vmovq %xmm0, %rax323; AVX512BWVL-NEXT:    vzeroupper324; AVX512BWVL-NEXT:    retq325  %1 = and <16 x i64> %a0, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>326  %2 = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> %1)327  ret i64 %2328}329 330;331; vXi32332;333 334define i32 @test_v2i32_v2i16(<2 x i32> %a0) {335; SSE2-LABEL: test_v2i32_v2i16:336; SSE2:       # %bb.0:337; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0338; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]339; SSE2-NEXT:    paddd %xmm0, %xmm1340; SSE2-NEXT:    movd %xmm1, %eax341; SSE2-NEXT:    retq342;343; SSE41-LABEL: test_v2i32_v2i16:344; SSE41:       # %bb.0:345; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0346; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]347; SSE41-NEXT:    paddd %xmm0, %xmm1348; SSE41-NEXT:    movd %xmm1, %eax349; SSE41-NEXT:    retq350;351; AVX1-SLOW-LABEL: test_v2i32_v2i16:352; AVX1-SLOW:       # %bb.0:353; AVX1-SLOW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0354; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]355; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0356; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax357; AVX1-SLOW-NEXT:    retq358;359; AVX1-FAST-LABEL: test_v2i32_v2i16:360; AVX1-FAST:       # %bb.0:361; AVX1-FAST-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0362; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0363; AVX1-FAST-NEXT:    vmovd %xmm0, %eax364; AVX1-FAST-NEXT:    retq365;366; AVX2-LABEL: test_v2i32_v2i16:367; AVX2:       # %bb.0:368; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0369; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]370; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0371; AVX2-NEXT:    vmovd %xmm0, %eax372; AVX2-NEXT:    retq373;374; AVX512-LABEL: test_v2i32_v2i16:375; AVX512:       # %bb.0:376; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0377; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]378; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0379; AVX512-NEXT:    vmovd %xmm0, %eax380; AVX512-NEXT:    retq381  %1 = and <2 x i32> %a0, <i32 255, i32 255>382  %2 = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %1)383  ret i32 %2384}385 386define i32 @test_v4i32(<4 x i32> %a0) {387; SSE2-LABEL: test_v4i32:388; SSE2:       # %bb.0:389; SSE2-NEXT:    psrld $31, %xmm0390; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]391; SSE2-NEXT:    paddd %xmm0, %xmm1392; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]393; SSE2-NEXT:    paddd %xmm1, %xmm0394; SSE2-NEXT:    movd %xmm0, %eax395; SSE2-NEXT:    retq396;397; SSE41-LABEL: test_v4i32:398; SSE41:       # %bb.0:399; SSE41-NEXT:    psrld $31, %xmm0400; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]401; SSE41-NEXT:    paddd %xmm0, %xmm1402; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]403; SSE41-NEXT:    paddd %xmm1, %xmm0404; SSE41-NEXT:    movd %xmm0, %eax405; SSE41-NEXT:    retq406;407; AVX1-SLOW-LABEL: test_v4i32:408; AVX1-SLOW:       # %bb.0:409; AVX1-SLOW-NEXT:    vpsrld $31, %xmm0, %xmm0410; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]411; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0412; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]413; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0414; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax415; AVX1-SLOW-NEXT:    retq416;417; AVX1-FAST-LABEL: test_v4i32:418; AVX1-FAST:       # %bb.0:419; AVX1-FAST-NEXT:    vpsrld $31, %xmm0, %xmm0420; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0421; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0422; AVX1-FAST-NEXT:    vmovd %xmm0, %eax423; AVX1-FAST-NEXT:    retq424;425; AVX2-LABEL: test_v4i32:426; AVX2:       # %bb.0:427; AVX2-NEXT:    vpsrld $31, %xmm0, %xmm0428; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]429; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0430; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]431; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0432; AVX2-NEXT:    vmovd %xmm0, %eax433; AVX2-NEXT:    retq434;435; AVX512BW-LABEL: test_v4i32:436; AVX512BW:       # %bb.0:437; AVX512BW-NEXT:    vpsrld $31, %xmm0, %xmm0438; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero439; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1440; AVX512BW-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0441; AVX512BW-NEXT:    vmovd %xmm0, %eax442; AVX512BW-NEXT:    retq443;444; AVX512BWVL-LABEL: test_v4i32:445; AVX512BWVL:       # %bb.0:446; AVX512BWVL-NEXT:    vpsrld $31, %xmm0, %xmm0447; AVX512BWVL-NEXT:    vpmovdb %xmm0, %xmm0448; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1449; AVX512BWVL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0450; AVX512BWVL-NEXT:    vmovd %xmm0, %eax451; AVX512BWVL-NEXT:    retq452  %1 = lshr <4 x i32> %a0, <i32 31, i32 31, i32 31, i32 31>453  %2 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %1)454  ret i32 %2455}456 457define i32 @test_v8i32_v8i8(<8 x i32> %a0) {458; SSE2-LABEL: test_v8i32_v8i8:459; SSE2:       # %bb.0:460; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1461; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0462; SSE2-NEXT:    por %xmm1, %xmm0463; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]464; SSE2-NEXT:    paddd %xmm0, %xmm1465; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]466; SSE2-NEXT:    paddd %xmm1, %xmm0467; SSE2-NEXT:    movd %xmm0, %eax468; SSE2-NEXT:    retq469;470; SSE41-LABEL: test_v8i32_v8i8:471; SSE41:       # %bb.0:472; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1473; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0474; SSE41-NEXT:    por %xmm1, %xmm0475; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]476; SSE41-NEXT:    paddd %xmm0, %xmm1477; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]478; SSE41-NEXT:    paddd %xmm1, %xmm0479; SSE41-NEXT:    movd %xmm0, %eax480; SSE41-NEXT:    retq481;482; AVX1-SLOW-LABEL: test_v8i32_v8i8:483; AVX1-SLOW:       # %bb.0:484; AVX1-SLOW-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0485; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1486; AVX1-SLOW-NEXT:    vorps %xmm1, %xmm0, %xmm0487; AVX1-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]488; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0489; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]490; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0491; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax492; AVX1-SLOW-NEXT:    vzeroupper493; AVX1-SLOW-NEXT:    retq494;495; AVX1-FAST-LABEL: test_v8i32_v8i8:496; AVX1-FAST:       # %bb.0:497; AVX1-FAST-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0498; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1499; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm1, %xmm0500; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0501; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0502; AVX1-FAST-NEXT:    vmovd %xmm0, %eax503; AVX1-FAST-NEXT:    vzeroupper504; AVX1-FAST-NEXT:    retq505;506; AVX2-LABEL: test_v8i32_v8i8:507; AVX2:       # %bb.0:508; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0509; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1510; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0511; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]512; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0513; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]514; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0515; AVX2-NEXT:    vmovd %xmm0, %eax516; AVX2-NEXT:    vzeroupper517; AVX2-NEXT:    retq518;519; AVX512BW-LABEL: test_v8i32_v8i8:520; AVX512BW:       # %bb.0:521; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0522; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0523; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1524; AVX512BW-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0525; AVX512BW-NEXT:    vmovd %xmm0, %eax526; AVX512BW-NEXT:    vzeroupper527; AVX512BW-NEXT:    retq528;529; AVX512BWVL-LABEL: test_v8i32_v8i8:530; AVX512BWVL:       # %bb.0:531; AVX512BWVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0532; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0533; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1534; AVX512BWVL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0535; AVX512BWVL-NEXT:    vmovd %xmm0, %eax536; AVX512BWVL-NEXT:    vzeroupper537; AVX512BWVL-NEXT:    retq538  %1 = and <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 4, i32 8, i32 16, i32 32, i32 64>539  %2 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %1)540  ret i32 %2541}542 543define i32 @test_v16i32_v16i8(<16 x i32> %a0) {544; SSE2-LABEL: test_v16i32_v16i8:545; SSE2:       # %bb.0:546; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]547; SSE2-NEXT:    pand %xmm4, %xmm2548; SSE2-NEXT:    pand %xmm4, %xmm0549; SSE2-NEXT:    paddd %xmm2, %xmm0550; SSE2-NEXT:    pand %xmm4, %xmm3551; SSE2-NEXT:    pand %xmm4, %xmm1552; SSE2-NEXT:    paddd %xmm3, %xmm1553; SSE2-NEXT:    paddd %xmm0, %xmm1554; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]555; SSE2-NEXT:    paddd %xmm1, %xmm0556; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]557; SSE2-NEXT:    paddd %xmm0, %xmm1558; SSE2-NEXT:    movd %xmm1, %eax559; SSE2-NEXT:    retq560;561; SSE41-LABEL: test_v16i32_v16i8:562; SSE41:       # %bb.0:563; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = [255,255,255,255]564; SSE41-NEXT:    pand %xmm4, %xmm2565; SSE41-NEXT:    pand %xmm4, %xmm0566; SSE41-NEXT:    paddd %xmm2, %xmm0567; SSE41-NEXT:    pand %xmm4, %xmm3568; SSE41-NEXT:    pand %xmm4, %xmm1569; SSE41-NEXT:    paddd %xmm3, %xmm1570; SSE41-NEXT:    paddd %xmm0, %xmm1571; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]572; SSE41-NEXT:    paddd %xmm1, %xmm0573; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]574; SSE41-NEXT:    paddd %xmm0, %xmm1575; SSE41-NEXT:    movd %xmm1, %eax576; SSE41-NEXT:    retq577;578; AVX1-SLOW-LABEL: test_v16i32_v16i8:579; AVX1-SLOW:       # %bb.0:580; AVX1-SLOW-NEXT:    vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]581; AVX1-SLOW-NEXT:    vandps %ymm2, %ymm0, %ymm0582; AVX1-SLOW-NEXT:    vandps %ymm2, %ymm1, %ymm1583; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2584; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3585; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm3, %xmm2586; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0587; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0588; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]589; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0590; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]591; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0592; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax593; AVX1-SLOW-NEXT:    vzeroupper594; AVX1-SLOW-NEXT:    retq595;596; AVX1-FAST-LABEL: test_v16i32_v16i8:597; AVX1-FAST:       # %bb.0:598; AVX1-FAST-NEXT:    vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]599; AVX1-FAST-NEXT:    vandps %ymm2, %ymm0, %ymm0600; AVX1-FAST-NEXT:    vandps %ymm2, %ymm1, %ymm1601; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm2602; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm3603; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm3, %xmm2604; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0605; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0606; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]607; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0608; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0609; AVX1-FAST-NEXT:    vmovd %xmm0, %eax610; AVX1-FAST-NEXT:    vzeroupper611; AVX1-FAST-NEXT:    retq612;613; AVX2-LABEL: test_v16i32_v16i8:614; AVX2:       # %bb.0:615; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]616; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1617; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0618; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0619; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1620; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0621; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]622; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0623; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]624; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0625; AVX2-NEXT:    vmovd %xmm0, %eax626; AVX2-NEXT:    vzeroupper627; AVX2-NEXT:    retq628;629; AVX512-LABEL: test_v16i32_v16i8:630; AVX512:       # %bb.0:631; AVX512-NEXT:    vpmovdb %zmm0, %xmm0632; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1633; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0634; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]635; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0636; AVX512-NEXT:    vmovd %xmm0, %eax637; AVX512-NEXT:    vzeroupper638; AVX512-NEXT:    retq639  %1 = and <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>640  %2 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %1)641  ret i32 %2642}643 644define i32 @test_v32i32_v32i8(<32 x i32> %a0) {645; SSE2-LABEL: test_v32i32_v32i8:646; SSE2:       # %bb.0:647; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]648; SSE2-NEXT:    pand %xmm8, %xmm5649; SSE2-NEXT:    pand %xmm8, %xmm1650; SSE2-NEXT:    paddd %xmm5, %xmm1651; SSE2-NEXT:    pand %xmm8, %xmm7652; SSE2-NEXT:    pand %xmm8, %xmm3653; SSE2-NEXT:    paddd %xmm7, %xmm3654; SSE2-NEXT:    paddd %xmm1, %xmm3655; SSE2-NEXT:    pand %xmm8, %xmm4656; SSE2-NEXT:    pand %xmm8, %xmm0657; SSE2-NEXT:    paddd %xmm4, %xmm0658; SSE2-NEXT:    pand %xmm8, %xmm6659; SSE2-NEXT:    pand %xmm8, %xmm2660; SSE2-NEXT:    paddd %xmm6, %xmm2661; SSE2-NEXT:    paddd %xmm0, %xmm2662; SSE2-NEXT:    paddd %xmm3, %xmm2663; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]664; SSE2-NEXT:    paddd %xmm2, %xmm0665; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]666; SSE2-NEXT:    paddd %xmm0, %xmm1667; SSE2-NEXT:    movd %xmm1, %eax668; SSE2-NEXT:    retq669;670; SSE41-LABEL: test_v32i32_v32i8:671; SSE41:       # %bb.0:672; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm8 = [255,255,255,255]673; SSE41-NEXT:    pand %xmm8, %xmm5674; SSE41-NEXT:    pand %xmm8, %xmm1675; SSE41-NEXT:    paddd %xmm5, %xmm1676; SSE41-NEXT:    pand %xmm8, %xmm7677; SSE41-NEXT:    pand %xmm8, %xmm3678; SSE41-NEXT:    paddd %xmm7, %xmm3679; SSE41-NEXT:    paddd %xmm1, %xmm3680; SSE41-NEXT:    pand %xmm8, %xmm4681; SSE41-NEXT:    pand %xmm8, %xmm0682; SSE41-NEXT:    paddd %xmm4, %xmm0683; SSE41-NEXT:    pand %xmm8, %xmm6684; SSE41-NEXT:    pand %xmm8, %xmm2685; SSE41-NEXT:    paddd %xmm6, %xmm2686; SSE41-NEXT:    paddd %xmm0, %xmm2687; SSE41-NEXT:    paddd %xmm3, %xmm2688; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]689; SSE41-NEXT:    paddd %xmm2, %xmm0690; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]691; SSE41-NEXT:    paddd %xmm0, %xmm1692; SSE41-NEXT:    movd %xmm1, %eax693; SSE41-NEXT:    retq694;695; AVX1-SLOW-LABEL: test_v32i32_v32i8:696; AVX1-SLOW:       # %bb.0:697; AVX1-SLOW-NEXT:    vbroadcastss {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255]698; AVX1-SLOW-NEXT:    vandps %ymm4, %ymm0, %ymm0699; AVX1-SLOW-NEXT:    vandps %ymm4, %ymm2, %ymm2700; AVX1-SLOW-NEXT:    vandps %ymm4, %ymm1, %ymm1701; AVX1-SLOW-NEXT:    vandps %ymm4, %ymm3, %ymm3702; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm1, %xmm4703; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm5704; AVX1-SLOW-NEXT:    vpaddd %xmm4, %xmm5, %xmm4705; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm3, %xmm3706; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm1707; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm1, %xmm1708; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm2, %xmm2709; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm0710; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0711; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0712; AVX1-SLOW-NEXT:    vpaddd %xmm0, %xmm4, %xmm0713; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]714; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0715; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]716; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0717; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax718; AVX1-SLOW-NEXT:    vzeroupper719; AVX1-SLOW-NEXT:    retq720;721; AVX1-FAST-LABEL: test_v32i32_v32i8:722; AVX1-FAST:       # %bb.0:723; AVX1-FAST-NEXT:    vbroadcastss {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255]724; AVX1-FAST-NEXT:    vandps %ymm4, %ymm0, %ymm0725; AVX1-FAST-NEXT:    vandps %ymm4, %ymm2, %ymm2726; AVX1-FAST-NEXT:    vandps %ymm4, %ymm1, %ymm1727; AVX1-FAST-NEXT:    vandps %ymm4, %ymm3, %ymm3728; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm1, %xmm4729; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm5730; AVX1-FAST-NEXT:    vpaddd %xmm4, %xmm5, %xmm4731; AVX1-FAST-NEXT:    vextractf128 $1, %ymm3, %xmm3732; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm1733; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm1, %xmm1734; AVX1-FAST-NEXT:    vextractf128 $1, %ymm2, %xmm2735; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm0736; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0737; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0738; AVX1-FAST-NEXT:    vpaddd %xmm0, %xmm4, %xmm0739; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]740; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0741; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0742; AVX1-FAST-NEXT:    vmovd %xmm0, %eax743; AVX1-FAST-NEXT:    vzeroupper744; AVX1-FAST-NEXT:    retq745;746; AVX2-LABEL: test_v32i32_v32i8:747; AVX2:       # %bb.0:748; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]749; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm2750; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0751; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0752; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm2753; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1754; AVX2-NEXT:    vpaddd %ymm2, %ymm1, %ymm1755; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0756; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1757; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0758; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]759; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0760; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]761; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0762; AVX2-NEXT:    vmovd %xmm0, %eax763; AVX2-NEXT:    vzeroupper764; AVX2-NEXT:    retq765;766; AVX512-LABEL: test_v32i32_v32i8:767; AVX512:       # %bb.0:768; AVX512-NEXT:    vpmovdb %zmm0, %xmm0769; AVX512-NEXT:    vpmovdb %zmm1, %xmm1770; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0771; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1772; AVX512-NEXT:    vpsadbw %ymm1, %ymm0, %ymm0773; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1774; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0775; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]776; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0777; AVX512-NEXT:    vmovd %xmm0, %eax778; AVX512-NEXT:    vzeroupper779; AVX512-NEXT:    retq780  %1 = and <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>781  %2 = call i32 @llvm.vector.reduce.add.v32i32(<32 x i32> %1)782  ret i32 %2783}784 785;786; vXi16787;788 789define i16 @test_v2i16_v2i8(<2 x i16> %a0) {790; SSE2-LABEL: test_v2i16_v2i8:791; SSE2:       # %bb.0:792; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0793; SSE2-NEXT:    movdqa %xmm0, %xmm1794; SSE2-NEXT:    psrld $16, %xmm1795; SSE2-NEXT:    paddw %xmm0, %xmm1796; SSE2-NEXT:    movd %xmm1, %eax797; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax798; SSE2-NEXT:    retq799;800; SSE41-LABEL: test_v2i16_v2i8:801; SSE41:       # %bb.0:802; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0803; SSE41-NEXT:    movdqa %xmm0, %xmm1804; SSE41-NEXT:    psrld $16, %xmm1805; SSE41-NEXT:    paddw %xmm0, %xmm1806; SSE41-NEXT:    movd %xmm1, %eax807; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax808; SSE41-NEXT:    retq809;810; AVX1-SLOW-LABEL: test_v2i16_v2i8:811; AVX1-SLOW:       # %bb.0:812; AVX1-SLOW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0813; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1814; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0815; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax816; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax817; AVX1-SLOW-NEXT:    retq818;819; AVX1-FAST-LABEL: test_v2i16_v2i8:820; AVX1-FAST:       # %bb.0:821; AVX1-FAST-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0822; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0823; AVX1-FAST-NEXT:    vmovd %xmm0, %eax824; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax825; AVX1-FAST-NEXT:    retq826;827; AVX2-LABEL: test_v2i16_v2i8:828; AVX2:       # %bb.0:829; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0830; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1831; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0832; AVX2-NEXT:    vmovd %xmm0, %eax833; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax834; AVX2-NEXT:    retq835;836; AVX512-LABEL: test_v2i16_v2i8:837; AVX512:       # %bb.0:838; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0839; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1840; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0841; AVX512-NEXT:    vmovd %xmm0, %eax842; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax843; AVX512-NEXT:    retq844  %1 = and <2 x i16> %a0, <i16 255, i16 255>845  %2 = call i16 @llvm.vector.reduce.add.v2i16(<2 x i16> %1)846  ret i16 %2847}848 849define i16 @test_v4i16_v4i8(<4 x i16> %a0) {850; SSE2-LABEL: test_v4i16_v4i8:851; SSE2:       # %bb.0:852; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]853; SSE2-NEXT:    pandn %xmm0, %xmm1854; SSE2-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,0,128,0,64,0,32,u,u,u,u,u,u,u,u]855; SSE2-NEXT:    por %xmm1, %xmm0856; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]857; SSE2-NEXT:    paddw %xmm0, %xmm1858; SSE2-NEXT:    movdqa %xmm1, %xmm0859; SSE2-NEXT:    psrld $16, %xmm0860; SSE2-NEXT:    paddw %xmm1, %xmm0861; SSE2-NEXT:    movd %xmm0, %eax862; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax863; SSE2-NEXT:    retq864;865; SSE41-LABEL: test_v4i16_v4i8:866; SSE41:       # %bb.0:867; SSE41-NEXT:    movq {{.*#+}} xmm1 = [0,32768,16384,8192,0,0,0,0]868; SSE41-NEXT:    pmulhuw %xmm0, %xmm1869; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]870; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]871; SSE41-NEXT:    paddw %xmm1, %xmm0872; SSE41-NEXT:    movdqa %xmm0, %xmm1873; SSE41-NEXT:    psrld $16, %xmm1874; SSE41-NEXT:    paddw %xmm0, %xmm1875; SSE41-NEXT:    movd %xmm1, %eax876; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax877; SSE41-NEXT:    retq878;879; AVX1-SLOW-LABEL: test_v4i16_v4i8:880; AVX1-SLOW:       # %bb.0:881; AVX1-SLOW-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]882; AVX1-SLOW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]883; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]884; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0885; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1886; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0887; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax888; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax889; AVX1-SLOW-NEXT:    retq890;891; AVX1-FAST-LABEL: test_v4i16_v4i8:892; AVX1-FAST:       # %bb.0:893; AVX1-FAST-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]894; AVX1-FAST-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]895; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]896; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0897; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0898; AVX1-FAST-NEXT:    vmovd %xmm0, %eax899; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax900; AVX1-FAST-NEXT:    retq901;902; AVX2-LABEL: test_v4i16_v4i8:903; AVX2:       # %bb.0:904; AVX2-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]905; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]906; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]907; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0908; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1909; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0910; AVX2-NEXT:    vmovd %xmm0, %eax911; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax912; AVX2-NEXT:    retq913;914; AVX512BW-LABEL: test_v4i16_v4i8:915; AVX512BW:       # %bb.0:916; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0917; AVX512BW-NEXT:    vmovq {{.*#+}} xmm1 = [0,1,2,3,0,0,0,0]918; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0919; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]920; AVX512BW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0921; AVX512BW-NEXT:    vpsrld $16, %xmm0, %xmm1922; AVX512BW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0923; AVX512BW-NEXT:    vmovd %xmm0, %eax924; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax925; AVX512BW-NEXT:    vzeroupper926; AVX512BW-NEXT:    retq927;928; AVX512BWVL-LABEL: test_v4i16_v4i8:929; AVX512BWVL:       # %bb.0:930; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0931; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]932; AVX512BWVL-NEXT:    vpaddw %xmm1, %xmm0, %xmm0933; AVX512BWVL-NEXT:    vpsrld $16, %xmm0, %xmm1934; AVX512BWVL-NEXT:    vpaddw %xmm1, %xmm0, %xmm0935; AVX512BWVL-NEXT:    vmovd %xmm0, %eax936; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax937; AVX512BWVL-NEXT:    retq938  %1 = lshr <4 x i16> %a0, <i16 0, i16 1, i16 2, i16 3>939  %2 = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %1)940  ret i16 %2941}942 943define i16 @test_v8i16_v8i8(<8 x i16> %a0) {944; SSE2-LABEL: test_v8i16_v8i8:945; SSE2:       # %bb.0:946; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0947; SSE2-NEXT:    packuswb %xmm0, %xmm0948; SSE2-NEXT:    pxor %xmm1, %xmm1949; SSE2-NEXT:    psadbw %xmm0, %xmm1950; SSE2-NEXT:    movd %xmm1, %eax951; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax952; SSE2-NEXT:    retq953;954; SSE41-LABEL: test_v8i16_v8i8:955; SSE41:       # %bb.0:956; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0957; SSE41-NEXT:    packuswb %xmm0, %xmm0958; SSE41-NEXT:    pxor %xmm1, %xmm1959; SSE41-NEXT:    psadbw %xmm0, %xmm1960; SSE41-NEXT:    movd %xmm1, %eax961; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax962; SSE41-NEXT:    retq963;964; AVX-LABEL: test_v8i16_v8i8:965; AVX:       # %bb.0:966; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0967; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0968; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1969; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0970; AVX-NEXT:    vmovd %xmm0, %eax971; AVX-NEXT:    # kill: def $ax killed $ax killed $eax972; AVX-NEXT:    retq973  %1 = and <8 x i16> %a0, <i16 0, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64>974  %2 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %1)975  ret i16 %2976}977 978define i16 @test_v16i16_v16i8(<16 x i16> %a0) {979; SSE2-LABEL: test_v16i16_v16i8:980; SSE2:       # %bb.0:981; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]982; SSE2-NEXT:    pand %xmm2, %xmm1983; SSE2-NEXT:    pand %xmm2, %xmm0984; SSE2-NEXT:    packuswb %xmm1, %xmm0985; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0986; SSE2-NEXT:    pxor %xmm1, %xmm1987; SSE2-NEXT:    psadbw %xmm0, %xmm1988; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]989; SSE2-NEXT:    paddq %xmm1, %xmm0990; SSE2-NEXT:    movd %xmm0, %eax991; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax992; SSE2-NEXT:    retq993;994; SSE41-LABEL: test_v16i16_v16i8:995; SSE41:       # %bb.0:996; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]997; SSE41-NEXT:    pand %xmm2, %xmm1998; SSE41-NEXT:    pand %xmm2, %xmm0999; SSE41-NEXT:    packuswb %xmm1, %xmm01000; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01001; SSE41-NEXT:    pxor %xmm1, %xmm11002; SSE41-NEXT:    psadbw %xmm0, %xmm11003; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1004; SSE41-NEXT:    paddq %xmm1, %xmm01005; SSE41-NEXT:    movd %xmm0, %eax1006; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1007; SSE41-NEXT:    retq1008;1009; AVX1-LABEL: test_v16i16_v16i8:1010; AVX1:       # %bb.0:1011; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01012; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11013; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01014; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01015; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11016; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01017; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1018; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm01019; AVX1-NEXT:    vmovd %xmm0, %eax1020; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax1021; AVX1-NEXT:    vzeroupper1022; AVX1-NEXT:    retq1023;1024; AVX2-LABEL: test_v16i16_v16i8:1025; AVX2:       # %bb.0:1026; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01027; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11028; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01029; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01030; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11031; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01032; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1033; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01034; AVX2-NEXT:    vmovd %xmm0, %eax1035; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1036; AVX2-NEXT:    vzeroupper1037; AVX2-NEXT:    retq1038;1039; AVX512BW-LABEL: test_v16i16_v16i8:1040; AVX512BW:       # %bb.0:1041; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01042; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01043; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01044; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm11045; AVX512BW-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01046; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1047; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm01048; AVX512BW-NEXT:    vmovd %xmm0, %eax1049; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax1050; AVX512BW-NEXT:    vzeroupper1051; AVX512BW-NEXT:    retq1052;1053; AVX512BWVL-LABEL: test_v16i16_v16i8:1054; AVX512BWVL:       # %bb.0:1055; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01056; AVX512BWVL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm01057; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm11058; AVX512BWVL-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01059; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1060; AVX512BWVL-NEXT:    vpaddq %xmm1, %xmm0, %xmm01061; AVX512BWVL-NEXT:    vmovd %xmm0, %eax1062; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax1063; AVX512BWVL-NEXT:    vzeroupper1064; AVX512BWVL-NEXT:    retq1065  %1 = and <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64, i16 0, i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64>1066  %2 = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %1)1067  ret i16 %21068}1069 1070define i16 @test_v32i16_v32i8(<32 x i16> %a0) {1071; SSE2-LABEL: test_v32i16_v32i8:1072; SSE2:       # %bb.0:1073; SSE2-NEXT:    psrlw $8, %xmm11074; SSE2-NEXT:    psrlw $8, %xmm01075; SSE2-NEXT:    packuswb %xmm1, %xmm01076; SSE2-NEXT:    psrlw $8, %xmm31077; SSE2-NEXT:    psrlw $8, %xmm21078; SSE2-NEXT:    packuswb %xmm3, %xmm21079; SSE2-NEXT:    pxor %xmm1, %xmm11080; SSE2-NEXT:    psadbw %xmm1, %xmm21081; SSE2-NEXT:    psadbw %xmm1, %xmm01082; SSE2-NEXT:    paddq %xmm2, %xmm01083; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1084; SSE2-NEXT:    paddq %xmm0, %xmm11085; SSE2-NEXT:    movd %xmm1, %eax1086; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1087; SSE2-NEXT:    retq1088;1089; SSE41-LABEL: test_v32i16_v32i8:1090; SSE41:       # %bb.0:1091; SSE41-NEXT:    psrlw $8, %xmm11092; SSE41-NEXT:    psrlw $8, %xmm01093; SSE41-NEXT:    packuswb %xmm1, %xmm01094; SSE41-NEXT:    psrlw $8, %xmm31095; SSE41-NEXT:    psrlw $8, %xmm21096; SSE41-NEXT:    packuswb %xmm3, %xmm21097; SSE41-NEXT:    pxor %xmm1, %xmm11098; SSE41-NEXT:    psadbw %xmm1, %xmm21099; SSE41-NEXT:    psadbw %xmm1, %xmm01100; SSE41-NEXT:    paddq %xmm2, %xmm01101; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1102; SSE41-NEXT:    paddq %xmm0, %xmm11103; SSE41-NEXT:    movd %xmm1, %eax1104; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1105; SSE41-NEXT:    retq1106;1107; AVX1-LABEL: test_v32i16_v32i8:1108; AVX1:       # %bb.0:1109; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21110; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21111; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01112; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01113; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21114; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21115; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm11116; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm11117; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21118; AVX1-NEXT:    vpsadbw %xmm2, %xmm1, %xmm11119; AVX1-NEXT:    vpsadbw %xmm2, %xmm0, %xmm01120; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm01121; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1122; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm01123; AVX1-NEXT:    vmovd %xmm0, %eax1124; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax1125; AVX1-NEXT:    vzeroupper1126; AVX1-NEXT:    retq1127;1128; AVX2-LABEL: test_v32i16_v32i8:1129; AVX2:       # %bb.0:1130; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm11131; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01132; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01133; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1134; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11135; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm01136; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11137; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01138; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1139; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01140; AVX2-NEXT:    vmovd %xmm0, %eax1141; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1142; AVX2-NEXT:    vzeroupper1143; AVX2-NEXT:    retq1144;1145; AVX512-LABEL: test_v32i16_v32i8:1146; AVX512:       # %bb.0:1147; AVX512-NEXT:    vpsrlw $8, %zmm0, %zmm01148; AVX512-NEXT:    vpmovwb %zmm0, %ymm01149; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11150; AVX512-NEXT:    vpsadbw %ymm1, %ymm0, %ymm01151; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11152; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01153; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1154; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01155; AVX512-NEXT:    vmovd %xmm0, %eax1156; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1157; AVX512-NEXT:    vzeroupper1158; AVX512-NEXT:    retq1159  %1 = lshr <32 x i16> %a0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>1160  %2 = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %1)1161  ret i16 %21162}1163 1164define i16 @test_v64i16_v64i8(<64 x i16> %a0) {1165; SSE2-LABEL: test_v64i16_v64i8:1166; SSE2:       # %bb.0:1167; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127,127,127,127,127,127,127]1168; SSE2-NEXT:    pand %xmm8, %xmm11169; SSE2-NEXT:    pand %xmm8, %xmm01170; SSE2-NEXT:    packuswb %xmm1, %xmm01171; SSE2-NEXT:    pand %xmm8, %xmm51172; SSE2-NEXT:    pand %xmm8, %xmm41173; SSE2-NEXT:    packuswb %xmm5, %xmm41174; SSE2-NEXT:    paddb %xmm0, %xmm41175; SSE2-NEXT:    pand %xmm8, %xmm31176; SSE2-NEXT:    pand %xmm8, %xmm21177; SSE2-NEXT:    packuswb %xmm3, %xmm21178; SSE2-NEXT:    pand %xmm8, %xmm71179; SSE2-NEXT:    pand %xmm8, %xmm61180; SSE2-NEXT:    packuswb %xmm7, %xmm61181; SSE2-NEXT:    paddb %xmm2, %xmm61182; SSE2-NEXT:    pxor %xmm0, %xmm01183; SSE2-NEXT:    psadbw %xmm0, %xmm61184; SSE2-NEXT:    psadbw %xmm0, %xmm41185; SSE2-NEXT:    paddq %xmm6, %xmm41186; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]1187; SSE2-NEXT:    paddq %xmm4, %xmm01188; SSE2-NEXT:    movd %xmm0, %eax1189; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1190; SSE2-NEXT:    retq1191;1192; SSE41-LABEL: test_v64i16_v64i8:1193; SSE41:       # %bb.0:1194; SSE41-NEXT:    pmovsxbw {{.*#+}} xmm8 = [127,127,127,127,127,127,127,127]1195; SSE41-NEXT:    pand %xmm8, %xmm11196; SSE41-NEXT:    pand %xmm8, %xmm01197; SSE41-NEXT:    packuswb %xmm1, %xmm01198; SSE41-NEXT:    pand %xmm8, %xmm51199; SSE41-NEXT:    pand %xmm8, %xmm41200; SSE41-NEXT:    packuswb %xmm5, %xmm41201; SSE41-NEXT:    paddb %xmm0, %xmm41202; SSE41-NEXT:    pand %xmm8, %xmm31203; SSE41-NEXT:    pand %xmm8, %xmm21204; SSE41-NEXT:    packuswb %xmm3, %xmm21205; SSE41-NEXT:    pand %xmm8, %xmm71206; SSE41-NEXT:    pand %xmm8, %xmm61207; SSE41-NEXT:    packuswb %xmm7, %xmm61208; SSE41-NEXT:    paddb %xmm2, %xmm61209; SSE41-NEXT:    pxor %xmm0, %xmm01210; SSE41-NEXT:    psadbw %xmm0, %xmm61211; SSE41-NEXT:    psadbw %xmm0, %xmm41212; SSE41-NEXT:    paddq %xmm6, %xmm41213; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]1214; SSE41-NEXT:    paddq %xmm4, %xmm01215; SSE41-NEXT:    movd %xmm0, %eax1216; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1217; SSE41-NEXT:    retq1218;1219; AVX1-LABEL: test_v64i16_v64i8:1220; AVX1:       # %bb.0:1221; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1222; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm01223; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm21224; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm11225; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm31226; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm41227; AVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm31228; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm41229; AVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm11230; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm11231; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm31232; AVX1-NEXT:    vpsadbw %xmm3, %xmm1, %xmm11233; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm41234; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm21235; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm41236; AVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm01237; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm01238; AVX1-NEXT:    vpsadbw %xmm3, %xmm0, %xmm01239; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm01240; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1241; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm01242; AVX1-NEXT:    vmovd %xmm0, %eax1243; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax1244; AVX1-NEXT:    vzeroupper1245; AVX1-NEXT:    retq1246;1247; AVX2-LABEL: test_v64i16_v64i8:1248; AVX2:       # %bb.0:1249; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]1250; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm11251; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm01252; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01253; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm11254; AVX2-NEXT:    vpand %ymm4, %ymm2, %ymm21255; AVX2-NEXT:    vpackuswb %ymm1, %ymm2, %ymm11256; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm01257; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1258; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11259; AVX2-NEXT:    vpsadbw %ymm1, %ymm0, %ymm01260; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11261; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01262; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1263; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01264; AVX2-NEXT:    vmovd %xmm0, %eax1265; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1266; AVX2-NEXT:    vzeroupper1267; AVX2-NEXT:    retq1268;1269; AVX512-LABEL: test_v64i16_v64i8:1270; AVX512:       # %bb.0:1271; AVX512-NEXT:    vpmovwb %zmm0, %ymm01272; AVX512-NEXT:    vpmovwb %zmm1, %ymm11273; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm01274; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm01275; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11276; AVX512-NEXT:    vpsadbw %zmm1, %zmm0, %zmm01277; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11278; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm01279; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11280; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01281; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1282; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01283; AVX512-NEXT:    vmovd %xmm0, %eax1284; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1285; AVX512-NEXT:    vzeroupper1286; AVX512-NEXT:    retq1287  %1 = and <64 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>1288  %2 = call i16 @llvm.vector.reduce.add.v64i16(<64 x i16> %1)1289  ret i16 %21290}1291 1292declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)1293declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)1294declare i64 @llvm.vector.reduce.add.v8i64(<8 x i64>)1295declare i64 @llvm.vector.reduce.add.v16i64(<16 x i64>)1296 1297declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>)1298declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)1299declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)1300declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>)1301declare i32 @llvm.vector.reduce.add.v32i32(<32 x i32>)1302 1303declare i16 @llvm.vector.reduce.add.v2i16(<2 x i16>)1304declare i16 @llvm.vector.reduce.add.v4i16(<4 x i16>)1305declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)1306declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>)1307declare i16 @llvm.vector.reduce.add.v32i16(<32 x i16>)1308declare i16 @llvm.vector.reduce.add.v64i16(<64 x i16>)1309 1310declare i8 @llvm.vector.reduce.add.v2i8(<2 x i8>)1311declare i8 @llvm.vector.reduce.add.v4i8(<4 x i8>)1312declare i8 @llvm.vector.reduce.add.v8i8(<8 x i8>)1313declare i8 @llvm.vector.reduce.add.v16i8(<16 x i8>)1314declare i8 @llvm.vector.reduce.add.v32i8(<32 x i8>)1315declare i8 @llvm.vector.reduce.add.v64i8(<64 x i8>)1316declare i8 @llvm.vector.reduce.add.v128i8(<128 x i8>)1317