brintos

brintos / llvm-project-archived public Read only

0
0
Text · 48.3 KiB · aed4e02 Raw
1401 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=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,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-prefix=AVX5128; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX5129 10;11; vXi6412;13 14define i64 @test_v2i64(<2 x i64> %a0) {15; SSE-LABEL: test_v2i64:16; SSE:       # %bb.0:17; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]18; SSE-NEXT:    paddq %xmm0, %xmm119; SSE-NEXT:    movq %xmm1, %rax20; SSE-NEXT:    retq21;22; AVX-LABEL: test_v2i64:23; AVX:       # %bb.0:24; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]25; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm026; AVX-NEXT:    vmovq %xmm0, %rax27; AVX-NEXT:    retq28;29; AVX512-LABEL: test_v2i64:30; AVX512:       # %bb.0:31; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]32; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm033; AVX512-NEXT:    vmovq %xmm0, %rax34; AVX512-NEXT:    retq35  %1 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %a0)36  ret i64 %137}38 39define i64 @test_v4i64(<4 x i64> %a0) {40; SSE-LABEL: test_v4i64:41; SSE:       # %bb.0:42; SSE-NEXT:    paddq %xmm1, %xmm043; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]44; SSE-NEXT:    paddq %xmm0, %xmm145; SSE-NEXT:    movq %xmm1, %rax46; SSE-NEXT:    retq47;48; AVX1-LABEL: test_v4i64:49; AVX1:       # %bb.0:50; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm151; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm052; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]53; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm054; AVX1-NEXT:    vmovq %xmm0, %rax55; AVX1-NEXT:    vzeroupper56; AVX1-NEXT:    retq57;58; AVX2-LABEL: test_v4i64:59; AVX2:       # %bb.0:60; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm161; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm062; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]63; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm064; AVX2-NEXT:    vmovq %xmm0, %rax65; AVX2-NEXT:    vzeroupper66; AVX2-NEXT:    retq67;68; AVX512-LABEL: test_v4i64:69; AVX512:       # %bb.0:70; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm171; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm072; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]73; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm074; AVX512-NEXT:    vmovq %xmm0, %rax75; AVX512-NEXT:    vzeroupper76; AVX512-NEXT:    retq77  %1 = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %a0)78  ret i64 %179}80 81define i64 @test_v8i64(<8 x i64> %a0) {82; SSE-LABEL: test_v8i64:83; SSE:       # %bb.0:84; SSE-NEXT:    paddq %xmm3, %xmm185; SSE-NEXT:    paddq %xmm2, %xmm086; SSE-NEXT:    paddq %xmm1, %xmm087; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]88; SSE-NEXT:    paddq %xmm0, %xmm189; SSE-NEXT:    movq %xmm1, %rax90; SSE-NEXT:    retq91;92; AVX1-LABEL: test_v8i64:93; AVX1:       # %bb.0:94; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm295; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm396; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm297; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm098; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm099; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]100; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0101; AVX1-NEXT:    vmovq %xmm0, %rax102; AVX1-NEXT:    vzeroupper103; AVX1-NEXT:    retq104;105; AVX2-LABEL: test_v8i64:106; AVX2:       # %bb.0:107; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0108; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1109; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0110; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]111; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0112; AVX2-NEXT:    vmovq %xmm0, %rax113; AVX2-NEXT:    vzeroupper114; AVX2-NEXT:    retq115;116; AVX512-LABEL: test_v8i64:117; AVX512:       # %bb.0:118; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1119; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0120; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1121; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0122; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]123; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0124; AVX512-NEXT:    vmovq %xmm0, %rax125; AVX512-NEXT:    vzeroupper126; AVX512-NEXT:    retq127  %1 = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %a0)128  ret i64 %1129}130 131define i64 @test_v16i64(<16 x i64> %a0) {132; SSE-LABEL: test_v16i64:133; SSE:       # %bb.0:134; SSE-NEXT:    paddq %xmm6, %xmm2135; SSE-NEXT:    paddq %xmm4, %xmm0136; SSE-NEXT:    paddq %xmm2, %xmm0137; SSE-NEXT:    paddq %xmm7, %xmm3138; SSE-NEXT:    paddq %xmm5, %xmm1139; SSE-NEXT:    paddq %xmm3, %xmm1140; SSE-NEXT:    paddq %xmm0, %xmm1141; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]142; SSE-NEXT:    paddq %xmm1, %xmm0143; SSE-NEXT:    movq %xmm0, %rax144; SSE-NEXT:    retq145;146; AVX1-LABEL: test_v16i64:147; AVX1:       # %bb.0:148; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm4149; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm5150; AVX1-NEXT:    vpaddq %xmm4, %xmm5, %xmm4151; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3152; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1153; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1154; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2155; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0156; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0157; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0158; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0159; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]160; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0161; AVX1-NEXT:    vmovq %xmm0, %rax162; AVX1-NEXT:    vzeroupper163; AVX1-NEXT:    retq164;165; AVX2-LABEL: test_v16i64:166; AVX2:       # %bb.0:167; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1168; AVX2-NEXT:    vpaddq %ymm2, %ymm0, %ymm0169; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0170; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1171; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0172; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]173; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0174; AVX2-NEXT:    vmovq %xmm0, %rax175; AVX2-NEXT:    vzeroupper176; AVX2-NEXT:    retq177;178; AVX512-LABEL: test_v16i64:179; AVX512:       # %bb.0:180; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0181; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1182; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0183; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1184; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0185; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]186; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0187; AVX512-NEXT:    vmovq %xmm0, %rax188; AVX512-NEXT:    vzeroupper189; AVX512-NEXT:    retq190  %1 = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> %a0)191  ret i64 %1192}193 194;195; vXi32196;197 198define i32 @test_v2i32(<2 x i32> %a0) {199; SSE-LABEL: test_v2i32:200; SSE:       # %bb.0:201; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]202; SSE-NEXT:    paddd %xmm0, %xmm1203; SSE-NEXT:    movd %xmm1, %eax204; SSE-NEXT:    retq205;206; AVX1-SLOW-LABEL: test_v2i32:207; AVX1-SLOW:       # %bb.0:208; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]209; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0210; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax211; AVX1-SLOW-NEXT:    retq212;213; AVX1-FAST-LABEL: test_v2i32:214; AVX1-FAST:       # %bb.0:215; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0216; AVX1-FAST-NEXT:    vmovd %xmm0, %eax217; AVX1-FAST-NEXT:    retq218;219; AVX2-LABEL: test_v2i32:220; AVX2:       # %bb.0:221; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]222; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0223; AVX2-NEXT:    vmovd %xmm0, %eax224; AVX2-NEXT:    retq225;226; AVX512-LABEL: test_v2i32:227; AVX512:       # %bb.0:228; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]229; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0230; AVX512-NEXT:    vmovd %xmm0, %eax231; AVX512-NEXT:    retq232  %1 = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a0)233  ret i32 %1234}235 236define i32 @test_v4i32(<4 x i32> %a0) {237; SSE-LABEL: test_v4i32:238; SSE:       # %bb.0:239; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]240; SSE-NEXT:    paddd %xmm0, %xmm1241; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]242; SSE-NEXT:    paddd %xmm1, %xmm0243; SSE-NEXT:    movd %xmm0, %eax244; SSE-NEXT:    retq245;246; AVX1-SLOW-LABEL: test_v4i32:247; AVX1-SLOW:       # %bb.0:248; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]249; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0250; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]251; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0252; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax253; AVX1-SLOW-NEXT:    retq254;255; AVX1-FAST-LABEL: test_v4i32:256; AVX1-FAST:       # %bb.0:257; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0258; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0259; AVX1-FAST-NEXT:    vmovd %xmm0, %eax260; AVX1-FAST-NEXT:    retq261;262; AVX2-LABEL: test_v4i32:263; AVX2:       # %bb.0:264; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]265; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0266; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]267; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0268; AVX2-NEXT:    vmovd %xmm0, %eax269; AVX2-NEXT:    retq270;271; AVX512-LABEL: test_v4i32:272; AVX512:       # %bb.0:273; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]274; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0275; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]276; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0277; AVX512-NEXT:    vmovd %xmm0, %eax278; AVX512-NEXT:    retq279  %1 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %a0)280  ret i32 %1281}282 283define i32 @test_v8i32(<8 x i32> %a0) {284; SSE-LABEL: test_v8i32:285; SSE:       # %bb.0:286; SSE-NEXT:    paddd %xmm1, %xmm0287; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]288; SSE-NEXT:    paddd %xmm0, %xmm1289; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]290; SSE-NEXT:    paddd %xmm1, %xmm0291; SSE-NEXT:    movd %xmm0, %eax292; SSE-NEXT:    retq293;294; AVX1-SLOW-LABEL: test_v8i32:295; AVX1-SLOW:       # %bb.0:296; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1297; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0298; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]299; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0300; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]301; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0302; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax303; AVX1-SLOW-NEXT:    vzeroupper304; AVX1-SLOW-NEXT:    retq305;306; AVX1-FAST-LABEL: test_v8i32:307; AVX1-FAST:       # %bb.0:308; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1309; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm1, %xmm0310; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0311; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0312; AVX1-FAST-NEXT:    vmovd %xmm0, %eax313; AVX1-FAST-NEXT:    vzeroupper314; AVX1-FAST-NEXT:    retq315;316; AVX2-LABEL: test_v8i32:317; AVX2:       # %bb.0:318; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1319; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0320; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]321; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0322; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]323; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0324; AVX2-NEXT:    vmovd %xmm0, %eax325; AVX2-NEXT:    vzeroupper326; AVX2-NEXT:    retq327;328; AVX512-LABEL: test_v8i32:329; AVX512:       # %bb.0:330; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1331; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0332; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]333; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0334; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]335; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0336; AVX512-NEXT:    vmovd %xmm0, %eax337; AVX512-NEXT:    vzeroupper338; AVX512-NEXT:    retq339  %1 = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a0)340  ret i32 %1341}342 343define i32 @test_v16i32(<16 x i32> %a0) {344; SSE-LABEL: test_v16i32:345; SSE:       # %bb.0:346; SSE-NEXT:    paddd %xmm3, %xmm1347; SSE-NEXT:    paddd %xmm2, %xmm0348; SSE-NEXT:    paddd %xmm1, %xmm0349; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]350; SSE-NEXT:    paddd %xmm0, %xmm1351; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]352; SSE-NEXT:    paddd %xmm1, %xmm0353; SSE-NEXT:    movd %xmm0, %eax354; SSE-NEXT:    retq355;356; AVX1-SLOW-LABEL: test_v16i32:357; AVX1-SLOW:       # %bb.0:358; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2359; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3360; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm3, %xmm2361; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0362; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0363; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]364; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0365; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]366; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0367; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax368; AVX1-SLOW-NEXT:    vzeroupper369; AVX1-SLOW-NEXT:    retq370;371; AVX1-FAST-LABEL: test_v16i32:372; AVX1-FAST:       # %bb.0:373; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm2374; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm3375; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm3, %xmm2376; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0377; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0378; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]379; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0380; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0381; AVX1-FAST-NEXT:    vmovd %xmm0, %eax382; AVX1-FAST-NEXT:    vzeroupper383; AVX1-FAST-NEXT:    retq384;385; AVX2-LABEL: test_v16i32:386; AVX2:       # %bb.0:387; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0388; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1389; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0390; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]391; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0392; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]393; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0394; AVX2-NEXT:    vmovd %xmm0, %eax395; AVX2-NEXT:    vzeroupper396; AVX2-NEXT:    retq397;398; AVX512-LABEL: test_v16i32:399; AVX512:       # %bb.0:400; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1401; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0402; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1403; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0404; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]405; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0406; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]407; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0408; AVX512-NEXT:    vmovd %xmm0, %eax409; AVX512-NEXT:    vzeroupper410; AVX512-NEXT:    retq411  %1 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %a0)412  ret i32 %1413}414 415define i32 @test_v32i32(<32 x i32> %a0) {416; SSE-LABEL: test_v32i32:417; SSE:       # %bb.0:418; SSE-NEXT:    paddd %xmm6, %xmm2419; SSE-NEXT:    paddd %xmm4, %xmm0420; SSE-NEXT:    paddd %xmm2, %xmm0421; SSE-NEXT:    paddd %xmm7, %xmm3422; SSE-NEXT:    paddd %xmm5, %xmm1423; SSE-NEXT:    paddd %xmm3, %xmm1424; SSE-NEXT:    paddd %xmm0, %xmm1425; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]426; SSE-NEXT:    paddd %xmm1, %xmm0427; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]428; SSE-NEXT:    paddd %xmm0, %xmm1429; SSE-NEXT:    movd %xmm1, %eax430; SSE-NEXT:    retq431;432; AVX1-SLOW-LABEL: test_v32i32:433; AVX1-SLOW:       # %bb.0:434; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm1, %xmm4435; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm5436; AVX1-SLOW-NEXT:    vpaddd %xmm4, %xmm5, %xmm4437; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm3, %xmm3438; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm1439; AVX1-SLOW-NEXT:    vpaddd %xmm3, %xmm1, %xmm1440; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm2, %xmm2441; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm0442; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0443; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0444; AVX1-SLOW-NEXT:    vpaddd %xmm0, %xmm4, %xmm0445; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]446; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0447; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]448; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0449; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax450; AVX1-SLOW-NEXT:    vzeroupper451; AVX1-SLOW-NEXT:    retq452;453; AVX1-FAST-LABEL: test_v32i32:454; AVX1-FAST:       # %bb.0:455; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm1, %xmm4456; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm5457; AVX1-FAST-NEXT:    vpaddd %xmm4, %xmm5, %xmm4458; AVX1-FAST-NEXT:    vextractf128 $1, %ymm3, %xmm3459; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm1460; AVX1-FAST-NEXT:    vpaddd %xmm3, %xmm1, %xmm1461; AVX1-FAST-NEXT:    vextractf128 $1, %ymm2, %xmm2462; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm0463; AVX1-FAST-NEXT:    vpaddd %xmm2, %xmm0, %xmm0464; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0465; AVX1-FAST-NEXT:    vpaddd %xmm0, %xmm4, %xmm0466; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]467; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0468; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0469; AVX1-FAST-NEXT:    vmovd %xmm0, %eax470; AVX1-FAST-NEXT:    vzeroupper471; AVX1-FAST-NEXT:    retq472;473; AVX2-LABEL: test_v32i32:474; AVX2:       # %bb.0:475; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1476; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0477; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0478; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1479; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0480; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]481; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0482; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]483; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0484; AVX2-NEXT:    vmovd %xmm0, %eax485; AVX2-NEXT:    vzeroupper486; AVX2-NEXT:    retq487;488; AVX512-LABEL: test_v32i32:489; AVX512:       # %bb.0:490; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0491; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1492; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0493; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1494; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0495; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]496; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0497; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]498; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0499; AVX512-NEXT:    vmovd %xmm0, %eax500; AVX512-NEXT:    vzeroupper501; AVX512-NEXT:    retq502  %1 = call i32 @llvm.vector.reduce.add.v32i32(<32 x i32> %a0)503  ret i32 %1504}505 506;507; vXi16508;509 510define i16 @test_v2i16(<2 x i16> %a0) {511; SSE-LABEL: test_v2i16:512; SSE:       # %bb.0:513; SSE-NEXT:    movdqa %xmm0, %xmm1514; SSE-NEXT:    psrld $16, %xmm1515; SSE-NEXT:    paddw %xmm0, %xmm1516; SSE-NEXT:    movd %xmm1, %eax517; SSE-NEXT:    # kill: def $ax killed $ax killed $eax518; SSE-NEXT:    retq519;520; AVX1-SLOW-LABEL: test_v2i16:521; AVX1-SLOW:       # %bb.0:522; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1523; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0524; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax525; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax526; AVX1-SLOW-NEXT:    retq527;528; AVX1-FAST-LABEL: test_v2i16:529; AVX1-FAST:       # %bb.0:530; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0531; AVX1-FAST-NEXT:    vmovd %xmm0, %eax532; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax533; AVX1-FAST-NEXT:    retq534;535; AVX2-LABEL: test_v2i16:536; AVX2:       # %bb.0:537; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1538; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0539; AVX2-NEXT:    vmovd %xmm0, %eax540; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax541; AVX2-NEXT:    retq542;543; AVX512-LABEL: test_v2i16:544; AVX512:       # %bb.0:545; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1546; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0547; AVX512-NEXT:    vmovd %xmm0, %eax548; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax549; AVX512-NEXT:    retq550  %1 = call i16 @llvm.vector.reduce.add.v2i16(<2 x i16> %a0)551  ret i16 %1552}553 554define i16 @test_v4i16(<4 x i16> %a0) {555; SSE-LABEL: test_v4i16:556; SSE:       # %bb.0:557; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]558; SSE-NEXT:    paddw %xmm0, %xmm1559; SSE-NEXT:    movdqa %xmm1, %xmm0560; SSE-NEXT:    psrld $16, %xmm0561; SSE-NEXT:    paddw %xmm1, %xmm0562; SSE-NEXT:    movd %xmm0, %eax563; SSE-NEXT:    # kill: def $ax killed $ax killed $eax564; SSE-NEXT:    retq565;566; AVX1-SLOW-LABEL: test_v4i16:567; AVX1-SLOW:       # %bb.0:568; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]569; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0570; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1571; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0572; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax573; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax574; AVX1-SLOW-NEXT:    retq575;576; AVX1-FAST-LABEL: test_v4i16:577; AVX1-FAST:       # %bb.0:578; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]579; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0580; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0581; AVX1-FAST-NEXT:    vmovd %xmm0, %eax582; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax583; AVX1-FAST-NEXT:    retq584;585; AVX2-LABEL: test_v4i16:586; AVX2:       # %bb.0:587; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]588; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0589; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1590; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0591; AVX2-NEXT:    vmovd %xmm0, %eax592; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax593; AVX2-NEXT:    retq594;595; AVX512-LABEL: test_v4i16:596; AVX512:       # %bb.0:597; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]598; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0599; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1600; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0601; AVX512-NEXT:    vmovd %xmm0, %eax602; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax603; AVX512-NEXT:    retq604  %1 = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %a0)605  ret i16 %1606}607 608define i16 @test_v8i16(<8 x i16> %a0) {609; SSE-LABEL: test_v8i16:610; SSE:       # %bb.0:611; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]612; SSE-NEXT:    paddw %xmm0, %xmm1613; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]614; SSE-NEXT:    paddw %xmm1, %xmm0615; SSE-NEXT:    movdqa %xmm0, %xmm1616; SSE-NEXT:    psrld $16, %xmm1617; SSE-NEXT:    paddw %xmm0, %xmm1618; SSE-NEXT:    movd %xmm1, %eax619; SSE-NEXT:    # kill: def $ax killed $ax killed $eax620; SSE-NEXT:    retq621;622; AVX1-SLOW-LABEL: test_v8i16:623; AVX1-SLOW:       # %bb.0:624; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]625; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0626; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]627; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0628; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1629; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0630; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax631; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax632; AVX1-SLOW-NEXT:    retq633;634; AVX1-FAST-LABEL: test_v8i16:635; AVX1-FAST:       # %bb.0:636; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0637; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0638; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0639; AVX1-FAST-NEXT:    vmovd %xmm0, %eax640; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax641; AVX1-FAST-NEXT:    retq642;643; AVX2-LABEL: test_v8i16:644; AVX2:       # %bb.0:645; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]646; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0647; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]648; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0649; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1650; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0651; AVX2-NEXT:    vmovd %xmm0, %eax652; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax653; AVX2-NEXT:    retq654;655; AVX512-LABEL: test_v8i16:656; AVX512:       # %bb.0:657; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]658; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0659; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]660; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0661; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1662; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0663; AVX512-NEXT:    vmovd %xmm0, %eax664; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax665; AVX512-NEXT:    retq666  %1 = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %a0)667  ret i16 %1668}669 670define i16 @test_v16i16(<16 x i16> %a0) {671; SSE-LABEL: test_v16i16:672; SSE:       # %bb.0:673; SSE-NEXT:    paddw %xmm1, %xmm0674; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]675; SSE-NEXT:    paddw %xmm0, %xmm1676; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]677; SSE-NEXT:    paddw %xmm1, %xmm0678; SSE-NEXT:    movdqa %xmm0, %xmm1679; SSE-NEXT:    psrld $16, %xmm1680; SSE-NEXT:    paddw %xmm0, %xmm1681; SSE-NEXT:    movd %xmm1, %eax682; SSE-NEXT:    # kill: def $ax killed $ax killed $eax683; SSE-NEXT:    retq684;685; AVX1-SLOW-LABEL: test_v16i16:686; AVX1-SLOW:       # %bb.0:687; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1688; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0689; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]690; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0691; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]692; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0693; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1694; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0695; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax696; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax697; AVX1-SLOW-NEXT:    vzeroupper698; AVX1-SLOW-NEXT:    retq699;700; AVX1-FAST-LABEL: test_v16i16:701; AVX1-FAST:       # %bb.0:702; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1703; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm1, %xmm0704; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0705; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0706; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0707; AVX1-FAST-NEXT:    vmovd %xmm0, %eax708; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax709; AVX1-FAST-NEXT:    vzeroupper710; AVX1-FAST-NEXT:    retq711;712; AVX2-LABEL: test_v16i16:713; AVX2:       # %bb.0:714; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1715; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0716; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]717; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0718; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]719; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0720; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1721; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0722; AVX2-NEXT:    vmovd %xmm0, %eax723; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax724; AVX2-NEXT:    vzeroupper725; AVX2-NEXT:    retq726;727; AVX512-LABEL: test_v16i16:728; AVX512:       # %bb.0:729; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1730; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0731; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]732; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0733; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]734; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0735; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1736; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0737; AVX512-NEXT:    vmovd %xmm0, %eax738; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax739; AVX512-NEXT:    vzeroupper740; AVX512-NEXT:    retq741  %1 = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %a0)742  ret i16 %1743}744 745define i16 @test_v32i16(<32 x i16> %a0) {746; SSE-LABEL: test_v32i16:747; SSE:       # %bb.0:748; SSE-NEXT:    paddw %xmm3, %xmm1749; SSE-NEXT:    paddw %xmm2, %xmm0750; SSE-NEXT:    paddw %xmm1, %xmm0751; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]752; SSE-NEXT:    paddw %xmm0, %xmm1753; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]754; SSE-NEXT:    paddw %xmm1, %xmm0755; SSE-NEXT:    movdqa %xmm0, %xmm1756; SSE-NEXT:    psrld $16, %xmm1757; SSE-NEXT:    paddw %xmm0, %xmm1758; SSE-NEXT:    movd %xmm1, %eax759; SSE-NEXT:    # kill: def $ax killed $ax killed $eax760; SSE-NEXT:    retq761;762; AVX1-SLOW-LABEL: test_v32i16:763; AVX1-SLOW:       # %bb.0:764; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2765; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3766; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm3, %xmm2767; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0768; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm0, %xmm0769; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]770; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0771; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]772; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0773; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1774; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0775; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax776; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax777; AVX1-SLOW-NEXT:    vzeroupper778; AVX1-SLOW-NEXT:    retq779;780; AVX1-FAST-LABEL: test_v32i16:781; AVX1-FAST:       # %bb.0:782; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm2783; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm3784; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm3, %xmm2785; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0786; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm0, %xmm0787; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]788; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0789; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]790; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0791; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0792; AVX1-FAST-NEXT:    vmovd %xmm0, %eax793; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax794; AVX1-FAST-NEXT:    vzeroupper795; AVX1-FAST-NEXT:    retq796;797; AVX2-LABEL: test_v32i16:798; AVX2:       # %bb.0:799; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0800; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1801; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0802; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]803; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0804; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]805; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0806; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1807; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0808; AVX2-NEXT:    vmovd %xmm0, %eax809; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax810; AVX2-NEXT:    vzeroupper811; AVX2-NEXT:    retq812;813; AVX512-LABEL: test_v32i16:814; AVX512:       # %bb.0:815; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1816; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0817; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1818; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0819; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]820; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0821; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]822; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0823; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1824; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0825; AVX512-NEXT:    vmovd %xmm0, %eax826; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax827; AVX512-NEXT:    vzeroupper828; AVX512-NEXT:    retq829  %1 = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %a0)830  ret i16 %1831}832 833define i16 @test_v64i16(<64 x i16> %a0) {834; SSE-LABEL: test_v64i16:835; SSE:       # %bb.0:836; SSE-NEXT:    paddw %xmm6, %xmm2837; SSE-NEXT:    paddw %xmm4, %xmm0838; SSE-NEXT:    paddw %xmm2, %xmm0839; SSE-NEXT:    paddw %xmm7, %xmm3840; SSE-NEXT:    paddw %xmm5, %xmm1841; SSE-NEXT:    paddw %xmm3, %xmm1842; SSE-NEXT:    paddw %xmm0, %xmm1843; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]844; SSE-NEXT:    paddw %xmm1, %xmm0845; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]846; SSE-NEXT:    paddw %xmm0, %xmm1847; SSE-NEXT:    movdqa %xmm1, %xmm0848; SSE-NEXT:    psrld $16, %xmm0849; SSE-NEXT:    paddw %xmm1, %xmm0850; SSE-NEXT:    movd %xmm0, %eax851; SSE-NEXT:    # kill: def $ax killed $ax killed $eax852; SSE-NEXT:    retq853;854; AVX1-SLOW-LABEL: test_v64i16:855; AVX1-SLOW:       # %bb.0:856; AVX1-SLOW-NEXT:    vpaddw %xmm3, %xmm1, %xmm4857; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm0, %xmm5858; AVX1-SLOW-NEXT:    vpaddw %xmm4, %xmm5, %xmm4859; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm3, %xmm3860; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm1861; AVX1-SLOW-NEXT:    vpaddw %xmm3, %xmm1, %xmm1862; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm2, %xmm2863; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm0864; AVX1-SLOW-NEXT:    vpaddw %xmm2, %xmm0, %xmm0865; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0866; AVX1-SLOW-NEXT:    vpaddw %xmm0, %xmm4, %xmm0867; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]868; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0869; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]870; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0871; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1872; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0873; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax874; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax875; AVX1-SLOW-NEXT:    vzeroupper876; AVX1-SLOW-NEXT:    retq877;878; AVX1-FAST-LABEL: test_v64i16:879; AVX1-FAST:       # %bb.0:880; AVX1-FAST-NEXT:    vpaddw %xmm3, %xmm1, %xmm4881; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm0, %xmm5882; AVX1-FAST-NEXT:    vpaddw %xmm4, %xmm5, %xmm4883; AVX1-FAST-NEXT:    vextractf128 $1, %ymm3, %xmm3884; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm1885; AVX1-FAST-NEXT:    vpaddw %xmm3, %xmm1, %xmm1886; AVX1-FAST-NEXT:    vextractf128 $1, %ymm2, %xmm2887; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm0888; AVX1-FAST-NEXT:    vpaddw %xmm2, %xmm0, %xmm0889; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0890; AVX1-FAST-NEXT:    vpaddw %xmm0, %xmm4, %xmm0891; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]892; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0893; AVX1-FAST-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]894; AVX1-FAST-NEXT:    vpaddw %xmm1, %xmm0, %xmm0895; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0896; AVX1-FAST-NEXT:    vmovd %xmm0, %eax897; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax898; AVX1-FAST-NEXT:    vzeroupper899; AVX1-FAST-NEXT:    retq900;901; AVX2-LABEL: test_v64i16:902; AVX2:       # %bb.0:903; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1904; AVX2-NEXT:    vpaddw %ymm2, %ymm0, %ymm0905; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0906; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1907; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0908; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]909; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0910; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]911; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0912; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1913; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0914; AVX2-NEXT:    vmovd %xmm0, %eax915; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax916; AVX2-NEXT:    vzeroupper917; AVX2-NEXT:    retq918;919; AVX512-LABEL: test_v64i16:920; AVX512:       # %bb.0:921; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0922; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1923; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0924; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1925; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0926; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]927; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0928; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]929; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0930; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1931; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0932; AVX512-NEXT:    vmovd %xmm0, %eax933; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax934; AVX512-NEXT:    vzeroupper935; AVX512-NEXT:    retq936  %1 = call i16 @llvm.vector.reduce.add.v64i16(<64 x i16> %a0)937  ret i16 %1938}939 940;941; vXi8942;943 944define i8 @test_v2i8(<2 x i8> %a0) {945; SSE-LABEL: test_v2i8:946; SSE:       # %bb.0:947; SSE-NEXT:    movdqa %xmm0, %xmm1948; SSE-NEXT:    psrlw $8, %xmm1949; SSE-NEXT:    paddb %xmm0, %xmm1950; SSE-NEXT:    movd %xmm1, %eax951; SSE-NEXT:    # kill: def $al killed $al killed $eax952; SSE-NEXT:    retq953;954; AVX-LABEL: test_v2i8:955; AVX:       # %bb.0:956; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1957; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0958; AVX-NEXT:    vmovd %xmm0, %eax959; AVX-NEXT:    # kill: def $al killed $al killed $eax960; AVX-NEXT:    retq961;962; AVX512-LABEL: test_v2i8:963; AVX512:       # %bb.0:964; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1965; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0966; AVX512-NEXT:    vmovd %xmm0, %eax967; AVX512-NEXT:    # kill: def $al killed $al killed $eax968; AVX512-NEXT:    retq969  %1 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> %a0)970  ret i8 %1971}972 973define i8 @test_v2i8_load(ptr %p) {974; SSE-LABEL: test_v2i8_load:975; SSE:       # %bb.0:976; SSE-NEXT:    movzwl (%rdi), %eax977; SSE-NEXT:    movd %eax, %xmm0978; SSE-NEXT:    movdqa %xmm0, %xmm1979; SSE-NEXT:    psrlw $8, %xmm1980; SSE-NEXT:    paddb %xmm0, %xmm1981; SSE-NEXT:    movd %xmm1, %eax982; SSE-NEXT:    # kill: def $al killed $al killed $eax983; SSE-NEXT:    retq984;985; AVX-LABEL: test_v2i8_load:986; AVX:       # %bb.0:987; AVX-NEXT:    movzwl (%rdi), %eax988; AVX-NEXT:    vmovd %eax, %xmm0989; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1990; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0991; AVX-NEXT:    vmovd %xmm0, %eax992; AVX-NEXT:    # kill: def $al killed $al killed $eax993; AVX-NEXT:    retq994;995; AVX512-LABEL: test_v2i8_load:996; AVX512:       # %bb.0:997; AVX512-NEXT:    movzwl (%rdi), %eax998; AVX512-NEXT:    vmovd %eax, %xmm0999; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm11000; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01001; AVX512-NEXT:    vmovd %xmm0, %eax1002; AVX512-NEXT:    # kill: def $al killed $al killed $eax1003; AVX512-NEXT:    retq1004  %a0 = load <2 x i8>, ptr %p1005  %1 = call i8 @llvm.vector.reduce.add.v2i8(<2 x i8> %a0)1006  ret i8 %11007}1008 1009define i8 @test_v4i8(<4 x i8> %a0) {1010; SSE2-LABEL: test_v4i8:1011; SSE2:       # %bb.0:1012; SSE2-NEXT:    pxor %xmm1, %xmm11013; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1014; SSE2-NEXT:    psadbw %xmm1, %xmm01015; SSE2-NEXT:    movd %xmm0, %eax1016; SSE2-NEXT:    # kill: def $al killed $al killed $eax1017; SSE2-NEXT:    retq1018;1019; SSE41-LABEL: test_v4i8:1020; SSE41:       # %bb.0:1021; SSE41-NEXT:    pxor %xmm1, %xmm11022; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1023; SSE41-NEXT:    psadbw %xmm1, %xmm01024; SSE41-NEXT:    movd %xmm0, %eax1025; SSE41-NEXT:    # kill: def $al killed $al killed $eax1026; SSE41-NEXT:    retq1027;1028; AVX1-LABEL: test_v4i8:1029; AVX1:       # %bb.0:1030; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11031; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1032; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01033; AVX1-NEXT:    vmovd %xmm0, %eax1034; AVX1-NEXT:    # kill: def $al killed $al killed $eax1035; AVX1-NEXT:    retq1036;1037; AVX2-LABEL: test_v4i8:1038; AVX2:       # %bb.0:1039; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11040; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]1041; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01042; AVX2-NEXT:    vmovd %xmm0, %eax1043; AVX2-NEXT:    # kill: def $al killed $al killed $eax1044; AVX2-NEXT:    retq1045;1046; AVX512-LABEL: test_v4i8:1047; AVX512:       # %bb.0:1048; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11049; AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]1050; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11051; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01052; AVX512-NEXT:    vmovd %xmm0, %eax1053; AVX512-NEXT:    # kill: def $al killed $al killed $eax1054; AVX512-NEXT:    retq1055  %1 = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> %a0)1056  ret i8 %11057}1058 1059define i8 @test_v4i8_load(ptr %p) {1060; SSE-LABEL: test_v4i8_load:1061; SSE:       # %bb.0:1062; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero1063; SSE-NEXT:    pxor %xmm1, %xmm11064; SSE-NEXT:    psadbw %xmm0, %xmm11065; SSE-NEXT:    movd %xmm1, %eax1066; SSE-NEXT:    # kill: def $al killed $al killed $eax1067; SSE-NEXT:    retq1068;1069; AVX-LABEL: test_v4i8_load:1070; AVX:       # %bb.0:1071; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1072; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11073; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01074; AVX-NEXT:    vmovd %xmm0, %eax1075; AVX-NEXT:    # kill: def $al killed $al killed $eax1076; AVX-NEXT:    retq1077;1078; AVX512-LABEL: test_v4i8_load:1079; AVX512:       # %bb.0:1080; AVX512-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1081; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11082; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01083; AVX512-NEXT:    vmovd %xmm0, %eax1084; AVX512-NEXT:    # kill: def $al killed $al killed $eax1085; AVX512-NEXT:    retq1086  %a0 = load <4 x i8>, ptr %p1087  %1 = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> %a0)1088  ret i8 %11089}1090 1091define i8 @test_v8i8(<8 x i8> %a0) {1092; SSE-LABEL: test_v8i8:1093; SSE:       # %bb.0:1094; SSE-NEXT:    pxor %xmm1, %xmm11095; SSE-NEXT:    psadbw %xmm0, %xmm11096; SSE-NEXT:    movd %xmm1, %eax1097; SSE-NEXT:    # kill: def $al killed $al killed $eax1098; SSE-NEXT:    retq1099;1100; AVX-LABEL: test_v8i8:1101; AVX:       # %bb.0:1102; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11103; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01104; AVX-NEXT:    vmovd %xmm0, %eax1105; AVX-NEXT:    # kill: def $al killed $al killed $eax1106; AVX-NEXT:    retq1107;1108; AVX512-LABEL: test_v8i8:1109; AVX512:       # %bb.0:1110; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11111; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01112; AVX512-NEXT:    vmovd %xmm0, %eax1113; AVX512-NEXT:    # kill: def $al killed $al killed $eax1114; AVX512-NEXT:    retq1115  %1 = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a0)1116  ret i8 %11117}1118 1119define i8 @test_v8i8_load(ptr %p) {1120; SSE-LABEL: test_v8i8_load:1121; SSE:       # %bb.0:1122; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero1123; SSE-NEXT:    pxor %xmm1, %xmm11124; SSE-NEXT:    psadbw %xmm0, %xmm11125; SSE-NEXT:    movd %xmm1, %eax1126; SSE-NEXT:    # kill: def $al killed $al killed $eax1127; SSE-NEXT:    retq1128;1129; AVX-LABEL: test_v8i8_load:1130; AVX:       # %bb.0:1131; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero1132; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11133; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01134; AVX-NEXT:    vmovd %xmm0, %eax1135; AVX-NEXT:    # kill: def $al killed $al killed $eax1136; AVX-NEXT:    retq1137;1138; AVX512-LABEL: test_v8i8_load:1139; AVX512:       # %bb.0:1140; AVX512-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero1141; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11142; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01143; AVX512-NEXT:    vmovd %xmm0, %eax1144; AVX512-NEXT:    # kill: def $al killed $al killed $eax1145; AVX512-NEXT:    retq1146  %a0 = load <8 x i8>, ptr %p1147  %1 = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a0)1148  ret i8 %11149}1150 1151define i8 @test_v16i8(<16 x i8> %a0) {1152; SSE-LABEL: test_v16i8:1153; SSE:       # %bb.0:1154; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1155; SSE-NEXT:    paddb %xmm0, %xmm11156; SSE-NEXT:    pxor %xmm0, %xmm01157; SSE-NEXT:    psadbw %xmm1, %xmm01158; SSE-NEXT:    movd %xmm0, %eax1159; SSE-NEXT:    # kill: def $al killed $al killed $eax1160; SSE-NEXT:    retq1161;1162; AVX-LABEL: test_v16i8:1163; AVX:       # %bb.0:1164; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1165; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm01166; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm11167; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01168; AVX-NEXT:    vmovd %xmm0, %eax1169; AVX-NEXT:    # kill: def $al killed $al killed $eax1170; AVX-NEXT:    retq1171;1172; AVX512-LABEL: test_v16i8:1173; AVX512:       # %bb.0:1174; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1175; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01176; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11177; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01178; AVX512-NEXT:    vmovd %xmm0, %eax1179; AVX512-NEXT:    # kill: def $al killed $al killed $eax1180; AVX512-NEXT:    retq1181  %1 = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %a0)1182  ret i8 %11183}1184 1185define i8 @test_v32i8(<32 x i8> %a0) {1186; SSE-LABEL: test_v32i8:1187; SSE:       # %bb.0:1188; SSE-NEXT:    paddb %xmm1, %xmm01189; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1190; SSE-NEXT:    paddb %xmm0, %xmm11191; SSE-NEXT:    pxor %xmm0, %xmm01192; SSE-NEXT:    psadbw %xmm1, %xmm01193; SSE-NEXT:    movd %xmm0, %eax1194; SSE-NEXT:    # kill: def $al killed $al killed $eax1195; SSE-NEXT:    retq1196;1197; AVX1-LABEL: test_v32i8:1198; AVX1:       # %bb.0:1199; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11200; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01201; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1202; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01203; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11204; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01205; AVX1-NEXT:    vmovd %xmm0, %eax1206; AVX1-NEXT:    # kill: def $al killed $al killed $eax1207; AVX1-NEXT:    vzeroupper1208; AVX1-NEXT:    retq1209;1210; AVX2-LABEL: test_v32i8:1211; AVX2:       # %bb.0:1212; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11213; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01214; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1215; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01216; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11217; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01218; AVX2-NEXT:    vmovd %xmm0, %eax1219; AVX2-NEXT:    # kill: def $al killed $al killed $eax1220; AVX2-NEXT:    vzeroupper1221; AVX2-NEXT:    retq1222;1223; AVX512-LABEL: test_v32i8:1224; AVX512:       # %bb.0:1225; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11226; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01227; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1228; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01229; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11230; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01231; AVX512-NEXT:    vmovd %xmm0, %eax1232; AVX512-NEXT:    # kill: def $al killed $al killed $eax1233; AVX512-NEXT:    vzeroupper1234; AVX512-NEXT:    retq1235  %1 = call i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %a0)1236  ret i8 %11237}1238 1239define i8 @test_v64i8(<64 x i8> %a0) {1240; SSE-LABEL: test_v64i8:1241; SSE:       # %bb.0:1242; SSE-NEXT:    paddb %xmm3, %xmm11243; SSE-NEXT:    paddb %xmm2, %xmm01244; SSE-NEXT:    paddb %xmm1, %xmm01245; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1246; SSE-NEXT:    paddb %xmm0, %xmm11247; SSE-NEXT:    pxor %xmm0, %xmm01248; SSE-NEXT:    psadbw %xmm1, %xmm01249; SSE-NEXT:    movd %xmm0, %eax1250; SSE-NEXT:    # kill: def $al killed $al killed $eax1251; SSE-NEXT:    retq1252;1253; AVX1-LABEL: test_v64i8:1254; AVX1:       # %bb.0:1255; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21256; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31257; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm21258; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01259; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm01260; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1261; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01262; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11263; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01264; AVX1-NEXT:    vmovd %xmm0, %eax1265; AVX1-NEXT:    # kill: def $al killed $al killed $eax1266; AVX1-NEXT:    vzeroupper1267; AVX1-NEXT:    retq1268;1269; AVX2-LABEL: test_v64i8:1270; AVX2:       # %bb.0:1271; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm01272; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11273; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01274; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1275; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01276; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11277; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01278; AVX2-NEXT:    vmovd %xmm0, %eax1279; AVX2-NEXT:    # kill: def $al killed $al killed $eax1280; AVX2-NEXT:    vzeroupper1281; AVX2-NEXT:    retq1282;1283; AVX512-LABEL: test_v64i8:1284; AVX512:       # %bb.0:1285; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11286; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm01287; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11288; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01289; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1290; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01291; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11292; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01293; AVX512-NEXT:    vmovd %xmm0, %eax1294; AVX512-NEXT:    # kill: def $al killed $al killed $eax1295; AVX512-NEXT:    vzeroupper1296; AVX512-NEXT:    retq1297  %1 = call i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %a0)1298  ret i8 %11299}1300 1301define i8 @test_v128i8(<128 x i8> %a0) {1302; SSE-LABEL: test_v128i8:1303; SSE:       # %bb.0:1304; SSE-NEXT:    paddb %xmm7, %xmm31305; SSE-NEXT:    paddb %xmm5, %xmm11306; SSE-NEXT:    paddb %xmm3, %xmm11307; SSE-NEXT:    paddb %xmm6, %xmm21308; SSE-NEXT:    paddb %xmm4, %xmm01309; SSE-NEXT:    paddb %xmm2, %xmm01310; SSE-NEXT:    paddb %xmm1, %xmm01311; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1312; SSE-NEXT:    paddb %xmm0, %xmm11313; SSE-NEXT:    pxor %xmm0, %xmm01314; SSE-NEXT:    psadbw %xmm1, %xmm01315; SSE-NEXT:    movd %xmm0, %eax1316; SSE-NEXT:    # kill: def $al killed $al killed $eax1317; SSE-NEXT:    retq1318;1319; AVX1-LABEL: test_v128i8:1320; AVX1:       # %bb.0:1321; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm41322; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm51323; AVX1-NEXT:    vpaddb %xmm4, %xmm5, %xmm41324; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm51325; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm61326; AVX1-NEXT:    vpaddb %xmm5, %xmm6, %xmm51327; AVX1-NEXT:    vpaddb %xmm4, %xmm5, %xmm41328; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm11329; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm01330; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01331; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm01332; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1333; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm01334; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11335; AVX1-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01336; AVX1-NEXT:    vmovd %xmm0, %eax1337; AVX1-NEXT:    # kill: def $al killed $al killed $eax1338; AVX1-NEXT:    vzeroupper1339; AVX1-NEXT:    retq1340;1341; AVX2-LABEL: test_v128i8:1342; AVX2:       # %bb.0:1343; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm11344; AVX2-NEXT:    vpaddb %ymm2, %ymm0, %ymm01345; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm01346; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11347; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01348; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1349; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm01350; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm11351; AVX2-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01352; AVX2-NEXT:    vmovd %xmm0, %eax1353; AVX2-NEXT:    # kill: def $al killed $al killed $eax1354; AVX2-NEXT:    vzeroupper1355; AVX2-NEXT:    retq1356;1357; AVX512-LABEL: test_v128i8:1358; AVX512:       # %bb.0:1359; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm01360; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm11361; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm01362; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm11363; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01364; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1365; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm01366; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm11367; AVX512-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01368; AVX512-NEXT:    vmovd %xmm0, %eax1369; AVX512-NEXT:    # kill: def $al killed $al killed $eax1370; AVX512-NEXT:    vzeroupper1371; AVX512-NEXT:    retq1372  %1 = call i8 @llvm.vector.reduce.add.v128i8(<128 x i8> %a0)1373  ret i8 %11374}1375 1376declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>)1377declare i64 @llvm.vector.reduce.add.v4i64(<4 x i64>)1378declare i64 @llvm.vector.reduce.add.v8i64(<8 x i64>)1379declare i64 @llvm.vector.reduce.add.v16i64(<16 x i64>)1380 1381declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>)1382declare i32 @llvm.vector.reduce.add.v4i32(<4 x i32>)1383declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)1384declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>)1385declare i32 @llvm.vector.reduce.add.v32i32(<32 x i32>)1386 1387declare i16 @llvm.vector.reduce.add.v2i16(<2 x i16>)1388declare i16 @llvm.vector.reduce.add.v4i16(<4 x i16>)1389declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)1390declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>)1391declare i16 @llvm.vector.reduce.add.v32i16(<32 x i16>)1392declare i16 @llvm.vector.reduce.add.v64i16(<64 x i16>)1393 1394declare i8 @llvm.vector.reduce.add.v2i8(<2 x i8>)1395declare i8 @llvm.vector.reduce.add.v4i8(<4 x i8>)1396declare i8 @llvm.vector.reduce.add.v8i8(<8 x i8>)1397declare i8 @llvm.vector.reduce.add.v16i8(<16 x i8>)1398declare i8 @llvm.vector.reduce.add.v32i8(<32 x i8>)1399declare i8 @llvm.vector.reduce.add.v64i8(<64 x i8>)1400declare i8 @llvm.vector.reduce.add.v128i8(<128 x i8>)1401