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