brintos

brintos / llvm-project-archived public Read only

0
0
Text · 79.6 KiB · dc0ebe6 Raw
2076 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,AVX5128; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX5129 10;11; vXi6412;13 14define i64 @test_v2i64_v2i32(<2 x i32> %a0) {15; SSE2-LABEL: test_v2i64_v2i32:16; SSE2:       # %bb.0:17; SSE2-NEXT:    pxor %xmm1, %xmm118; SSE2-NEXT:    pcmpgtd %xmm0, %xmm119; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]20; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]21; SSE2-NEXT:    paddq %xmm0, %xmm122; SSE2-NEXT:    movq %xmm1, %rax23; SSE2-NEXT:    retq24;25; SSE41-LABEL: test_v2i64_v2i32:26; SSE41:       # %bb.0:27; SSE41-NEXT:    pmovsxdq %xmm0, %xmm028; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]29; SSE41-NEXT:    paddq %xmm0, %xmm130; SSE41-NEXT:    movq %xmm1, %rax31; SSE41-NEXT:    retq32;33; AVX-LABEL: test_v2i64_v2i32:34; AVX:       # %bb.0:35; AVX-NEXT:    vpmovsxdq %xmm0, %xmm036; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]37; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm038; AVX-NEXT:    vmovq %xmm0, %rax39; AVX-NEXT:    retq40  %1 = sext <2 x i32> %a0 to <2 x i64>41  %2 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %1)42  ret i64 %243}44 45define i64 @test_v4i64_v4i16(<4 x i16> %a0) {46; SSE2-LABEL: test_v4i64_v4i16:47; SSE2:       # %bb.0:48; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]49; SSE2-NEXT:    psrad $16, %xmm050; SSE2-NEXT:    pxor %xmm1, %xmm151; SSE2-NEXT:    pcmpgtd %xmm0, %xmm152; SSE2-NEXT:    movdqa %xmm0, %xmm253; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]54; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]55; SSE2-NEXT:    paddq %xmm2, %xmm056; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]57; SSE2-NEXT:    paddq %xmm0, %xmm158; SSE2-NEXT:    movq %xmm1, %rax59; SSE2-NEXT:    retq60;61; SSE41-LABEL: test_v4i64_v4i16:62; SSE41:       # %bb.0:63; SSE41-NEXT:    pmovsxwq %xmm0, %xmm164; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]65; SSE41-NEXT:    pmovsxwq %xmm0, %xmm066; SSE41-NEXT:    paddq %xmm1, %xmm067; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]68; SSE41-NEXT:    paddq %xmm0, %xmm169; SSE41-NEXT:    movq %xmm1, %rax70; SSE41-NEXT:    retq71;72; AVX1-LABEL: test_v4i64_v4i16:73; AVX1:       # %bb.0:74; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm175; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]76; AVX1-NEXT:    vpmovsxwq %xmm0, %xmm077; AVX1-NEXT:    vpaddq %xmm0, %xmm1, %xmm078; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]79; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm080; AVX1-NEXT:    vmovq %xmm0, %rax81; AVX1-NEXT:    retq82;83; AVX2-LABEL: test_v4i64_v4i16:84; AVX2:       # %bb.0:85; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm086; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm187; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm088; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]89; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm090; AVX2-NEXT:    vmovq %xmm0, %rax91; AVX2-NEXT:    vzeroupper92; AVX2-NEXT:    retq93;94; AVX512-LABEL: test_v4i64_v4i16:95; AVX512:       # %bb.0:96; AVX512-NEXT:    vpmovsxwq %xmm0, %ymm097; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm198; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm099; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]100; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0101; AVX512-NEXT:    vmovq %xmm0, %rax102; AVX512-NEXT:    vzeroupper103; AVX512-NEXT:    retq104  %1 = sext <4 x i16> %a0 to <4 x i64>105  %2 = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %1)106  ret i64 %2107}108 109define i64 @test_v8i64_v8i8(<8 x i8> %a0) {110; SSE2-LABEL: test_v8i64_v8i8:111; SSE2:       # %bb.0:112; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]113; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]114; SSE2-NEXT:    psrad $24, %xmm1115; SSE2-NEXT:    pxor %xmm2, %xmm2116; SSE2-NEXT:    pxor %xmm3, %xmm3117; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3118; SSE2-NEXT:    movdqa %xmm1, %xmm4119; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]120; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]121; SSE2-NEXT:    psrad $24, %xmm0122; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2123; SSE2-NEXT:    movdqa %xmm0, %xmm5124; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]125; SSE2-NEXT:    paddq %xmm4, %xmm5126; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]127; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]128; SSE2-NEXT:    paddq %xmm1, %xmm0129; SSE2-NEXT:    paddq %xmm5, %xmm0130; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]131; SSE2-NEXT:    paddq %xmm0, %xmm1132; SSE2-NEXT:    movq %xmm1, %rax133; SSE2-NEXT:    retq134;135; SSE41-LABEL: test_v8i64_v8i8:136; SSE41:       # %bb.0:137; SSE41-NEXT:    pmovsxbq %xmm0, %xmm1138; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]139; SSE41-NEXT:    pmovsxbq %xmm2, %xmm2140; SSE41-NEXT:    paddq %xmm1, %xmm2141; SSE41-NEXT:    movdqa %xmm0, %xmm1142; SSE41-NEXT:    psrlq $48, %xmm1143; SSE41-NEXT:    pmovsxbq %xmm1, %xmm1144; SSE41-NEXT:    psrld $16, %xmm0145; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0146; SSE41-NEXT:    paddq %xmm1, %xmm0147; SSE41-NEXT:    paddq %xmm2, %xmm0148; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]149; SSE41-NEXT:    paddq %xmm0, %xmm1150; SSE41-NEXT:    movq %xmm1, %rax151; SSE41-NEXT:    retq152;153; AVX1-LABEL: test_v8i64_v8i8:154; AVX1:       # %bb.0:155; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1156; AVX1-NEXT:    vpmovsxbq %xmm1, %xmm1157; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]158; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm3159; AVX1-NEXT:    vpmovsxbq %xmm3, %xmm3160; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1161; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0162; AVX1-NEXT:    vpmovsxbq %xmm2, %xmm2163; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0164; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0165; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]166; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0167; AVX1-NEXT:    vmovq %xmm0, %rax168; AVX1-NEXT:    retq169;170; AVX2-LABEL: test_v8i64_v8i8:171; AVX2:       # %bb.0:172; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm1173; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]174; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0175; AVX2-NEXT:    vpaddq %ymm0, %ymm1, %ymm0176; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1177; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0178; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]179; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0180; AVX2-NEXT:    vmovq %xmm0, %rax181; AVX2-NEXT:    vzeroupper182; AVX2-NEXT:    retq183;184; AVX512-LABEL: test_v8i64_v8i8:185; AVX512:       # %bb.0:186; AVX512-NEXT:    vpmovsxbq %xmm0, %zmm0187; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1188; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0189; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1190; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0191; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]192; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0193; AVX512-NEXT:    vmovq %xmm0, %rax194; AVX512-NEXT:    vzeroupper195; AVX512-NEXT:    retq196  %1 = sext <8 x i8> %a0 to <8 x i64>197  %2 = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %1)198  ret i64 %2199}200 201define i64 @test_v16i64_v16i8(<16 x i8> %a0) {202; SSE2-LABEL: test_v16i64_v16i8:203; SSE2:       # %bb.0:204; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]205; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]206; SSE2-NEXT:    psrad $24, %xmm2207; SSE2-NEXT:    pxor %xmm1, %xmm1208; SSE2-NEXT:    pxor %xmm3, %xmm3209; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3210; SSE2-NEXT:    movdqa %xmm2, %xmm5211; SSE2-NEXT:    punpckhdq {{.*#+}} xmm5 = xmm5[2],xmm3[2],xmm5[3],xmm3[3]212; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]213; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1],xmm0[2],xmm6[2],xmm0[3],xmm6[3]214; SSE2-NEXT:    psrad $24, %xmm0215; SSE2-NEXT:    pxor %xmm7, %xmm7216; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7217; SSE2-NEXT:    movdqa %xmm0, %xmm8218; SSE2-NEXT:    punpckhdq {{.*#+}} xmm8 = xmm8[2],xmm7[2],xmm8[3],xmm7[3]219; SSE2-NEXT:    paddq %xmm5, %xmm8220; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]221; SSE2-NEXT:    psrad $24, %xmm4222; SSE2-NEXT:    pxor %xmm5, %xmm5223; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5224; SSE2-NEXT:    movdqa %xmm4, %xmm9225; SSE2-NEXT:    punpckhdq {{.*#+}} xmm9 = xmm9[2],xmm5[2],xmm9[3],xmm5[3]226; SSE2-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4,4,5,5,6,6,7,7]227; SSE2-NEXT:    psrad $24, %xmm6228; SSE2-NEXT:    pcmpgtd %xmm6, %xmm1229; SSE2-NEXT:    movdqa %xmm6, %xmm10230; SSE2-NEXT:    punpckhdq {{.*#+}} xmm10 = xmm10[2],xmm1[2],xmm10[3],xmm1[3]231; SSE2-NEXT:    paddq %xmm9, %xmm10232; SSE2-NEXT:    paddq %xmm8, %xmm10233; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]234; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]235; SSE2-NEXT:    paddq %xmm2, %xmm0236; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]237; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]238; SSE2-NEXT:    paddq %xmm4, %xmm6239; SSE2-NEXT:    paddq %xmm0, %xmm6240; SSE2-NEXT:    paddq %xmm10, %xmm6241; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3]242; SSE2-NEXT:    paddq %xmm6, %xmm0243; SSE2-NEXT:    movq %xmm0, %rax244; SSE2-NEXT:    retq245;246; SSE41-LABEL: test_v16i64_v16i8:247; SSE41:       # %bb.0:248; SSE41-NEXT:    movdqa %xmm0, %xmm1249; SSE41-NEXT:    movdqa %xmm0, %xmm2250; SSE41-NEXT:    movdqa %xmm0, %xmm3251; SSE41-NEXT:    pmovsxbq %xmm0, %xmm4252; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[2,3,2,3]253; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[3,3,3,3]254; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,1,1]255; SSE41-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero256; SSE41-NEXT:    pmovsxbq %xmm0, %xmm0257; SSE41-NEXT:    psrld $16, %xmm1258; SSE41-NEXT:    pmovsxbq %xmm1, %xmm1259; SSE41-NEXT:    paddq %xmm0, %xmm1260; SSE41-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero261; SSE41-NEXT:    pmovsxbq %xmm2, %xmm0262; SSE41-NEXT:    psrlq $48, %xmm3263; SSE41-NEXT:    pmovsxbq %xmm3, %xmm2264; SSE41-NEXT:    paddq %xmm0, %xmm2265; SSE41-NEXT:    paddq %xmm1, %xmm2266; SSE41-NEXT:    pmovsxbq %xmm5, %xmm0267; SSE41-NEXT:    paddq %xmm4, %xmm0268; SSE41-NEXT:    pmovsxbq %xmm6, %xmm1269; SSE41-NEXT:    pmovsxbq %xmm7, %xmm3270; SSE41-NEXT:    paddq %xmm1, %xmm3271; SSE41-NEXT:    paddq %xmm0, %xmm3272; SSE41-NEXT:    paddq %xmm2, %xmm3273; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]274; SSE41-NEXT:    paddq %xmm3, %xmm0275; SSE41-NEXT:    movq %xmm0, %rax276; SSE41-NEXT:    retq277;278; AVX1-LABEL: test_v16i64_v16i8:279; AVX1:       # %bb.0:280; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1281; AVX1-NEXT:    vpmovsxbq %xmm1, %xmm1282; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]283; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm3284; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm3[1,1,1,1]285; AVX1-NEXT:    vpmovsxwq %xmm4, %xmm4286; AVX1-NEXT:    vpaddq %xmm4, %xmm1, %xmm1287; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm4288; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[3,3,3,3]289; AVX1-NEXT:    vpmovsxwq %xmm5, %xmm5290; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm3[3,3,3,3]291; AVX1-NEXT:    vpmovsxwq %xmm6, %xmm6292; AVX1-NEXT:    vpaddq %xmm6, %xmm5, %xmm5293; AVX1-NEXT:    vpaddq %xmm5, %xmm1, %xmm1294; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]295; AVX1-NEXT:    vpmovsxwq %xmm4, %xmm4296; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]297; AVX1-NEXT:    vpmovsxwq %xmm3, %xmm3298; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3299; AVX1-NEXT:    vpmovsxbq %xmm0, %xmm0300; AVX1-NEXT:    vpmovsxbq %xmm2, %xmm2301; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0302; AVX1-NEXT:    vpaddq %xmm3, %xmm0, %xmm0303; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0304; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]305; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0306; AVX1-NEXT:    vmovq %xmm0, %rax307; AVX1-NEXT:    retq308;309; AVX2-LABEL: test_v16i64_v16i8:310; AVX2:       # %bb.0:311; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm1312; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2313; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]314; AVX2-NEXT:    vpmovsxwq %xmm3, %ymm3315; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]316; AVX2-NEXT:    vpmovsxwq %xmm1, %ymm1317; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1318; AVX2-NEXT:    vpmovsxbq %xmm0, %ymm0319; AVX2-NEXT:    vpmovsxwq %xmm2, %ymm2320; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0321; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0322; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1323; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0324; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]325; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0326; AVX2-NEXT:    vmovq %xmm0, %rax327; AVX2-NEXT:    vzeroupper328; AVX2-NEXT:    retq329;330; AVX512-LABEL: test_v16i64_v16i8:331; AVX512:       # %bb.0:332; AVX512-NEXT:    vpmovsxbw %xmm0, %ymm0333; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1334; AVX512-NEXT:    vpmovsxwq %xmm1, %zmm1335; AVX512-NEXT:    vpmovsxwq %xmm0, %zmm0336; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0337; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1338; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0339; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1340; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0341; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]342; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0343; AVX512-NEXT:    vmovq %xmm0, %rax344; AVX512-NEXT:    vzeroupper345; AVX512-NEXT:    retq346  %1 = sext <16 x i8> %a0 to <16 x i64>347  %2 = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> %1)348  ret i64 %2349}350 351;352; vXi32353;354 355define i32 @test_v2i32_v2i16(<2 x i16> %a0) {356; SSE2-LABEL: test_v2i32_v2i16:357; SSE2:       # %bb.0:358; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]359; SSE2-NEXT:    psrad $16, %xmm0360; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]361; SSE2-NEXT:    paddd %xmm0, %xmm1362; SSE2-NEXT:    movd %xmm1, %eax363; SSE2-NEXT:    retq364;365; SSE41-LABEL: test_v2i32_v2i16:366; SSE41:       # %bb.0:367; SSE41-NEXT:    pmovsxwd %xmm0, %xmm0368; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]369; SSE41-NEXT:    paddd %xmm0, %xmm1370; SSE41-NEXT:    movd %xmm1, %eax371; SSE41-NEXT:    retq372;373; AVX1-SLOW-LABEL: test_v2i32_v2i16:374; AVX1-SLOW:       # %bb.0:375; AVX1-SLOW-NEXT:    vpmovsxwd %xmm0, %xmm0376; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]377; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0378; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax379; AVX1-SLOW-NEXT:    retq380;381; AVX1-FAST-LABEL: test_v2i32_v2i16:382; AVX1-FAST:       # %bb.0:383; AVX1-FAST-NEXT:    vpmovsxwd %xmm0, %xmm0384; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0385; AVX1-FAST-NEXT:    vmovd %xmm0, %eax386; AVX1-FAST-NEXT:    retq387;388; AVX2-LABEL: test_v2i32_v2i16:389; AVX2:       # %bb.0:390; AVX2-NEXT:    vpmovsxwd %xmm0, %xmm0391; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]392; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0393; AVX2-NEXT:    vmovd %xmm0, %eax394; AVX2-NEXT:    retq395;396; AVX512-LABEL: test_v2i32_v2i16:397; AVX512:       # %bb.0:398; AVX512-NEXT:    vpmovsxwd %xmm0, %xmm0399; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]400; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0401; AVX512-NEXT:    vmovd %xmm0, %eax402; AVX512-NEXT:    retq403  %1 = sext <2 x i16> %a0 to <2 x i32>404  %2 = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %1)405  ret i32 %2406}407 408define i32 @test_v4i32(<4 x i8> %a0) {409; SSE2-LABEL: test_v4i32:410; SSE2:       # %bb.0:411; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]412; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]413; SSE2-NEXT:    psrad $24, %xmm0414; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]415; SSE2-NEXT:    paddd %xmm0, %xmm1416; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]417; SSE2-NEXT:    paddd %xmm1, %xmm0418; SSE2-NEXT:    movd %xmm0, %eax419; SSE2-NEXT:    retq420;421; SSE41-LABEL: test_v4i32:422; SSE41:       # %bb.0:423; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0424; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]425; SSE41-NEXT:    paddd %xmm0, %xmm1426; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]427; SSE41-NEXT:    paddd %xmm1, %xmm0428; SSE41-NEXT:    movd %xmm0, %eax429; SSE41-NEXT:    retq430;431; AVX1-SLOW-LABEL: test_v4i32:432; AVX1-SLOW:       # %bb.0:433; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm0434; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]435; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0436; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]437; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0438; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax439; AVX1-SLOW-NEXT:    retq440;441; AVX1-FAST-LABEL: test_v4i32:442; AVX1-FAST:       # %bb.0:443; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm0444; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0445; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0446; AVX1-FAST-NEXT:    vmovd %xmm0, %eax447; AVX1-FAST-NEXT:    retq448;449; AVX2-LABEL: test_v4i32:450; AVX2:       # %bb.0:451; AVX2-NEXT:    vpmovsxbd %xmm0, %xmm0452; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]453; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0454; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]455; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0456; AVX2-NEXT:    vmovd %xmm0, %eax457; AVX2-NEXT:    retq458;459; AVX512-LABEL: test_v4i32:460; AVX512:       # %bb.0:461; AVX512-NEXT:    vpmovsxbd %xmm0, %xmm0462; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]463; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0464; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]465; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0466; AVX512-NEXT:    vmovd %xmm0, %eax467; AVX512-NEXT:    retq468  %1 = sext <4 x i8> %a0 to <4 x i32>469  %2 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %1)470  ret i32 %2471}472 473define i32 @test_v8i32_v8i8(<8 x i8> %a0) {474; SSE2-LABEL: test_v8i32_v8i8:475; SSE2:       # %bb.0:476; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]477; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]478; SSE2-NEXT:    psrad $24, %xmm1479; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]480; SSE2-NEXT:    psrad $24, %xmm0481; SSE2-NEXT:    paddd %xmm1, %xmm0482; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]483; SSE2-NEXT:    paddd %xmm0, %xmm1484; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]485; SSE2-NEXT:    paddd %xmm1, %xmm0486; SSE2-NEXT:    movd %xmm0, %eax487; SSE2-NEXT:    retq488;489; SSE41-LABEL: test_v8i32_v8i8:490; SSE41:       # %bb.0:491; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1492; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]493; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0494; SSE41-NEXT:    paddd %xmm1, %xmm0495; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]496; SSE41-NEXT:    paddd %xmm0, %xmm1497; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]498; SSE41-NEXT:    paddd %xmm1, %xmm0499; SSE41-NEXT:    movd %xmm0, %eax500; SSE41-NEXT:    retq501;502; AVX1-SLOW-LABEL: test_v8i32_v8i8:503; AVX1-SLOW:       # %bb.0:504; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm1505; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]506; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm0507; AVX1-SLOW-NEXT:    vpaddd %xmm0, %xmm1, %xmm0508; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]509; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0510; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]511; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0512; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax513; AVX1-SLOW-NEXT:    retq514;515; AVX1-FAST-LABEL: test_v8i32_v8i8:516; AVX1-FAST:       # %bb.0:517; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm1518; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]519; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm0520; AVX1-FAST-NEXT:    vphaddd %xmm1, %xmm0, %xmm0521; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0522; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0523; AVX1-FAST-NEXT:    vmovd %xmm0, %eax524; AVX1-FAST-NEXT:    retq525;526; AVX2-LABEL: test_v8i32_v8i8:527; AVX2:       # %bb.0:528; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0529; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1530; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0531; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]532; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0533; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]534; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0535; AVX2-NEXT:    vmovd %xmm0, %eax536; AVX2-NEXT:    vzeroupper537; AVX2-NEXT:    retq538;539; AVX512-LABEL: test_v8i32_v8i8:540; AVX512:       # %bb.0:541; AVX512-NEXT:    vpmovsxbd %xmm0, %ymm0542; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1543; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0544; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]545; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0546; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]547; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0548; AVX512-NEXT:    vmovd %xmm0, %eax549; AVX512-NEXT:    vzeroupper550; AVX512-NEXT:    retq551  %1 = sext <8 x i8> %a0 to <8 x i32>552  %2 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %1)553  ret i32 %2554}555 556define i32 @test_v16i32_v16i8(<16 x i8> %a0) {557; SSE2-LABEL: test_v16i32_v16i8:558; SSE2:       # %bb.0:559; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]560; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]561; SSE2-NEXT:    psrad $24, %xmm2562; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]563; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]564; SSE2-NEXT:    psrad $24, %xmm3565; SSE2-NEXT:    paddd %xmm2, %xmm3566; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]567; SSE2-NEXT:    psrad $24, %xmm1568; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]569; SSE2-NEXT:    psrad $24, %xmm0570; SSE2-NEXT:    paddd %xmm1, %xmm0571; SSE2-NEXT:    paddd %xmm3, %xmm0572; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]573; SSE2-NEXT:    paddd %xmm0, %xmm1574; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]575; SSE2-NEXT:    paddd %xmm1, %xmm0576; SSE2-NEXT:    movd %xmm0, %eax577; SSE2-NEXT:    retq578;579; SSE41-LABEL: test_v16i32_v16i8:580; SSE41:       # %bb.0:581; SSE41-NEXT:    pmovsxbd %xmm0, %xmm1582; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]583; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2584; SSE41-NEXT:    paddd %xmm1, %xmm2585; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]586; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1587; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]588; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0589; SSE41-NEXT:    paddd %xmm1, %xmm0590; SSE41-NEXT:    paddd %xmm2, %xmm0591; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]592; SSE41-NEXT:    paddd %xmm0, %xmm1593; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]594; SSE41-NEXT:    paddd %xmm1, %xmm0595; SSE41-NEXT:    movd %xmm0, %eax596; SSE41-NEXT:    retq597;598; AVX1-SLOW-LABEL: test_v16i32_v16i8:599; AVX1-SLOW:       # %bb.0:600; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm1601; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]602; AVX1-SLOW-NEXT:    vpmovsxbd %xmm2, %xmm2603; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm1, %xmm1604; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]605; AVX1-SLOW-NEXT:    vpmovsxbd %xmm2, %xmm2606; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]607; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm0608; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0609; AVX1-SLOW-NEXT:    vpaddd %xmm0, %xmm1, %xmm0610; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]611; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0612; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]613; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0614; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax615; AVX1-SLOW-NEXT:    retq616;617; AVX1-FAST-LABEL: test_v16i32_v16i8:618; AVX1-FAST:       # %bb.0:619; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm1620; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]621; AVX1-FAST-NEXT:    vpmovsxbd %xmm2, %xmm2622; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm1, %xmm1623; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]624; AVX1-FAST-NEXT:    vpmovsxbd %xmm2, %xmm2625; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]626; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm0627; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0628; AVX1-FAST-NEXT:    vpaddd %xmm0, %xmm1, %xmm0629; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]630; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0631; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0632; AVX1-FAST-NEXT:    vmovd %xmm0, %eax633; AVX1-FAST-NEXT:    retq634;635; AVX2-LABEL: test_v16i32_v16i8:636; AVX2:       # %bb.0:637; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm1638; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]639; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0640; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0641; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1642; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0643; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]644; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0645; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]646; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0647; AVX2-NEXT:    vmovd %xmm0, %eax648; AVX2-NEXT:    vzeroupper649; AVX2-NEXT:    retq650;651; AVX512-LABEL: test_v16i32_v16i8:652; AVX512:       # %bb.0:653; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0654; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1655; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0656; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1657; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0658; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]659; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0660; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]661; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0662; AVX512-NEXT:    vmovd %xmm0, %eax663; AVX512-NEXT:    vzeroupper664; AVX512-NEXT:    retq665  %1 = sext <16 x i8> %a0 to <16 x i32>666  %2 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %1)667  ret i32 %2668}669 670define i32 @test_v32i32_v32i8(<32 x i8> %a0) {671; SSE2-LABEL: test_v32i32_v32i8:672; SSE2:       # %bb.0:673; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]674; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]675; SSE2-NEXT:    psrad $24, %xmm3676; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]677; SSE2-NEXT:    punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]678; SSE2-NEXT:    psrad $24, %xmm5679; SSE2-NEXT:    paddd %xmm3, %xmm5680; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]681; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]682; SSE2-NEXT:    psrad $24, %xmm3683; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]684; SSE2-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]685; SSE2-NEXT:    psrad $24, %xmm6686; SSE2-NEXT:    paddd %xmm3, %xmm6687; SSE2-NEXT:    paddd %xmm5, %xmm6688; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]689; SSE2-NEXT:    psrad $24, %xmm2690; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]691; SSE2-NEXT:    psrad $24, %xmm3692; SSE2-NEXT:    paddd %xmm2, %xmm3693; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]694; SSE2-NEXT:    psrad $24, %xmm1695; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]696; SSE2-NEXT:    psrad $24, %xmm0697; SSE2-NEXT:    paddd %xmm1, %xmm0698; SSE2-NEXT:    paddd %xmm3, %xmm0699; SSE2-NEXT:    paddd %xmm6, %xmm0700; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]701; SSE2-NEXT:    paddd %xmm0, %xmm1702; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]703; SSE2-NEXT:    paddd %xmm1, %xmm0704; SSE2-NEXT:    movd %xmm0, %eax705; SSE2-NEXT:    retq706;707; SSE41-LABEL: test_v32i32_v32i8:708; SSE41:       # %bb.0:709; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]710; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2711; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]712; SSE41-NEXT:    pmovsxbd %xmm3, %xmm3713; SSE41-NEXT:    paddd %xmm2, %xmm3714; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]715; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2716; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]717; SSE41-NEXT:    pmovsxbd %xmm4, %xmm4718; SSE41-NEXT:    paddd %xmm2, %xmm4719; SSE41-NEXT:    paddd %xmm3, %xmm4720; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]721; SSE41-NEXT:    pmovsxbd %xmm2, %xmm2722; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]723; SSE41-NEXT:    pmovsxbd %xmm3, %xmm3724; SSE41-NEXT:    paddd %xmm2, %xmm3725; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1726; SSE41-NEXT:    pmovsxbd %xmm0, %xmm0727; SSE41-NEXT:    paddd %xmm1, %xmm0728; SSE41-NEXT:    paddd %xmm3, %xmm0729; SSE41-NEXT:    paddd %xmm4, %xmm0730; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]731; SSE41-NEXT:    paddd %xmm0, %xmm1732; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]733; SSE41-NEXT:    paddd %xmm1, %xmm0734; SSE41-NEXT:    movd %xmm0, %eax735; SSE41-NEXT:    retq736;737; AVX1-SLOW-LABEL: test_v32i32_v32i8:738; AVX1-SLOW:       # %bb.0:739; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1740; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]741; AVX1-SLOW-NEXT:    vpmovsxbd %xmm2, %xmm2742; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]743; AVX1-SLOW-NEXT:    vpmovsxbd %xmm3, %xmm3744; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm3, %xmm2745; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[3,3,3,3]746; AVX1-SLOW-NEXT:    vpmovsxbd %xmm3, %xmm3747; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]748; AVX1-SLOW-NEXT:    vpmovsxbd %xmm4, %xmm4749; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm4, %xmm3750; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm2, %xmm2751; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]752; AVX1-SLOW-NEXT:    vpmovsxbd %xmm3, %xmm3753; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]754; AVX1-SLOW-NEXT:    vpmovsxbd %xmm4, %xmm4755; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm4, %xmm3756; AVX1-SLOW-NEXT:    vpmovsxbd %xmm1, %xmm1757; AVX1-SLOW-NEXT:    vpmovsxbd %xmm0, %xmm0758; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0759; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm0, %xmm0760; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0761; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]762; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0763; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]764; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0765; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax766; AVX1-SLOW-NEXT:    vzeroupper767; AVX1-SLOW-NEXT:    retq768;769; AVX1-FAST-LABEL: test_v32i32_v32i8:770; AVX1-FAST:       # %bb.0:771; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1772; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]773; AVX1-FAST-NEXT:    vpmovsxbd %xmm2, %xmm2774; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]775; AVX1-FAST-NEXT:    vpmovsxbd %xmm3, %xmm3776; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm3, %xmm2777; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[3,3,3,3]778; AVX1-FAST-NEXT:    vpmovsxbd %xmm3, %xmm3779; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]780; AVX1-FAST-NEXT:    vpmovsxbd %xmm4, %xmm4781; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm4, %xmm3782; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm2, %xmm2783; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]784; AVX1-FAST-NEXT:    vpmovsxbd %xmm3, %xmm3785; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]786; AVX1-FAST-NEXT:    vpmovsxbd %xmm4, %xmm4787; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm4, %xmm3788; AVX1-FAST-NEXT:    vpmovsxbd %xmm1, %xmm1789; AVX1-FAST-NEXT:    vpmovsxbd %xmm0, %xmm0790; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0791; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm0, %xmm0792; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0793; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]794; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0795; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0796; AVX1-FAST-NEXT:    vmovd %xmm0, %eax797; AVX1-FAST-NEXT:    vzeroupper798; AVX1-FAST-NEXT:    retq799;800; AVX2-LABEL: test_v32i32_v32i8:801; AVX2:       # %bb.0:802; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1803; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]804; AVX2-NEXT:    vpmovsxbd %xmm2, %ymm2805; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]806; AVX2-NEXT:    vpmovsxbd %xmm3, %ymm3807; AVX2-NEXT:    vpaddd %ymm2, %ymm3, %ymm2808; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1809; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0810; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0811; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0812; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1813; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0814; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]815; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0816; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]817; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0818; AVX2-NEXT:    vmovd %xmm0, %eax819; AVX2-NEXT:    vzeroupper820; AVX2-NEXT:    retq821;822; AVX512-LABEL: test_v32i32_v32i8:823; AVX512:       # %bb.0:824; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1825; AVX512-NEXT:    vpmovsxbd %xmm1, %zmm1826; AVX512-NEXT:    vpmovsxbd %xmm0, %zmm0827; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0828; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1829; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0830; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1831; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0832; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]833; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0834; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]835; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0836; AVX512-NEXT:    vmovd %xmm0, %eax837; AVX512-NEXT:    vzeroupper838; AVX512-NEXT:    retq839  %1 = sext <32 x i8> %a0 to <32 x i32>840  %2 = call i32 @llvm.vector.reduce.add.v32i32(<32 x i32> %1)841  ret i32 %2842}843 844;845; vXi16846;847 848define i16 @test_v2i16_v2i8(<2 x i8> %a0) {849; SSE2-LABEL: test_v2i16_v2i8:850; SSE2:       # %bb.0:851; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]852; SSE2-NEXT:    psraw $8, %xmm0853; SSE2-NEXT:    movdqa %xmm0, %xmm1854; SSE2-NEXT:    psrld $16, %xmm1855; SSE2-NEXT:    paddw %xmm0, %xmm1856; SSE2-NEXT:    movd %xmm1, %eax857; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax858; SSE2-NEXT:    retq859;860; SSE41-LABEL: test_v2i16_v2i8:861; SSE41:       # %bb.0:862; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0863; SSE41-NEXT:    movdqa %xmm0, %xmm1864; SSE41-NEXT:    psrld $16, %xmm1865; SSE41-NEXT:    paddw %xmm0, %xmm1866; SSE41-NEXT:    movd %xmm1, %eax867; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax868; SSE41-NEXT:    retq869;870; AVX1-SLOW-LABEL: test_v2i16_v2i8:871; AVX1-SLOW:       # %bb.0:872; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm0873; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1874; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0875; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax876; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax877; AVX1-SLOW-NEXT:    retq878;879; AVX1-FAST-LABEL: test_v2i16_v2i8:880; AVX1-FAST:       # %bb.0:881; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm0882; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0883; AVX1-FAST-NEXT:    vmovd %xmm0, %eax884; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax885; AVX1-FAST-NEXT:    retq886;887; AVX2-LABEL: test_v2i16_v2i8:888; AVX2:       # %bb.0:889; AVX2-NEXT:    vpmovsxbw %xmm0, %xmm0890; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1891; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0892; AVX2-NEXT:    vmovd %xmm0, %eax893; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax894; AVX2-NEXT:    retq895;896; AVX512-LABEL: test_v2i16_v2i8:897; AVX512:       # %bb.0:898; AVX512-NEXT:    vpmovsxbw %xmm0, %xmm0899; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1900; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0901; AVX512-NEXT:    vmovd %xmm0, %eax902; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax903; AVX512-NEXT:    retq904  %1 = sext <2 x i8> %a0 to <2 x i16>905  %2 = call i16 @llvm.vector.reduce.add.v2i16(<2 x i16> %1)906  ret i16 %2907}908 909define i16 @test_v4i16_v4i8(<4 x i8> %a0) {910; SSE2-LABEL: test_v4i16_v4i8:911; SSE2:       # %bb.0:912; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]913; SSE2-NEXT:    psraw $8, %xmm0914; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]915; SSE2-NEXT:    paddw %xmm0, %xmm1916; SSE2-NEXT:    movdqa %xmm1, %xmm0917; SSE2-NEXT:    psrld $16, %xmm0918; SSE2-NEXT:    paddw %xmm1, %xmm0919; SSE2-NEXT:    movd %xmm0, %eax920; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax921; SSE2-NEXT:    retq922;923; SSE41-LABEL: test_v4i16_v4i8:924; SSE41:       # %bb.0:925; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0926; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]927; SSE41-NEXT:    paddw %xmm0, %xmm1928; SSE41-NEXT:    movdqa %xmm1, %xmm0929; SSE41-NEXT:    psrld $16, %xmm0930; SSE41-NEXT:    paddw %xmm1, %xmm0931; SSE41-NEXT:    movd %xmm0, %eax932; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax933; SSE41-NEXT:    retq934;935; AVX1-SLOW-LABEL: test_v4i16_v4i8:936; AVX1-SLOW:       # %bb.0:937; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm0938; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]939; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0940; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1941; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0942; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax943; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax944; AVX1-SLOW-NEXT:    retq945;946; AVX1-FAST-LABEL: test_v4i16_v4i8:947; AVX1-FAST:       # %bb.0:948; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm0949; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]950; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0951; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0952; AVX1-FAST-NEXT:    vmovd %xmm0, %eax953; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax954; AVX1-FAST-NEXT:    retq955;956; AVX2-LABEL: test_v4i16_v4i8:957; AVX2:       # %bb.0:958; AVX2-NEXT:    vpmovsxbw %xmm0, %xmm0959; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]960; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0961; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1962; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0963; AVX2-NEXT:    vmovd %xmm0, %eax964; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax965; AVX2-NEXT:    retq966;967; AVX512-LABEL: test_v4i16_v4i8:968; AVX512:       # %bb.0:969; AVX512-NEXT:    vpmovsxbw %xmm0, %xmm0970; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]971; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0972; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1973; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0974; AVX512-NEXT:    vmovd %xmm0, %eax975; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax976; AVX512-NEXT:    retq977  %1 = sext <4 x i8> %a0 to <4 x i16>978  %2 = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %1)979  ret i16 %2980 981}982 983define i16 @test_v8i16_v8i8(<8 x i8> %a0) {984; SSE2-LABEL: test_v8i16_v8i8:985; SSE2:       # %bb.0:986; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]987; SSE2-NEXT:    psraw $8, %xmm0988; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]989; SSE2-NEXT:    paddw %xmm0, %xmm1990; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]991; SSE2-NEXT:    paddw %xmm1, %xmm0992; SSE2-NEXT:    movdqa %xmm0, %xmm1993; SSE2-NEXT:    psrld $16, %xmm1994; SSE2-NEXT:    paddw %xmm0, %xmm1995; SSE2-NEXT:    movd %xmm1, %eax996; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax997; SSE2-NEXT:    retq998;999; SSE41-LABEL: test_v8i16_v8i8:1000; SSE41:       # %bb.0:1001; SSE41-NEXT:    pmovsxbw %xmm0, %xmm01002; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1003; SSE41-NEXT:    paddw %xmm0, %xmm11004; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1005; SSE41-NEXT:    paddw %xmm1, %xmm01006; SSE41-NEXT:    movdqa %xmm0, %xmm11007; SSE41-NEXT:    psrld $16, %xmm11008; SSE41-NEXT:    paddw %xmm0, %xmm11009; SSE41-NEXT:    movd %xmm1, %eax1010; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1011; SSE41-NEXT:    retq1012;1013; AVX1-SLOW-LABEL: test_v8i16_v8i8:1014; AVX1-SLOW:       # %bb.0:1015; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm01016; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1017; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01018; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1019; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01020; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm11021; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01022; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1023; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax1024; AVX1-SLOW-NEXT:    retq1025;1026; AVX1-FAST-LABEL: test_v8i16_v8i8:1027; AVX1-FAST:       # %bb.0:1028; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm01029; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01030; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01031; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01032; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1033; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax1034; AVX1-FAST-NEXT:    retq1035;1036; AVX2-LABEL: test_v8i16_v8i8:1037; AVX2:       # %bb.0:1038; AVX2-NEXT:    vpmovsxbw %xmm0, %xmm01039; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1040; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01041; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1042; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01043; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm11044; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01045; AVX2-NEXT:    vmovd %xmm0, %eax1046; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1047; AVX2-NEXT:    retq1048;1049; AVX512-LABEL: test_v8i16_v8i8:1050; AVX512:       # %bb.0:1051; AVX512-NEXT:    vpmovsxbw %xmm0, %xmm01052; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1053; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01054; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1055; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01056; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm11057; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01058; AVX512-NEXT:    vmovd %xmm0, %eax1059; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1060; AVX512-NEXT:    retq1061  %1 = sext <8 x i8> %a0 to <8 x i16>1062  %2 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %1)1063  ret i16 %21064}1065 1066define i16 @test_v16i16_v16i8(<16 x i8> %a0) {1067; SSE2-LABEL: test_v16i16_v16i8:1068; SSE2:       # %bb.0:1069; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1070; SSE2-NEXT:    psraw $8, %xmm11071; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1072; SSE2-NEXT:    psraw $8, %xmm01073; SSE2-NEXT:    paddw %xmm1, %xmm01074; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1075; SSE2-NEXT:    paddw %xmm0, %xmm11076; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1077; SSE2-NEXT:    paddw %xmm1, %xmm01078; SSE2-NEXT:    movdqa %xmm0, %xmm11079; SSE2-NEXT:    psrld $16, %xmm11080; SSE2-NEXT:    paddw %xmm0, %xmm11081; SSE2-NEXT:    movd %xmm1, %eax1082; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1083; SSE2-NEXT:    retq1084;1085; SSE41-LABEL: test_v16i16_v16i8:1086; SSE41:       # %bb.0:1087; SSE41-NEXT:    pmovsxbw %xmm0, %xmm11088; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1089; SSE41-NEXT:    pmovsxbw %xmm0, %xmm01090; SSE41-NEXT:    paddw %xmm1, %xmm01091; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1092; SSE41-NEXT:    paddw %xmm0, %xmm11093; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1094; SSE41-NEXT:    paddw %xmm1, %xmm01095; SSE41-NEXT:    movdqa %xmm0, %xmm11096; SSE41-NEXT:    psrld $16, %xmm11097; SSE41-NEXT:    paddw %xmm0, %xmm11098; SSE41-NEXT:    movd %xmm1, %eax1099; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1100; SSE41-NEXT:    retq1101;1102; AVX1-SLOW-LABEL: test_v16i16_v16i8:1103; AVX1-SLOW:       # %bb.0:1104; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm11105; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1106; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm01107; AVX1-SLOW-NEXT:    vpaddw %xmm0, %xmm1, %xmm01108; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1109; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01110; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1111; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01112; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm11113; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01114; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1115; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax1116; AVX1-SLOW-NEXT:    retq1117;1118; AVX1-FAST-LABEL: test_v16i16_v16i8:1119; AVX1-FAST:       # %bb.0:1120; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm11121; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1122; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm01123; AVX1-FAST-NEXT:    vphaddw %xmm1, %xmm0, %xmm01124; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01125; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01126; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01127; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1128; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax1129; AVX1-FAST-NEXT:    retq1130;1131; AVX2-LABEL: test_v16i16_v16i8:1132; AVX2:       # %bb.0:1133; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm01134; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11135; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01136; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1137; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01138; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1139; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01140; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm11141; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01142; AVX2-NEXT:    vmovd %xmm0, %eax1143; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1144; AVX2-NEXT:    vzeroupper1145; AVX2-NEXT:    retq1146;1147; AVX512-LABEL: test_v16i16_v16i8:1148; AVX512:       # %bb.0:1149; AVX512-NEXT:    vpmovsxbw %xmm0, %ymm01150; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11151; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01152; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1153; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01154; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1155; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01156; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm11157; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01158; AVX512-NEXT:    vmovd %xmm0, %eax1159; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1160; AVX512-NEXT:    vzeroupper1161; AVX512-NEXT:    retq1162  %1 = sext <16 x i8> %a0 to <16 x i16>1163  %2 = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %1)1164  ret i16 %21165}1166 1167define i16 @test_v32i16_v32i8(<32 x i8> %a0) {1168; SSE2-LABEL: test_v32i16_v32i8:1169; SSE2:       # %bb.0:1170; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1171; SSE2-NEXT:    psraw $8, %xmm21172; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]1173; SSE2-NEXT:    psraw $8, %xmm31174; SSE2-NEXT:    paddw %xmm2, %xmm31175; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1176; SSE2-NEXT:    psraw $8, %xmm11177; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1178; SSE2-NEXT:    psraw $8, %xmm01179; SSE2-NEXT:    paddw %xmm1, %xmm01180; SSE2-NEXT:    paddw %xmm3, %xmm01181; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1182; SSE2-NEXT:    paddw %xmm0, %xmm11183; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1184; SSE2-NEXT:    paddw %xmm1, %xmm01185; SSE2-NEXT:    movdqa %xmm0, %xmm11186; SSE2-NEXT:    psrld $16, %xmm11187; SSE2-NEXT:    paddw %xmm0, %xmm11188; SSE2-NEXT:    movd %xmm1, %eax1189; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1190; SSE2-NEXT:    retq1191;1192; SSE41-LABEL: test_v32i16_v32i8:1193; SSE41:       # %bb.0:1194; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1195; SSE41-NEXT:    pmovsxbw %xmm2, %xmm21196; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1197; SSE41-NEXT:    pmovsxbw %xmm3, %xmm31198; SSE41-NEXT:    paddw %xmm2, %xmm31199; SSE41-NEXT:    pmovsxbw %xmm1, %xmm11200; SSE41-NEXT:    pmovsxbw %xmm0, %xmm01201; SSE41-NEXT:    paddw %xmm1, %xmm01202; SSE41-NEXT:    paddw %xmm3, %xmm01203; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1204; SSE41-NEXT:    paddw %xmm0, %xmm11205; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1206; SSE41-NEXT:    paddw %xmm1, %xmm01207; SSE41-NEXT:    movdqa %xmm0, %xmm11208; SSE41-NEXT:    psrld $16, %xmm11209; SSE41-NEXT:    paddw %xmm0, %xmm11210; SSE41-NEXT:    movd %xmm1, %eax1211; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1212; SSE41-NEXT:    retq1213;1214; AVX1-SLOW-LABEL: test_v32i16_v32i8:1215; AVX1-SLOW:       # %bb.0:1216; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm11217; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1218; AVX1-SLOW-NEXT:    vpmovsxbw %xmm2, %xmm21219; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1220; AVX1-SLOW-NEXT:    vpmovsxbw %xmm3, %xmm31221; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm3, %xmm21222; AVX1-SLOW-NEXT:    vpmovsxbw %xmm1, %xmm11223; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm01224; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01225; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm0, %xmm01226; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1227; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01228; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1229; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01230; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm11231; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01232; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1233; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax1234; AVX1-SLOW-NEXT:    vzeroupper1235; AVX1-SLOW-NEXT:    retq1236;1237; AVX1-FAST-LABEL: test_v32i16_v32i8:1238; AVX1-FAST:       # %bb.0:1239; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm11240; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1241; AVX1-FAST-NEXT:    vpmovsxbw %xmm2, %xmm21242; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]1243; AVX1-FAST-NEXT:    vpmovsxbw %xmm3, %xmm31244; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm3, %xmm21245; AVX1-FAST-NEXT:    vpmovsxbw %xmm1, %xmm11246; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm01247; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01248; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm0, %xmm01249; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1250; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01251; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1252; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01253; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01254; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1255; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax1256; AVX1-FAST-NEXT:    vzeroupper1257; AVX1-FAST-NEXT:    retq1258;1259; AVX2-LABEL: test_v32i16_v32i8:1260; AVX2:       # %bb.0:1261; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11262; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm11263; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm01264; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm01265; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11266; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01267; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1268; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01269; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1270; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01271; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm11272; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01273; AVX2-NEXT:    vmovd %xmm0, %eax1274; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1275; AVX2-NEXT:    vzeroupper1276; AVX2-NEXT:    retq1277;1278; AVX512-LABEL: test_v32i16_v32i8:1279; AVX512:       # %bb.0:1280; AVX512-NEXT:    vpmovsxbw %ymm0, %zmm01281; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11282; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm01283; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11284; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01285; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1286; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01287; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1288; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01289; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm11290; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01291; AVX512-NEXT:    vmovd %xmm0, %eax1292; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1293; AVX512-NEXT:    vzeroupper1294; AVX512-NEXT:    retq1295  %1 = sext <32 x i8> %a0 to <32 x i16>1296  %2 = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %1)1297  ret i16 %21298}1299 1300define i16 @test_v64i16_v64i8(<64 x i8> %a0) {1301; SSE2-LABEL: test_v64i16_v64i8:1302; SSE2:       # %bb.0:1303; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm2[8],xmm4[9],xmm2[9],xmm4[10],xmm2[10],xmm4[11],xmm2[11],xmm4[12],xmm2[12],xmm4[13],xmm2[13],xmm4[14],xmm2[14],xmm4[15],xmm2[15]1304; SSE2-NEXT:    psraw $8, %xmm41305; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]1306; SSE2-NEXT:    psraw $8, %xmm51307; SSE2-NEXT:    paddw %xmm4, %xmm51308; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]1309; SSE2-NEXT:    psraw $8, %xmm41310; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]1311; SSE2-NEXT:    psraw $8, %xmm61312; SSE2-NEXT:    paddw %xmm4, %xmm61313; SSE2-NEXT:    paddw %xmm5, %xmm61314; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1315; SSE2-NEXT:    psraw $8, %xmm21316; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1317; SSE2-NEXT:    psraw $8, %xmm01318; SSE2-NEXT:    paddw %xmm2, %xmm01319; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]1320; SSE2-NEXT:    psraw $8, %xmm21321; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1322; SSE2-NEXT:    psraw $8, %xmm11323; SSE2-NEXT:    paddw %xmm2, %xmm11324; SSE2-NEXT:    paddw %xmm0, %xmm11325; SSE2-NEXT:    paddw %xmm6, %xmm11326; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1327; SSE2-NEXT:    paddw %xmm1, %xmm01328; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1329; SSE2-NEXT:    paddw %xmm0, %xmm11330; SSE2-NEXT:    movdqa %xmm1, %xmm01331; SSE2-NEXT:    psrld $16, %xmm01332; SSE2-NEXT:    paddw %xmm1, %xmm01333; SSE2-NEXT:    movd %xmm0, %eax1334; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1335; SSE2-NEXT:    retq1336;1337; SSE41-LABEL: test_v64i16_v64i8:1338; SSE41:       # %bb.0:1339; SSE41-NEXT:    pmovsxbw %xmm2, %xmm41340; SSE41-NEXT:    pmovsxbw %xmm0, %xmm51341; SSE41-NEXT:    paddw %xmm4, %xmm51342; SSE41-NEXT:    pmovsxbw %xmm3, %xmm41343; SSE41-NEXT:    pmovsxbw %xmm1, %xmm61344; SSE41-NEXT:    paddw %xmm4, %xmm61345; SSE41-NEXT:    paddw %xmm5, %xmm61346; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]1347; SSE41-NEXT:    pmovsxbw %xmm2, %xmm21348; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1349; SSE41-NEXT:    pmovsxbw %xmm0, %xmm01350; SSE41-NEXT:    paddw %xmm2, %xmm01351; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]1352; SSE41-NEXT:    pmovsxbw %xmm2, %xmm21353; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1354; SSE41-NEXT:    pmovsxbw %xmm1, %xmm11355; SSE41-NEXT:    paddw %xmm2, %xmm11356; SSE41-NEXT:    paddw %xmm0, %xmm11357; SSE41-NEXT:    paddw %xmm6, %xmm11358; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1359; SSE41-NEXT:    paddw %xmm1, %xmm01360; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1361; SSE41-NEXT:    paddw %xmm0, %xmm11362; SSE41-NEXT:    movdqa %xmm1, %xmm01363; SSE41-NEXT:    psrld $16, %xmm01364; SSE41-NEXT:    paddw %xmm1, %xmm01365; SSE41-NEXT:    movd %xmm0, %eax1366; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1367; SSE41-NEXT:    retq1368;1369; AVX1-SLOW-LABEL: test_v64i16_v64i8:1370; AVX1-SLOW:       # %bb.0:1371; AVX1-SLOW-NEXT:    vpmovsxbw %xmm1, %xmm21372; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm31373; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm3, %xmm21374; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm31375; AVX1-SLOW-NEXT:    vpmovsxbw %xmm3, %xmm41376; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm51377; AVX1-SLOW-NEXT:    vpmovsxbw %xmm5, %xmm61378; AVX1-SLOW-NEXT:    vpaddw %xmm4, %xmm6, %xmm41379; AVX1-SLOW-NEXT:    vpaddw %xmm4, %xmm2, %xmm21380; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1381; AVX1-SLOW-NEXT:    vpmovsxbw %xmm1, %xmm11382; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1383; AVX1-SLOW-NEXT:    vpmovsxbw %xmm0, %xmm01384; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01385; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]1386; AVX1-SLOW-NEXT:    vpmovsxbw %xmm1, %xmm11387; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]1388; AVX1-SLOW-NEXT:    vpmovsxbw %xmm3, %xmm31389; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm3, %xmm11390; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01391; AVX1-SLOW-NEXT:    vpaddw %xmm0, %xmm2, %xmm01392; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1393; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01394; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1395; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01396; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm11397; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01398; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1399; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax1400; AVX1-SLOW-NEXT:    vzeroupper1401; AVX1-SLOW-NEXT:    retq1402;1403; AVX1-FAST-LABEL: test_v64i16_v64i8:1404; AVX1-FAST:       # %bb.0:1405; AVX1-FAST-NEXT:    vpmovsxbw %xmm1, %xmm21406; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm31407; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm3, %xmm21408; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm31409; AVX1-FAST-NEXT:    vpmovsxbw %xmm3, %xmm41410; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm51411; AVX1-FAST-NEXT:    vpmovsxbw %xmm5, %xmm61412; AVX1-FAST-NEXT:    vpaddw %xmm4, %xmm6, %xmm41413; AVX1-FAST-NEXT:    vpaddw %xmm4, %xmm2, %xmm21414; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1415; AVX1-FAST-NEXT:    vpmovsxbw %xmm1, %xmm11416; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1417; AVX1-FAST-NEXT:    vpmovsxbw %xmm0, %xmm01418; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01419; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]1420; AVX1-FAST-NEXT:    vpmovsxbw %xmm1, %xmm11421; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm3 = xmm5[2,3,2,3]1422; AVX1-FAST-NEXT:    vpmovsxbw %xmm3, %xmm31423; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm3, %xmm11424; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01425; AVX1-FAST-NEXT:    vpaddw %xmm0, %xmm2, %xmm01426; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1427; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01428; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1429; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm01430; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01431; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1432; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax1433; AVX1-FAST-NEXT:    vzeroupper1434; AVX1-FAST-NEXT:    retq1435;1436; AVX2-LABEL: test_v64i16_v64i8:1437; AVX2:       # %bb.0:1438; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm21439; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm31440; AVX2-NEXT:    vpaddw %ymm2, %ymm3, %ymm21441; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm11442; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm11443; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01444; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm01445; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm01446; AVX2-NEXT:    vpaddw %ymm0, %ymm2, %ymm01447; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11448; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01449; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1450; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01451; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1452; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01453; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm11454; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01455; AVX2-NEXT:    vmovd %xmm0, %eax1456; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1457; AVX2-NEXT:    vzeroupper1458; AVX2-NEXT:    retq1459;1460; AVX512-LABEL: test_v64i16_v64i8:1461; AVX512:       # %bb.0:1462; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11463; AVX512-NEXT:    vpmovsxbw %ymm1, %zmm11464; AVX512-NEXT:    vpmovsxbw %ymm0, %zmm01465; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm01466; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11467; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm01468; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11469; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01470; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1471; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01472; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1473; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01474; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm11475; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01476; AVX512-NEXT:    vmovd %xmm0, %eax1477; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1478; AVX512-NEXT:    vzeroupper1479; AVX512-NEXT:    retq1480  %1 = sext <64 x i8> %a0 to <64 x i16>1481  %2 = call i16 @llvm.vector.reduce.add.v64i16(<64 x i16> %1)1482  ret i16 %21483 1484}1485 1486;1487; vXi1 - sum of extended bool vectors1488;1489 1490define i64 @test_v2i64_v2i1(<2 x i64> %a0) {1491; SSE2-LABEL: test_v2i64_v2i1:1492; SSE2:       # %bb.0:1493; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1494; SSE2-NEXT:    pxor %xmm1, %xmm11495; SSE2-NEXT:    pcmpgtd %xmm0, %xmm11496; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1497; SSE2-NEXT:    paddq %xmm1, %xmm01498; SSE2-NEXT:    movq %xmm0, %rax1499; SSE2-NEXT:    retq1500;1501; SSE41-LABEL: test_v2i64_v2i1:1502; SSE41:       # %bb.0:1503; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1504; SSE41-NEXT:    pxor %xmm1, %xmm11505; SSE41-NEXT:    pcmpgtd %xmm0, %xmm11506; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1507; SSE41-NEXT:    paddq %xmm1, %xmm01508; SSE41-NEXT:    movq %xmm0, %rax1509; SSE41-NEXT:    retq1510;1511; AVX-LABEL: test_v2i64_v2i1:1512; AVX:       # %bb.0:1513; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11514; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm01515; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1516; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm01517; AVX-NEXT:    vmovq %xmm0, %rax1518; AVX-NEXT:    retq1519  %1 = icmp slt <2 x i64> %a0, zeroinitializer1520  %2 = sext <2 x i1> %1 to <2 x i64>1521  %3 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %2)1522  ret i64 %31523}1524 1525define i32 @test_v4i32_v4i1(<4 x i32> %a0) {1526; SSE2-LABEL: test_v4i32_v4i1:1527; SSE2:       # %bb.0:1528; SSE2-NEXT:    pxor %xmm1, %xmm11529; SSE2-NEXT:    pcmpgtd %xmm0, %xmm11530; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1531; SSE2-NEXT:    paddd %xmm1, %xmm01532; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1533; SSE2-NEXT:    paddd %xmm0, %xmm11534; SSE2-NEXT:    movd %xmm1, %eax1535; SSE2-NEXT:    retq1536;1537; SSE41-LABEL: test_v4i32_v4i1:1538; SSE41:       # %bb.0:1539; SSE41-NEXT:    pxor %xmm1, %xmm11540; SSE41-NEXT:    pcmpgtd %xmm0, %xmm11541; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1542; SSE41-NEXT:    paddd %xmm1, %xmm01543; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1544; SSE41-NEXT:    paddd %xmm0, %xmm11545; SSE41-NEXT:    movd %xmm1, %eax1546; SSE41-NEXT:    retq1547;1548; AVX1-SLOW-LABEL: test_v4i32_v4i1:1549; AVX1-SLOW:       # %bb.0:1550; AVX1-SLOW-NEXT:    vpxor %xmm1, %xmm1, %xmm11551; AVX1-SLOW-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm01552; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1553; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm01554; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1555; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm01556; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1557; AVX1-SLOW-NEXT:    retq1558;1559; AVX1-FAST-LABEL: test_v4i32_v4i1:1560; AVX1-FAST:       # %bb.0:1561; AVX1-FAST-NEXT:    vpxor %xmm1, %xmm1, %xmm11562; AVX1-FAST-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm01563; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm01564; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm01565; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1566; AVX1-FAST-NEXT:    retq1567;1568; AVX2-LABEL: test_v4i32_v4i1:1569; AVX2:       # %bb.0:1570; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11571; AVX2-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm01572; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1573; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01574; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1575; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01576; AVX2-NEXT:    vmovd %xmm0, %eax1577; AVX2-NEXT:    retq1578;1579; AVX512-LABEL: test_v4i32_v4i1:1580; AVX512:       # %bb.0:1581; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11582; AVX512-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm01583; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1584; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01585; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1586; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01587; AVX512-NEXT:    vmovd %xmm0, %eax1588; AVX512-NEXT:    retq1589  %1 = icmp slt <4 x i32> %a0, zeroinitializer1590  %2 = sext <4 x i1> %1 to <4 x i32>1591  %3 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %2)1592  ret i32 %31593}1594 1595define i16 @test_v8i16_v8i1(<8 x i16> %a0) {1596; SSE2-LABEL: test_v8i16_v8i1:1597; SSE2:       # %bb.0:1598; SSE2-NEXT:    pxor %xmm1, %xmm11599; SSE2-NEXT:    pcmpgtw %xmm0, %xmm11600; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1601; SSE2-NEXT:    paddw %xmm1, %xmm01602; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1603; SSE2-NEXT:    paddw %xmm0, %xmm11604; SSE2-NEXT:    movdqa %xmm1, %xmm01605; SSE2-NEXT:    psrld $16, %xmm01606; SSE2-NEXT:    paddw %xmm1, %xmm01607; SSE2-NEXT:    movd %xmm0, %eax1608; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax1609; SSE2-NEXT:    retq1610;1611; SSE41-LABEL: test_v8i16_v8i1:1612; SSE41:       # %bb.0:1613; SSE41-NEXT:    pxor %xmm1, %xmm11614; SSE41-NEXT:    pcmpgtw %xmm0, %xmm11615; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1616; SSE41-NEXT:    paddw %xmm1, %xmm01617; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1618; SSE41-NEXT:    paddw %xmm0, %xmm11619; SSE41-NEXT:    movdqa %xmm1, %xmm01620; SSE41-NEXT:    psrld $16, %xmm01621; SSE41-NEXT:    paddw %xmm1, %xmm01622; SSE41-NEXT:    movd %xmm0, %eax1623; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax1624; SSE41-NEXT:    retq1625;1626; AVX1-SLOW-LABEL: test_v8i16_v8i1:1627; AVX1-SLOW:       # %bb.0:1628; AVX1-SLOW-NEXT:    vpxor %xmm1, %xmm1, %xmm11629; AVX1-SLOW-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm01630; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1631; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01632; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1633; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01634; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm11635; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm01636; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax1637; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax1638; AVX1-SLOW-NEXT:    retq1639;1640; AVX1-FAST-LABEL: test_v8i16_v8i1:1641; AVX1-FAST:       # %bb.0:1642; AVX1-FAST-NEXT:    vpxor %xmm1, %xmm1, %xmm11643; AVX1-FAST-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm01644; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01645; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01646; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm01647; AVX1-FAST-NEXT:    vmovd %xmm0, %eax1648; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax1649; AVX1-FAST-NEXT:    retq1650;1651; AVX2-LABEL: test_v8i16_v8i1:1652; AVX2:       # %bb.0:1653; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11654; AVX2-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm01655; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1656; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01657; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1658; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01659; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm11660; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm01661; AVX2-NEXT:    vmovd %xmm0, %eax1662; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax1663; AVX2-NEXT:    retq1664;1665; AVX512-LABEL: test_v8i16_v8i1:1666; AVX512:       # %bb.0:1667; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11668; AVX512-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm01669; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1670; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01671; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1672; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01673; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm11674; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm01675; AVX512-NEXT:    vmovd %xmm0, %eax1676; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax1677; AVX512-NEXT:    retq1678  %1 = icmp slt <8 x i16> %a0, zeroinitializer1679  %2 = sext <8 x i1> %1 to <8 x i16>1680  %3 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %2)1681  ret i16 %31682}1683 1684define i8 @test_v16i8_v16i1(<16 x i8> %a0) {1685; SSE2-LABEL: test_v16i8_v16i1:1686; SSE2:       # %bb.0:1687; SSE2-NEXT:    pxor %xmm1, %xmm11688; SSE2-NEXT:    pxor %xmm2, %xmm21689; SSE2-NEXT:    pcmpgtb %xmm0, %xmm21690; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]1691; SSE2-NEXT:    paddb %xmm2, %xmm01692; SSE2-NEXT:    psadbw %xmm1, %xmm01693; SSE2-NEXT:    movd %xmm0, %eax1694; SSE2-NEXT:    # kill: def $al killed $al killed $eax1695; SSE2-NEXT:    retq1696;1697; SSE41-LABEL: test_v16i8_v16i1:1698; SSE41:       # %bb.0:1699; SSE41-NEXT:    pxor %xmm1, %xmm11700; SSE41-NEXT:    pxor %xmm2, %xmm21701; SSE41-NEXT:    pcmpgtb %xmm0, %xmm21702; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]1703; SSE41-NEXT:    paddb %xmm2, %xmm01704; SSE41-NEXT:    psadbw %xmm1, %xmm01705; SSE41-NEXT:    movd %xmm0, %eax1706; SSE41-NEXT:    # kill: def $al killed $al killed $eax1707; SSE41-NEXT:    retq1708;1709; AVX-LABEL: test_v16i8_v16i1:1710; AVX:       # %bb.0:1711; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11712; AVX-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm01713; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]1714; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm01715; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01716; AVX-NEXT:    vmovd %xmm0, %eax1717; AVX-NEXT:    # kill: def $al killed $al killed $eax1718; AVX-NEXT:    retq1719  %1 = icmp slt <16 x i8> %a0, zeroinitializer1720  %2 = sext <16 x i1> %1 to <16 x i8>1721  %3 = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %2)1722  ret i8 %31723}1724 1725define i8 @test_v32i8_v32i1(<32 x i8> %a0) {1726; SSE2-LABEL: test_v32i8_v32i1:1727; SSE2:       # %bb.0:1728; SSE2-NEXT:    pxor %xmm2, %xmm21729; SSE2-NEXT:    pxor %xmm3, %xmm31730; SSE2-NEXT:    pcmpgtb %xmm1, %xmm31731; SSE2-NEXT:    pxor %xmm1, %xmm11732; SSE2-NEXT:    pcmpgtb %xmm0, %xmm11733; SSE2-NEXT:    paddb %xmm3, %xmm11734; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1735; SSE2-NEXT:    paddb %xmm1, %xmm01736; SSE2-NEXT:    psadbw %xmm2, %xmm01737; SSE2-NEXT:    movd %xmm0, %eax1738; SSE2-NEXT:    # kill: def $al killed $al killed $eax1739; SSE2-NEXT:    retq1740;1741; SSE41-LABEL: test_v32i8_v32i1:1742; SSE41:       # %bb.0:1743; SSE41-NEXT:    pxor %xmm2, %xmm21744; SSE41-NEXT:    pxor %xmm3, %xmm31745; SSE41-NEXT:    pcmpgtb %xmm1, %xmm31746; SSE41-NEXT:    pxor %xmm1, %xmm11747; SSE41-NEXT:    pcmpgtb %xmm0, %xmm11748; SSE41-NEXT:    paddb %xmm3, %xmm11749; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1750; SSE41-NEXT:    paddb %xmm1, %xmm01751; SSE41-NEXT:    psadbw %xmm2, %xmm01752; SSE41-NEXT:    movd %xmm0, %eax1753; SSE41-NEXT:    # kill: def $al killed $al killed $eax1754; SSE41-NEXT:    retq1755;1756; AVX1-LABEL: test_v32i8_v32i1:1757; AVX1:       # %bb.0:1758; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11759; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21760; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm11761; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm01762; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01763; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1764; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01765; AVX1-NEXT:    vpsadbw %xmm2, %xmm0, %xmm01766; AVX1-NEXT:    vmovd %xmm0, %eax1767; AVX1-NEXT:    # kill: def $al killed $al killed $eax1768; AVX1-NEXT:    vzeroupper1769; AVX1-NEXT:    retq1770;1771; AVX2-LABEL: test_v32i8_v32i1:1772; AVX2:       # %bb.0:1773; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11774; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm01775; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11776; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01777; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1778; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01779; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11780; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01781; AVX2-NEXT:    vmovd %xmm0, %eax1782; AVX2-NEXT:    # kill: def $al killed $al killed $eax1783; AVX2-NEXT:    vzeroupper1784; AVX2-NEXT:    retq1785;1786; AVX512-LABEL: test_v32i8_v32i1:1787; AVX512:       # %bb.0:1788; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11789; AVX512-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm01790; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11791; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01792; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1793; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01794; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11795; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01796; AVX512-NEXT:    vmovd %xmm0, %eax1797; AVX512-NEXT:    # kill: def $al killed $al killed $eax1798; AVX512-NEXT:    vzeroupper1799; AVX512-NEXT:    retq1800  %1 = icmp slt <32 x i8> %a0, zeroinitializer1801  %2 = sext <32 x i1> %1 to <32 x i8>1802  %3 = call i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %2)1803  ret i8 %31804}1805 1806define i8 @test_v64i8_v64i1(<64 x i8> %a0) {1807; SSE2-LABEL: test_v64i8_v64i1:1808; SSE2:       # %bb.0:1809; SSE2-NEXT:    pxor %xmm4, %xmm41810; SSE2-NEXT:    pxor %xmm5, %xmm51811; SSE2-NEXT:    pcmpgtb %xmm2, %xmm51812; SSE2-NEXT:    pxor %xmm2, %xmm21813; SSE2-NEXT:    pcmpgtb %xmm0, %xmm21814; SSE2-NEXT:    paddb %xmm5, %xmm21815; SSE2-NEXT:    pxor %xmm0, %xmm01816; SSE2-NEXT:    pcmpgtb %xmm3, %xmm01817; SSE2-NEXT:    pxor %xmm3, %xmm31818; SSE2-NEXT:    pcmpgtb %xmm1, %xmm31819; SSE2-NEXT:    paddb %xmm0, %xmm31820; SSE2-NEXT:    paddb %xmm2, %xmm31821; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]1822; SSE2-NEXT:    paddb %xmm3, %xmm01823; SSE2-NEXT:    psadbw %xmm4, %xmm01824; SSE2-NEXT:    movd %xmm0, %eax1825; SSE2-NEXT:    # kill: def $al killed $al killed $eax1826; SSE2-NEXT:    retq1827;1828; SSE41-LABEL: test_v64i8_v64i1:1829; SSE41:       # %bb.0:1830; SSE41-NEXT:    pxor %xmm4, %xmm41831; SSE41-NEXT:    pxor %xmm5, %xmm51832; SSE41-NEXT:    pcmpgtb %xmm2, %xmm51833; SSE41-NEXT:    pxor %xmm2, %xmm21834; SSE41-NEXT:    pcmpgtb %xmm0, %xmm21835; SSE41-NEXT:    paddb %xmm5, %xmm21836; SSE41-NEXT:    pxor %xmm0, %xmm01837; SSE41-NEXT:    pcmpgtb %xmm3, %xmm01838; SSE41-NEXT:    pxor %xmm3, %xmm31839; SSE41-NEXT:    pcmpgtb %xmm1, %xmm31840; SSE41-NEXT:    paddb %xmm0, %xmm31841; SSE41-NEXT:    paddb %xmm2, %xmm31842; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]1843; SSE41-NEXT:    paddb %xmm3, %xmm01844; SSE41-NEXT:    psadbw %xmm4, %xmm01845; SSE41-NEXT:    movd %xmm0, %eax1846; SSE41-NEXT:    # kill: def $al killed $al killed $eax1847; SSE41-NEXT:    retq1848;1849; AVX1-LABEL: test_v64i8_v64i1:1850; AVX1:       # %bb.0:1851; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21852; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm31853; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm41854; AVX1-NEXT:    vpaddb %xmm3, %xmm4, %xmm31855; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11856; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm2, %xmm11857; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01858; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm2, %xmm01859; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01860; AVX1-NEXT:    vpaddb %xmm0, %xmm3, %xmm01861; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1862; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01863; AVX1-NEXT:    vpsadbw %xmm2, %xmm0, %xmm01864; AVX1-NEXT:    vmovd %xmm0, %eax1865; AVX1-NEXT:    # kill: def $al killed $al killed $eax1866; AVX1-NEXT:    vzeroupper1867; AVX1-NEXT:    retq1868;1869; AVX2-LABEL: test_v64i8_v64i1:1870; AVX2:       # %bb.0:1871; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21872; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm2, %ymm11873; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm2, %ymm01874; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm01875; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11876; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01877; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1878; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01879; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11880; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01881; AVX2-NEXT:    vmovd %xmm0, %eax1882; AVX2-NEXT:    # kill: def $al killed $al killed $eax1883; AVX2-NEXT:    vzeroupper1884; AVX2-NEXT:    retq1885;1886; AVX512-LABEL: test_v64i8_v64i1:1887; AVX512:       # %bb.0:1888; AVX512-NEXT:    vpmovb2m %zmm0, %k01889; AVX512-NEXT:    vpmovm2b %k0, %zmm01890; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11891; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm01892; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11893; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01894; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1895; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01896; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11897; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01898; AVX512-NEXT:    vmovd %xmm0, %eax1899; AVX512-NEXT:    # kill: def $al killed $al killed $eax1900; AVX512-NEXT:    vzeroupper1901; AVX512-NEXT:    retq1902  %1 = icmp slt <64 x i8> %a0, zeroinitializer1903  %2 = sext <64 x i1> %1 to <64 x i8>1904  %3 = call i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %2)1905  ret i8 %31906}1907 1908define i8 @test_v128i8_v128i1(<128 x i8> %a0) {1909; SSE2-LABEL: test_v128i8_v128i1:1910; SSE2:       # %bb.0:1911; SSE2-NEXT:    pxor %xmm8, %xmm81912; SSE2-NEXT:    pxor %xmm9, %xmm91913; SSE2-NEXT:    pcmpgtb %xmm4, %xmm91914; SSE2-NEXT:    pxor %xmm4, %xmm41915; SSE2-NEXT:    pcmpgtb %xmm0, %xmm41916; SSE2-NEXT:    paddb %xmm9, %xmm41917; SSE2-NEXT:    pxor %xmm0, %xmm01918; SSE2-NEXT:    pcmpgtb %xmm6, %xmm01919; SSE2-NEXT:    pxor %xmm6, %xmm61920; SSE2-NEXT:    pcmpgtb %xmm2, %xmm61921; SSE2-NEXT:    paddb %xmm0, %xmm61922; SSE2-NEXT:    paddb %xmm4, %xmm61923; SSE2-NEXT:    pxor %xmm0, %xmm01924; SSE2-NEXT:    pcmpgtb %xmm5, %xmm01925; SSE2-NEXT:    pxor %xmm2, %xmm21926; SSE2-NEXT:    pcmpgtb %xmm1, %xmm21927; SSE2-NEXT:    paddb %xmm0, %xmm21928; SSE2-NEXT:    pxor %xmm0, %xmm01929; SSE2-NEXT:    pcmpgtb %xmm7, %xmm01930; SSE2-NEXT:    pxor %xmm1, %xmm11931; SSE2-NEXT:    pcmpgtb %xmm3, %xmm11932; SSE2-NEXT:    paddb %xmm0, %xmm11933; SSE2-NEXT:    paddb %xmm2, %xmm11934; SSE2-NEXT:    paddb %xmm6, %xmm11935; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1936; SSE2-NEXT:    paddb %xmm1, %xmm01937; SSE2-NEXT:    psadbw %xmm8, %xmm01938; SSE2-NEXT:    movd %xmm0, %eax1939; SSE2-NEXT:    # kill: def $al killed $al killed $eax1940; SSE2-NEXT:    retq1941;1942; SSE41-LABEL: test_v128i8_v128i1:1943; SSE41:       # %bb.0:1944; SSE41-NEXT:    pxor %xmm8, %xmm81945; SSE41-NEXT:    pxor %xmm9, %xmm91946; SSE41-NEXT:    pcmpgtb %xmm4, %xmm91947; SSE41-NEXT:    pxor %xmm4, %xmm41948; SSE41-NEXT:    pcmpgtb %xmm0, %xmm41949; SSE41-NEXT:    paddb %xmm9, %xmm41950; SSE41-NEXT:    pxor %xmm0, %xmm01951; SSE41-NEXT:    pcmpgtb %xmm6, %xmm01952; SSE41-NEXT:    pxor %xmm6, %xmm61953; SSE41-NEXT:    pcmpgtb %xmm2, %xmm61954; SSE41-NEXT:    paddb %xmm0, %xmm61955; SSE41-NEXT:    paddb %xmm4, %xmm61956; SSE41-NEXT:    pxor %xmm0, %xmm01957; SSE41-NEXT:    pcmpgtb %xmm5, %xmm01958; SSE41-NEXT:    pxor %xmm2, %xmm21959; SSE41-NEXT:    pcmpgtb %xmm1, %xmm21960; SSE41-NEXT:    paddb %xmm0, %xmm21961; SSE41-NEXT:    pxor %xmm0, %xmm01962; SSE41-NEXT:    pcmpgtb %xmm7, %xmm01963; SSE41-NEXT:    pxor %xmm1, %xmm11964; SSE41-NEXT:    pcmpgtb %xmm3, %xmm11965; SSE41-NEXT:    paddb %xmm0, %xmm11966; SSE41-NEXT:    paddb %xmm2, %xmm11967; SSE41-NEXT:    paddb %xmm6, %xmm11968; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1969; SSE41-NEXT:    paddb %xmm1, %xmm01970; SSE41-NEXT:    psadbw %xmm8, %xmm01971; SSE41-NEXT:    movd %xmm0, %eax1972; SSE41-NEXT:    # kill: def $al killed $al killed $eax1973; SSE41-NEXT:    retq1974;1975; AVX1-LABEL: test_v128i8_v128i1:1976; AVX1:       # %bb.0:1977; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm41978; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm4, %xmm51979; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm4, %xmm61980; AVX1-NEXT:    vpaddb %xmm5, %xmm6, %xmm51981; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm4, %xmm61982; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm4, %xmm71983; AVX1-NEXT:    vpaddb %xmm6, %xmm7, %xmm61984; AVX1-NEXT:    vpaddb %xmm6, %xmm5, %xmm51985; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm21986; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm4, %xmm21987; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01988; AVX1-NEXT:    vpcmpgtb %xmm0, %xmm4, %xmm01989; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm01990; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm21991; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm4, %xmm21992; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm11993; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm4, %xmm11994; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm11995; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01996; AVX1-NEXT:    vpaddb %xmm0, %xmm5, %xmm01997; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1998; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01999; AVX1-NEXT:    vpsadbw %xmm4, %xmm0, %xmm02000; AVX1-NEXT:    vmovd %xmm0, %eax2001; AVX1-NEXT:    # kill: def $al killed $al killed $eax2002; AVX1-NEXT:    vzeroupper2003; AVX1-NEXT:    retq2004;2005; AVX2-LABEL: test_v128i8_v128i1:2006; AVX2:       # %bb.0:2007; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm42008; AVX2-NEXT:    vpcmpgtb %ymm2, %ymm4, %ymm22009; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm4, %ymm02010; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm02011; AVX2-NEXT:    vpcmpgtb %ymm3, %ymm4, %ymm22012; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm4, %ymm12013; AVX2-NEXT:    vpaddb %ymm2, %ymm1, %ymm12014; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm02015; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm12016; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm02017; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2018; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm02019; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm12020; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm02021; AVX2-NEXT:    vmovd %xmm0, %eax2022; AVX2-NEXT:    # kill: def $al killed $al killed $eax2023; AVX2-NEXT:    vzeroupper2024; AVX2-NEXT:    retq2025;2026; AVX512-LABEL: test_v128i8_v128i1:2027; AVX512:       # %bb.0:2028; AVX512-NEXT:    vpmovb2m %zmm0, %k02029; AVX512-NEXT:    vpmovb2m %zmm1, %k12030; AVX512-NEXT:    vpmovm2b %k1, %zmm02031; AVX512-NEXT:    vpmovm2b %k0, %zmm12032; AVX512-NEXT:    vpaddb %zmm0, %zmm1, %zmm02033; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm12034; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm02035; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm12036; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm02037; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2038; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm02039; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm12040; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm02041; AVX512-NEXT:    vmovd %xmm0, %eax2042; AVX512-NEXT:    # kill: def $al killed $al killed $eax2043; AVX512-NEXT:    vzeroupper2044; AVX512-NEXT:    retq2045  %1 = icmp slt <128 x i8> %a0, zeroinitializer2046  %2 = sext <128 x i1> %1 to <128 x i8>2047  %3 = call i8 @llvm.vector.reduce.add.v128i8(<128 x i8> %2)2048  ret i8 %32049}2050 2051declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)2052declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)2053declare i64 @llvm.vector.reduce.add.v8i64(<8 x i64>)2054declare i64 @llvm.vector.reduce.add.v16i64(<16 x i64>)2055 2056declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>)2057declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)2058declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)2059declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>)2060declare i32 @llvm.vector.reduce.add.v32i32(<32 x i32>)2061 2062declare i16 @llvm.vector.reduce.add.v2i16(<2 x i16>)2063declare i16 @llvm.vector.reduce.add.v4i16(<4 x i16>)2064declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)2065declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>)2066declare i16 @llvm.vector.reduce.add.v32i16(<32 x i16>)2067declare i16 @llvm.vector.reduce.add.v64i16(<64 x i16>)2068 2069declare i8 @llvm.vector.reduce.add.v2i8(<2 x i8>)2070declare i8 @llvm.vector.reduce.add.v4i8(<4 x i8>)2071declare i8 @llvm.vector.reduce.add.v8i8(<8 x i8>)2072declare i8 @llvm.vector.reduce.add.v16i8(<16 x i8>)2073declare i8 @llvm.vector.reduce.add.v32i8(<32 x i8>)2074declare i8 @llvm.vector.reduce.add.v64i8(<64 x i8>)2075declare i8 @llvm.vector.reduce.add.v128i8(<128 x i8>)2076