brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.3 KiB · 873083a Raw
409 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2            | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3           | FileCheck %s --check-prefix=SSSE3-SLOW4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3,fast-hops | FileCheck %s --check-prefix=SSSE3-FAST5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx             | FileCheck %s --check-prefix=AVX1-SLOW6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx,fast-hops   | FileCheck %s --check-prefix=AVX1-FAST7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2            | FileCheck %s --check-prefix=AVX28 9; PR37890 - subvector reduction followed by shuffle reduction10 11define i32 @PR37890_v4i32(<4 x i32> %a)  {12; SSE2-LABEL: PR37890_v4i32:13; SSE2:       # %bb.0:14; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]15; SSE2-NEXT:    paddd %xmm0, %xmm116; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]17; SSE2-NEXT:    paddd %xmm1, %xmm018; SSE2-NEXT:    movd %xmm0, %eax19; SSE2-NEXT:    retq20;21; SSSE3-SLOW-LABEL: PR37890_v4i32:22; SSSE3-SLOW:       # %bb.0:23; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]24; SSSE3-SLOW-NEXT:    paddd %xmm0, %xmm125; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]26; SSSE3-SLOW-NEXT:    paddd %xmm1, %xmm027; SSSE3-SLOW-NEXT:    movd %xmm0, %eax28; SSSE3-SLOW-NEXT:    retq29;30; SSSE3-FAST-LABEL: PR37890_v4i32:31; SSSE3-FAST:       # %bb.0:32; SSSE3-FAST-NEXT:    phaddd %xmm0, %xmm033; SSSE3-FAST-NEXT:    phaddd %xmm0, %xmm034; SSSE3-FAST-NEXT:    movd %xmm0, %eax35; SSSE3-FAST-NEXT:    retq36;37; AVX1-SLOW-LABEL: PR37890_v4i32:38; AVX1-SLOW:       # %bb.0:39; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]40; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm041; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]42; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm043; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax44; AVX1-SLOW-NEXT:    retq45;46; AVX1-FAST-LABEL: PR37890_v4i32:47; AVX1-FAST:       # %bb.0:48; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm049; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm050; AVX1-FAST-NEXT:    vmovd %xmm0, %eax51; AVX1-FAST-NEXT:    retq52;53; AVX2-LABEL: PR37890_v4i32:54; AVX2:       # %bb.0:55; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]56; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm057; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]58; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm059; AVX2-NEXT:    vmovd %xmm0, %eax60; AVX2-NEXT:    retq61  %hi0 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>62  %lo0 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>63  %sum0 = add <2 x i32> %lo0, %hi064  %hi1 = shufflevector <2 x i32> %sum0, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>65  %sum1 = add <2 x i32> %sum0, %hi166  %e = extractelement <2 x i32> %sum1, i32 067  ret i32 %e68}69 70define i16 @PR37890_v8i16(<8 x i16> %a)  {71; SSE2-LABEL: PR37890_v8i16:72; SSE2:       # %bb.0:73; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]74; SSE2-NEXT:    paddw %xmm0, %xmm175; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]76; SSE2-NEXT:    paddw %xmm1, %xmm077; SSE2-NEXT:    movdqa %xmm0, %xmm178; SSE2-NEXT:    psrld $16, %xmm179; SSE2-NEXT:    paddw %xmm0, %xmm180; SSE2-NEXT:    movd %xmm1, %eax81; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax82; SSE2-NEXT:    retq83;84; SSSE3-SLOW-LABEL: PR37890_v8i16:85; SSSE3-SLOW:       # %bb.0:86; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]87; SSSE3-SLOW-NEXT:    paddw %xmm0, %xmm188; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]89; SSSE3-SLOW-NEXT:    paddw %xmm1, %xmm090; SSSE3-SLOW-NEXT:    movdqa %xmm0, %xmm191; SSSE3-SLOW-NEXT:    psrld $16, %xmm192; SSSE3-SLOW-NEXT:    paddw %xmm0, %xmm193; SSSE3-SLOW-NEXT:    movd %xmm1, %eax94; SSSE3-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax95; SSSE3-SLOW-NEXT:    retq96;97; SSSE3-FAST-LABEL: PR37890_v8i16:98; SSSE3-FAST:       # %bb.0:99; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0100; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0101; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0102; SSSE3-FAST-NEXT:    movd %xmm0, %eax103; SSSE3-FAST-NEXT:    # kill: def $ax killed $ax killed $eax104; SSSE3-FAST-NEXT:    retq105;106; AVX1-SLOW-LABEL: PR37890_v8i16:107; AVX1-SLOW:       # %bb.0:108; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]109; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0110; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]111; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0112; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1113; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0114; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax115; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax116; AVX1-SLOW-NEXT:    retq117;118; AVX1-FAST-LABEL: PR37890_v8i16:119; AVX1-FAST:       # %bb.0:120; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0121; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0122; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0123; AVX1-FAST-NEXT:    vmovd %xmm0, %eax124; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax125; AVX1-FAST-NEXT:    retq126;127; AVX2-LABEL: PR37890_v8i16:128; AVX2:       # %bb.0:129; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]130; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0131; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]132; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0133; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1134; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0135; AVX2-NEXT:    vmovd %xmm0, %eax136; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax137; AVX2-NEXT:    retq138  %hi0 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>139  %lo0 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>140  %sum0 = add <4 x i16> %lo0, %hi0141  %hi1 = shufflevector <4 x i16> %sum0, <4 x i16> undef, <2 x i32> <i32 2, i32 3>142  %lo1 = shufflevector <4 x i16> %sum0, <4 x i16> undef, <2 x i32> <i32 0, i32 1>143  %sum1 = add <2 x i16> %lo1, %hi1144  %hi2 = shufflevector <2 x i16> %sum1, <2 x i16> undef, <2 x i32> <i32 1, i32 undef>145  %sum2 = add <2 x i16> %sum1, %hi2146  %e = extractelement <2 x i16> %sum2, i32 0147  ret i16 %e148}149 150define i32 @PR37890_v8i32(<8 x i32> %a)  {151; SSE2-LABEL: PR37890_v8i32:152; SSE2:       # %bb.0:153; SSE2-NEXT:    paddd %xmm1, %xmm0154; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]155; SSE2-NEXT:    paddd %xmm0, %xmm1156; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]157; SSE2-NEXT:    paddd %xmm1, %xmm0158; SSE2-NEXT:    movd %xmm0, %eax159; SSE2-NEXT:    retq160;161; SSSE3-SLOW-LABEL: PR37890_v8i32:162; SSSE3-SLOW:       # %bb.0:163; SSSE3-SLOW-NEXT:    paddd %xmm1, %xmm0164; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]165; SSSE3-SLOW-NEXT:    paddd %xmm0, %xmm1166; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]167; SSSE3-SLOW-NEXT:    paddd %xmm1, %xmm0168; SSSE3-SLOW-NEXT:    movd %xmm0, %eax169; SSSE3-SLOW-NEXT:    retq170;171; SSSE3-FAST-LABEL: PR37890_v8i32:172; SSSE3-FAST:       # %bb.0:173; SSSE3-FAST-NEXT:    paddd %xmm1, %xmm0174; SSSE3-FAST-NEXT:    phaddd %xmm0, %xmm0175; SSSE3-FAST-NEXT:    phaddd %xmm0, %xmm0176; SSSE3-FAST-NEXT:    movd %xmm0, %eax177; SSSE3-FAST-NEXT:    retq178;179; AVX1-SLOW-LABEL: PR37890_v8i32:180; AVX1-SLOW:       # %bb.0:181; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1182; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0183; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]184; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0185; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]186; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0187; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax188; AVX1-SLOW-NEXT:    vzeroupper189; AVX1-SLOW-NEXT:    retq190;191; AVX1-FAST-LABEL: PR37890_v8i32:192; AVX1-FAST:       # %bb.0:193; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1194; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm1, %xmm0195; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0196; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0197; AVX1-FAST-NEXT:    vmovd %xmm0, %eax198; AVX1-FAST-NEXT:    vzeroupper199; AVX1-FAST-NEXT:    retq200;201; AVX2-LABEL: PR37890_v8i32:202; AVX2:       # %bb.0:203; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1204; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0205; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]206; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0207; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]208; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0209; AVX2-NEXT:    vmovd %xmm0, %eax210; AVX2-NEXT:    vzeroupper211; AVX2-NEXT:    retq212  %hi0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>213  %lo0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>214  %sum0 = add <4 x i32> %lo0, %hi0215  %hi1 = shufflevector <4 x i32> %sum0, <4 x i32> undef, <2 x i32> <i32 2, i32 3>216  %lo1 = shufflevector <4 x i32> %sum0, <4 x i32> undef, <2 x i32> <i32 0, i32 1>217  %sum1 = add <2 x i32> %lo1, %hi1218  %hi2 = shufflevector <2 x i32> %sum1, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>219  %sum2 = add <2 x i32> %sum1, %hi2220  %e = extractelement <2 x i32> %sum2, i32 0221  ret i32 %e222}223 224define i16 @PR37890_v16i16(<16 x i16> %a)  {225; SSE2-LABEL: PR37890_v16i16:226; SSE2:       # %bb.0:227; SSE2-NEXT:    paddw %xmm1, %xmm0228; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]229; SSE2-NEXT:    paddw %xmm0, %xmm1230; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]231; SSE2-NEXT:    paddw %xmm1, %xmm0232; SSE2-NEXT:    movdqa %xmm0, %xmm1233; SSE2-NEXT:    psrld $16, %xmm1234; SSE2-NEXT:    paddw %xmm0, %xmm1235; SSE2-NEXT:    movd %xmm1, %eax236; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax237; SSE2-NEXT:    retq238;239; SSSE3-SLOW-LABEL: PR37890_v16i16:240; SSSE3-SLOW:       # %bb.0:241; SSSE3-SLOW-NEXT:    paddw %xmm1, %xmm0242; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]243; SSSE3-SLOW-NEXT:    paddw %xmm0, %xmm1244; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]245; SSSE3-SLOW-NEXT:    paddw %xmm1, %xmm0246; SSSE3-SLOW-NEXT:    movdqa %xmm0, %xmm1247; SSSE3-SLOW-NEXT:    psrld $16, %xmm1248; SSSE3-SLOW-NEXT:    paddw %xmm0, %xmm1249; SSSE3-SLOW-NEXT:    movd %xmm1, %eax250; SSSE3-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax251; SSSE3-SLOW-NEXT:    retq252;253; SSSE3-FAST-LABEL: PR37890_v16i16:254; SSSE3-FAST:       # %bb.0:255; SSSE3-FAST-NEXT:    paddw %xmm1, %xmm0256; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0257; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0258; SSSE3-FAST-NEXT:    phaddw %xmm0, %xmm0259; SSSE3-FAST-NEXT:    movd %xmm0, %eax260; SSSE3-FAST-NEXT:    # kill: def $ax killed $ax killed $eax261; SSSE3-FAST-NEXT:    retq262;263; AVX1-SLOW-LABEL: PR37890_v16i16:264; AVX1-SLOW:       # %bb.0:265; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1266; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0267; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]268; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0269; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]270; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0271; AVX1-SLOW-NEXT:    vpsrld $16, %xmm0, %xmm1272; AVX1-SLOW-NEXT:    vpaddw %xmm1, %xmm0, %xmm0273; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax274; AVX1-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax275; AVX1-SLOW-NEXT:    vzeroupper276; AVX1-SLOW-NEXT:    retq277;278; AVX1-FAST-LABEL: PR37890_v16i16:279; AVX1-FAST:       # %bb.0:280; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1281; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm1, %xmm0282; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0283; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0284; AVX1-FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0285; AVX1-FAST-NEXT:    vmovd %xmm0, %eax286; AVX1-FAST-NEXT:    # kill: def $ax killed $ax killed $eax287; AVX1-FAST-NEXT:    vzeroupper288; AVX1-FAST-NEXT:    retq289;290; AVX2-LABEL: PR37890_v16i16:291; AVX2:       # %bb.0:292; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1293; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0294; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]295; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0296; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]297; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0298; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1299; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0300; AVX2-NEXT:    vmovd %xmm0, %eax301; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax302; AVX2-NEXT:    vzeroupper303; AVX2-NEXT:    retq304  %hi0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>305  %lo0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>306  %sum0 = add <8 x i16> %lo0, %hi0307  %hi1 = shufflevector <8 x i16> %sum0, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>308  %lo1 = shufflevector <8 x i16> %sum0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>309  %sum1 = add <4 x i16> %lo1, %hi1310  %hi2 = shufflevector <4 x i16> %sum1, <4 x i16> undef, <2 x i32> <i32 2, i32 3>311  %lo2 = shufflevector <4 x i16> %sum1, <4 x i16> undef, <2 x i32> <i32 0, i32 1>312  %sum2 = add <2 x i16> %lo2, %hi2313  %hi3 = shufflevector <2 x i16> %sum2, <2 x i16> undef, <2 x i32> <i32 1, i32 undef>314  %sum3 = add <2 x i16> %sum2, %hi3315  %e = extractelement <2 x i16> %sum3, i32 0316  ret i16 %e317}318 319define i32 @PR37890_v16i32(<16 x i32> %a)  {320; SSE2-LABEL: PR37890_v16i32:321; SSE2:       # %bb.0:322; SSE2-NEXT:    paddd %xmm3, %xmm1323; SSE2-NEXT:    paddd %xmm2, %xmm0324; SSE2-NEXT:    paddd %xmm1, %xmm0325; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]326; SSE2-NEXT:    paddd %xmm0, %xmm1327; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]328; SSE2-NEXT:    paddd %xmm1, %xmm0329; SSE2-NEXT:    movd %xmm0, %eax330; SSE2-NEXT:    retq331;332; SSSE3-SLOW-LABEL: PR37890_v16i32:333; SSSE3-SLOW:       # %bb.0:334; SSSE3-SLOW-NEXT:    paddd %xmm3, %xmm1335; SSSE3-SLOW-NEXT:    paddd %xmm2, %xmm0336; SSSE3-SLOW-NEXT:    paddd %xmm1, %xmm0337; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]338; SSSE3-SLOW-NEXT:    paddd %xmm0, %xmm1339; SSSE3-SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]340; SSSE3-SLOW-NEXT:    paddd %xmm1, %xmm0341; SSSE3-SLOW-NEXT:    movd %xmm0, %eax342; SSSE3-SLOW-NEXT:    retq343;344; SSSE3-FAST-LABEL: PR37890_v16i32:345; SSSE3-FAST:       # %bb.0:346; SSSE3-FAST-NEXT:    paddd %xmm3, %xmm1347; SSSE3-FAST-NEXT:    paddd %xmm2, %xmm0348; SSSE3-FAST-NEXT:    paddd %xmm1, %xmm0349; SSSE3-FAST-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]350; SSSE3-FAST-NEXT:    paddd %xmm0, %xmm1351; SSSE3-FAST-NEXT:    phaddd %xmm1, %xmm1352; SSSE3-FAST-NEXT:    movd %xmm1, %eax353; SSSE3-FAST-NEXT:    retq354;355; AVX1-SLOW-LABEL: PR37890_v16i32:356; AVX1-SLOW:       # %bb.0:357; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2358; AVX1-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm3359; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm3, %xmm2360; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0361; AVX1-SLOW-NEXT:    vpaddd %xmm2, %xmm0, %xmm0362; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]363; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0364; AVX1-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]365; AVX1-SLOW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0366; AVX1-SLOW-NEXT:    vmovd %xmm0, %eax367; AVX1-SLOW-NEXT:    vzeroupper368; AVX1-SLOW-NEXT:    retq369;370; AVX1-FAST-LABEL: PR37890_v16i32:371; AVX1-FAST:       # %bb.0:372; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm2373; AVX1-FAST-NEXT:    vextractf128 $1, %ymm1, %xmm1374; AVX1-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm0375; AVX1-FAST-NEXT:    vpaddd %xmm1, %xmm0, %xmm0376; AVX1-FAST-NEXT:    vphaddd %xmm2, %xmm0, %xmm0377; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0378; AVX1-FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0379; AVX1-FAST-NEXT:    vmovd %xmm0, %eax380; AVX1-FAST-NEXT:    vzeroupper381; AVX1-FAST-NEXT:    retq382;383; AVX2-LABEL: PR37890_v16i32:384; AVX2:       # %bb.0:385; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0386; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1387; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0388; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]389; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0390; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]391; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0392; AVX2-NEXT:    vmovd %xmm0, %eax393; AVX2-NEXT:    vzeroupper394; AVX2-NEXT:    retq395  %hi0 = shufflevector <16 x i32> %a, <16 x i32> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>396  %lo0 = shufflevector <16 x i32> %a, <16 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>397  %sum0 = add <8 x i32> %lo0, %hi0398  %hi1 = shufflevector <8 x i32> %sum0, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>399  %lo1 = shufflevector <8 x i32> %sum0, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>400  %sum1 = add <4 x i32> %lo1, %hi1401  %hi2 = shufflevector <4 x i32> %sum1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>402  %lo2 = shufflevector <4 x i32> %sum1, <4 x i32> undef, <2 x i32> <i32 0, i32 1>403  %sum2 = add <2 x i32> %lo2, %hi2404  %hi3 = shufflevector <2 x i32> %sum2, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>405  %sum3 = add <2 x i32> %sum2, %hi3406  %e = extractelement <2 x i32> %sum3, i32 0407  ret i32 %e408}409