brintos

brintos / llvm-project-archived public Read only

0
0
Text · 56.8 KiB · 364ad95 Raw
1423 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse3           | FileCheck %s --check-prefixes=SSE,SSE_SLOW,SSE33; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse3,fast-hops | FileCheck %s --check-prefixes=SSE,SSE_FAST,SSE34; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3           | FileCheck %s --check-prefixes=SSE,SSE_SLOW,SSSE3,SSSE3_SLOW5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3,fast-hops | FileCheck %s --check-prefixes=SSE,SSE_FAST,SSSE3,SSSE3_FAST6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx             | FileCheck %s --check-prefixes=AVX,AVX1,AVX1_SLOW7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx,fast-hops   | FileCheck %s --check-prefixes=AVX,AVX1,AVX1_FAST8; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2            | FileCheck %s --check-prefixes=AVX,AVX2,AVX2_SLOW9; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2,fast-hops  | FileCheck %s --check-prefixes=AVX,AVX2,AVX2_FAST10 11; The next 8 tests check for matching the horizontal op and eliminating the shuffle.12; PR34111 - https://bugs.llvm.org/show_bug.cgi?id=3411113 14define <4 x float> @hadd_v4f32(<4 x float> %a) {15; SSE-LABEL: hadd_v4f32:16; SSE:       # %bb.0:17; SSE-NEXT:    haddps %xmm0, %xmm018; SSE-NEXT:    retq19;20; AVX-LABEL: hadd_v4f32:21; AVX:       # %bb.0:22; AVX-NEXT:    vhaddps %xmm0, %xmm0, %xmm023; AVX-NEXT:    retq24  %a02 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 2>25  %a13 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 1, i32 3>26  %hop = fadd <2 x float> %a02, %a1327  %shuf = shufflevector <2 x float> %hop, <2 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 1>28  ret <4 x float> %shuf29}30 31define <8 x float> @hadd_v8f32a(<8 x float> %a) {32; SSE_SLOW-LABEL: hadd_v8f32a:33; SSE_SLOW:       # %bb.0:34; SSE_SLOW-NEXT:    movaps %xmm0, %xmm235; SSE_SLOW-NEXT:    haddps %xmm1, %xmm236; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm2[0,0]37; SSE_SLOW-NEXT:    movaps %xmm2, %xmm138; SSE_SLOW-NEXT:    retq39;40; SSE_FAST-LABEL: hadd_v8f32a:41; SSE_FAST:       # %bb.0:42; SSE_FAST-NEXT:    movaps %xmm0, %xmm243; SSE_FAST-NEXT:    haddps %xmm1, %xmm244; SSE_FAST-NEXT:    haddps %xmm0, %xmm045; SSE_FAST-NEXT:    movaps %xmm2, %xmm146; SSE_FAST-NEXT:    retq47;48; AVX1_SLOW-LABEL: hadd_v8f32a:49; AVX1_SLOW:       # %bb.0:50; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm151; AVX1_SLOW-NEXT:    vhaddps %xmm1, %xmm0, %xmm052; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]53; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm054; AVX1_SLOW-NEXT:    retq55;56; AVX1_FAST-LABEL: hadd_v8f32a:57; AVX1_FAST:       # %bb.0:58; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm159; AVX1_FAST-NEXT:    vhaddps %ymm0, %ymm1, %ymm060; AVX1_FAST-NEXT:    retq61;62; AVX2-LABEL: hadd_v8f32a:63; AVX2:       # %bb.0:64; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm165; AVX2-NEXT:    vhaddps %xmm1, %xmm0, %xmm066; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,1]67; AVX2-NEXT:    retq68  %a0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>69  %a1 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>70  %hop = fadd <4 x float> %a0, %a171  %shuf = shufflevector <4 x float> %hop, <4 x float> undef, <8 x i32> <i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef, i32 2, i32 3>72  ret <8 x float> %shuf73}74 75define <8 x float> @hadd_v8f32b(<8 x float> %a) {76; SSE-LABEL: hadd_v8f32b:77; SSE:       # %bb.0:78; SSE-NEXT:    haddps %xmm0, %xmm079; SSE-NEXT:    haddps %xmm1, %xmm180; SSE-NEXT:    retq81;82; AVX-LABEL: hadd_v8f32b:83; AVX:       # %bb.0:84; AVX-NEXT:    vhaddps %ymm0, %ymm0, %ymm085; AVX-NEXT:    retq86  %a0 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>87  %a1 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>88  %hop = fadd <8 x float> %a0, %a189  %shuf = shufflevector <8 x float> %hop, <8 x float> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>90  ret <8 x float> %shuf91}92 93define <4 x float> @hsub_v4f32(<4 x float> %a) {94; SSE-LABEL: hsub_v4f32:95; SSE:       # %bb.0:96; SSE-NEXT:    hsubps %xmm0, %xmm097; SSE-NEXT:    retq98;99; AVX-LABEL: hsub_v4f32:100; AVX:       # %bb.0:101; AVX-NEXT:    vhsubps %xmm0, %xmm0, %xmm0102; AVX-NEXT:    retq103  %a02 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 2>104  %a13 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 1, i32 3>105  %hop = fsub <2 x float> %a02, %a13106  %shuf = shufflevector <2 x float> %hop, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>107  ret <4 x float> %shuf108}109 110define <8 x float> @hsub_v8f32a(<8 x float> %a) {111; SSE_SLOW-LABEL: hsub_v8f32a:112; SSE_SLOW:       # %bb.0:113; SSE_SLOW-NEXT:    movaps %xmm0, %xmm2114; SSE_SLOW-NEXT:    hsubps %xmm1, %xmm2115; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm2[0,0]116; SSE_SLOW-NEXT:    movaps %xmm2, %xmm1117; SSE_SLOW-NEXT:    retq118;119; SSE_FAST-LABEL: hsub_v8f32a:120; SSE_FAST:       # %bb.0:121; SSE_FAST-NEXT:    movaps %xmm0, %xmm2122; SSE_FAST-NEXT:    hsubps %xmm1, %xmm2123; SSE_FAST-NEXT:    hsubps %xmm0, %xmm0124; SSE_FAST-NEXT:    movaps %xmm2, %xmm1125; SSE_FAST-NEXT:    retq126;127; AVX1_SLOW-LABEL: hsub_v8f32a:128; AVX1_SLOW:       # %bb.0:129; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1130; AVX1_SLOW-NEXT:    vhsubps %xmm1, %xmm0, %xmm0131; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]132; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0133; AVX1_SLOW-NEXT:    retq134;135; AVX1_FAST-LABEL: hsub_v8f32a:136; AVX1_FAST:       # %bb.0:137; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1138; AVX1_FAST-NEXT:    vhsubps %ymm0, %ymm1, %ymm0139; AVX1_FAST-NEXT:    retq140;141; AVX2-LABEL: hsub_v8f32a:142; AVX2:       # %bb.0:143; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1144; AVX2-NEXT:    vhsubps %xmm1, %xmm0, %xmm0145; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,2,1]146; AVX2-NEXT:    retq147  %a0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>148  %a1 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>149  %hop = fsub <4 x float> %a0, %a1150  %shuf = shufflevector <4 x float> %hop, <4 x float> undef, <8 x i32> <i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef, i32 2, i32 3>151  ret <8 x float> %shuf152}153 154define <8 x float> @hsub_v8f32b(<8 x float> %a) {155; SSE-LABEL: hsub_v8f32b:156; SSE:       # %bb.0:157; SSE-NEXT:    hsubps %xmm0, %xmm0158; SSE-NEXT:    hsubps %xmm1, %xmm1159; SSE-NEXT:    retq160;161; AVX-LABEL: hsub_v8f32b:162; AVX:       # %bb.0:163; AVX-NEXT:    vhsubps %ymm0, %ymm0, %ymm0164; AVX-NEXT:    retq165  %a0 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>166  %a1 = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>167  %hop = fsub <8 x float> %a0, %a1168  %shuf = shufflevector <8 x float> %hop, <8 x float> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>169  ret <8 x float> %shuf170}171 172define <2 x double> @hadd_v2f64(<2 x double> %a) {173; SSE_SLOW-LABEL: hadd_v2f64:174; SSE_SLOW:       # %bb.0:175; SSE_SLOW-NEXT:    movapd %xmm0, %xmm1176; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]177; SSE_SLOW-NEXT:    addsd %xmm0, %xmm1178; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]179; SSE_SLOW-NEXT:    retq180;181; SSE_FAST-LABEL: hadd_v2f64:182; SSE_FAST:       # %bb.0:183; SSE_FAST-NEXT:    haddpd %xmm0, %xmm0184; SSE_FAST-NEXT:    retq185;186; AVX1_SLOW-LABEL: hadd_v2f64:187; AVX1_SLOW:       # %bb.0:188; AVX1_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]189; AVX1_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0190; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]191; AVX1_SLOW-NEXT:    retq192;193; AVX1_FAST-LABEL: hadd_v2f64:194; AVX1_FAST:       # %bb.0:195; AVX1_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0196; AVX1_FAST-NEXT:    retq197;198; AVX2_SLOW-LABEL: hadd_v2f64:199; AVX2_SLOW:       # %bb.0:200; AVX2_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]201; AVX2_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0202; AVX2_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]203; AVX2_SLOW-NEXT:    retq204;205; AVX2_FAST-LABEL: hadd_v2f64:206; AVX2_FAST:       # %bb.0:207; AVX2_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0208; AVX2_FAST-NEXT:    retq209  %a0 = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 0, i32 undef>210  %a1 = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 undef>211  %hop = fadd <2 x double> %a0, %a1212  %shuf = shufflevector <2 x double> %hop, <2 x double> undef, <2 x i32> <i32 0, i32 0>213  ret <2 x double> %shuf214}215 216define <2 x double> @hadd_v2f64_scalar_splat(<2 x double> %a) {217; SSE_SLOW-LABEL: hadd_v2f64_scalar_splat:218; SSE_SLOW:       # %bb.0:219; SSE_SLOW-NEXT:    movapd %xmm0, %xmm1220; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]221; SSE_SLOW-NEXT:    addsd %xmm0, %xmm1222; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]223; SSE_SLOW-NEXT:    retq224;225; SSE_FAST-LABEL: hadd_v2f64_scalar_splat:226; SSE_FAST:       # %bb.0:227; SSE_FAST-NEXT:    haddpd %xmm0, %xmm0228; SSE_FAST-NEXT:    retq229;230; AVX1_SLOW-LABEL: hadd_v2f64_scalar_splat:231; AVX1_SLOW:       # %bb.0:232; AVX1_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]233; AVX1_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0234; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]235; AVX1_SLOW-NEXT:    retq236;237; AVX1_FAST-LABEL: hadd_v2f64_scalar_splat:238; AVX1_FAST:       # %bb.0:239; AVX1_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0240; AVX1_FAST-NEXT:    retq241;242; AVX2_SLOW-LABEL: hadd_v2f64_scalar_splat:243; AVX2_SLOW:       # %bb.0:244; AVX2_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]245; AVX2_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0246; AVX2_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]247; AVX2_SLOW-NEXT:    retq248;249; AVX2_FAST-LABEL: hadd_v2f64_scalar_splat:250; AVX2_FAST:       # %bb.0:251; AVX2_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0252; AVX2_FAST-NEXT:    retq253  %a0 = extractelement <2 x double> %a, i32 0254  %a1 = extractelement <2 x double> %a, i32 1255  %hop = fadd double %a0, %a1256  %ins = insertelement <2 x double> undef, double %hop, i32 0257  %shuf = shufflevector <2 x double> %ins, <2 x double> undef, <2 x i32> <i32 0, i32 0>258  ret <2 x double> %shuf259}260 261define <4 x double> @hadd_v4f64_scalar_splat(<4 x double> %a) {262; SSE_SLOW-LABEL: hadd_v4f64_scalar_splat:263; SSE_SLOW:       # %bb.0:264; SSE_SLOW-NEXT:    movapd %xmm0, %xmm2265; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]266; SSE_SLOW-NEXT:    addsd %xmm0, %xmm2267; SSE_SLOW-NEXT:    movapd %xmm1, %xmm3268; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]269; SSE_SLOW-NEXT:    addsd %xmm1, %xmm3270; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm2[0,0]271; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm1 = xmm3[0,0]272; SSE_SLOW-NEXT:    retq273;274; SSE_FAST-LABEL: hadd_v4f64_scalar_splat:275; SSE_FAST:       # %bb.0:276; SSE_FAST-NEXT:    haddpd %xmm0, %xmm0277; SSE_FAST-NEXT:    haddpd %xmm1, %xmm1278; SSE_FAST-NEXT:    retq279;280; AVX-LABEL: hadd_v4f64_scalar_splat:281; AVX:       # %bb.0:282; AVX-NEXT:    vhaddpd %ymm0, %ymm0, %ymm0283; AVX-NEXT:    retq284  %a0 = extractelement <4 x double> %a, i32 0285  %a1 = extractelement <4 x double> %a, i32 1286  %hop0 = fadd double %a0, %a1287  %a2 = extractelement <4 x double> %a, i32 2288  %a3 = extractelement <4 x double> %a, i32 3289  %hop1 = fadd double %a2, %a3290  %ins = insertelement <4 x double> undef, double %hop0, i32 0291  %ins2 = insertelement <4 x double> %ins,  double %hop1, i32 2292  %shuf = shufflevector <4 x double> %ins2, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>293  ret <4 x double> %shuf294}295 296define <4 x double> @hadd_v4f64_scalar_broadcast(<4 x double> %a) {297; SSE_SLOW-LABEL: hadd_v4f64_scalar_broadcast:298; SSE_SLOW:       # %bb.0:299; SSE_SLOW-NEXT:    movapd %xmm0, %xmm1300; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]301; SSE_SLOW-NEXT:    addsd %xmm0, %xmm1302; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]303; SSE_SLOW-NEXT:    movapd %xmm0, %xmm1304; SSE_SLOW-NEXT:    retq305;306; SSE_FAST-LABEL: hadd_v4f64_scalar_broadcast:307; SSE_FAST:       # %bb.0:308; SSE_FAST-NEXT:    haddpd %xmm0, %xmm0309; SSE_FAST-NEXT:    movapd %xmm0, %xmm1310; SSE_FAST-NEXT:    retq311;312; AVX1_SLOW-LABEL: hadd_v4f64_scalar_broadcast:313; AVX1_SLOW:       # %bb.0:314; AVX1_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]315; AVX1_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0316; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]317; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0318; AVX1_SLOW-NEXT:    retq319;320; AVX1_FAST-LABEL: hadd_v4f64_scalar_broadcast:321; AVX1_FAST:       # %bb.0:322; AVX1_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0323; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0324; AVX1_FAST-NEXT:    retq325;326; AVX2_SLOW-LABEL: hadd_v4f64_scalar_broadcast:327; AVX2_SLOW:       # %bb.0:328; AVX2_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]329; AVX2_SLOW-NEXT:    vaddsd %xmm1, %xmm0, %xmm0330; AVX2_SLOW-NEXT:    vbroadcastsd %xmm0, %ymm0331; AVX2_SLOW-NEXT:    retq332;333; AVX2_FAST-LABEL: hadd_v4f64_scalar_broadcast:334; AVX2_FAST:       # %bb.0:335; AVX2_FAST-NEXT:    vhaddpd %xmm0, %xmm0, %xmm0336; AVX2_FAST-NEXT:    vbroadcastsd %xmm0, %ymm0337; AVX2_FAST-NEXT:    retq338  %a0 = extractelement <4 x double> %a, i32 0339  %a1 = extractelement <4 x double> %a, i32 1340  %hop0 = fadd double %a0, %a1341  %a2 = extractelement <4 x double> %a, i32 2342  %a3 = extractelement <4 x double> %a, i32 3343  %hop1 = fadd double %a2, %a3344  %ins = insertelement <4 x double> undef, double %hop0, i32 0345  %ins2 = insertelement <4 x double> %ins,  double %hop1, i32 2346  %shuf = shufflevector <4 x double> %ins2, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>347  ret <4 x double> %shuf348}349 350define <4 x double> @hadd_v4f64(<4 x double> %a) {351; SSE_SLOW-LABEL: hadd_v4f64:352; SSE_SLOW:       # %bb.0:353; SSE_SLOW-NEXT:    movapd %xmm0, %xmm2354; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]355; SSE_SLOW-NEXT:    addsd %xmm0, %xmm2356; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm2[0,0]357; SSE_SLOW-NEXT:    movapd %xmm1, %xmm2358; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]359; SSE_SLOW-NEXT:    addsd %xmm1, %xmm2360; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm1 = xmm2[0,0]361; SSE_SLOW-NEXT:    retq362;363; SSE_FAST-LABEL: hadd_v4f64:364; SSE_FAST:       # %bb.0:365; SSE_FAST-NEXT:    haddpd %xmm0, %xmm0366; SSE_FAST-NEXT:    haddpd %xmm1, %xmm1367; SSE_FAST-NEXT:    retq368;369; AVX-LABEL: hadd_v4f64:370; AVX:       # %bb.0:371; AVX-NEXT:    vhaddpd %ymm0, %ymm0, %ymm0372; AVX-NEXT:    retq373  %a0 = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> <i32 0, i32 undef, i32 2, i32 undef>374  %a1 = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> <i32 1, i32 undef, i32 3, i32 undef>375  %hop = fadd <4 x double> %a0, %a1376  %shuf = shufflevector <4 x double> %hop, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>377  ret <4 x double> %shuf378}379 380define <2 x double> @hsub_v2f64(<2 x double> %a) {381; SSE_SLOW-LABEL: hsub_v2f64:382; SSE_SLOW:       # %bb.0:383; SSE_SLOW-NEXT:    movapd %xmm0, %xmm1384; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]385; SSE_SLOW-NEXT:    subsd %xmm1, %xmm0386; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]387; SSE_SLOW-NEXT:    retq388;389; SSE_FAST-LABEL: hsub_v2f64:390; SSE_FAST:       # %bb.0:391; SSE_FAST-NEXT:    hsubpd %xmm0, %xmm0392; SSE_FAST-NEXT:    retq393;394; AVX1_SLOW-LABEL: hsub_v2f64:395; AVX1_SLOW:       # %bb.0:396; AVX1_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]397; AVX1_SLOW-NEXT:    vsubsd %xmm1, %xmm0, %xmm0398; AVX1_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]399; AVX1_SLOW-NEXT:    retq400;401; AVX1_FAST-LABEL: hsub_v2f64:402; AVX1_FAST:       # %bb.0:403; AVX1_FAST-NEXT:    vhsubpd %xmm0, %xmm0, %xmm0404; AVX1_FAST-NEXT:    retq405;406; AVX2_SLOW-LABEL: hsub_v2f64:407; AVX2_SLOW:       # %bb.0:408; AVX2_SLOW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]409; AVX2_SLOW-NEXT:    vsubsd %xmm1, %xmm0, %xmm0410; AVX2_SLOW-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]411; AVX2_SLOW-NEXT:    retq412;413; AVX2_FAST-LABEL: hsub_v2f64:414; AVX2_FAST:       # %bb.0:415; AVX2_FAST-NEXT:    vhsubpd %xmm0, %xmm0, %xmm0416; AVX2_FAST-NEXT:    retq417  %a0 = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 0, i32 undef>418  %a1 = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 undef>419  %hop = fsub <2 x double> %a0, %a1420  %shuf = shufflevector <2 x double> %hop, <2 x double> undef, <2 x i32> <i32 undef, i32 0>421  ret <2 x double> %shuf422}423 424define <4 x double> @hsub_v4f64(<4 x double> %a) {425; SSE_SLOW-LABEL: hsub_v4f64:426; SSE_SLOW:       # %bb.0:427; SSE_SLOW-NEXT:    movapd %xmm0, %xmm2428; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]429; SSE_SLOW-NEXT:    subsd %xmm2, %xmm0430; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]431; SSE_SLOW-NEXT:    movapd %xmm1, %xmm2432; SSE_SLOW-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]433; SSE_SLOW-NEXT:    subsd %xmm2, %xmm1434; SSE_SLOW-NEXT:    movddup {{.*#+}} xmm1 = xmm1[0,0]435; SSE_SLOW-NEXT:    retq436;437; SSE_FAST-LABEL: hsub_v4f64:438; SSE_FAST:       # %bb.0:439; SSE_FAST-NEXT:    hsubpd %xmm0, %xmm0440; SSE_FAST-NEXT:    hsubpd %xmm1, %xmm1441; SSE_FAST-NEXT:    retq442;443; AVX-LABEL: hsub_v4f64:444; AVX:       # %bb.0:445; AVX-NEXT:    vhsubpd %ymm0, %ymm0, %ymm0446; AVX-NEXT:    retq447  %a0 = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> <i32 0, i32 undef, i32 2, i32 undef>448  %a1 = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> <i32 1, i32 undef, i32 3, i32 undef>449  %hop = fsub <4 x double> %a0, %a1450  %shuf = shufflevector <4 x double> %hop, <4 x double> undef, <4 x i32> <i32 0, i32 0, i32 2, i32 2>451  ret <4 x double> %shuf452}453 454define <4 x i32> @hadd_v4i32(<4 x i32> %a) {455; SSE3-LABEL: hadd_v4i32:456; SSE3:       # %bb.0:457; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]458; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,2]459; SSE3-NEXT:    paddd %xmm1, %xmm0460; SSE3-NEXT:    retq461;462; SSSE3-LABEL: hadd_v4i32:463; SSSE3:       # %bb.0:464; SSSE3-NEXT:    phaddd %xmm0, %xmm0465; SSSE3-NEXT:    retq466;467; AVX-LABEL: hadd_v4i32:468; AVX:       # %bb.0:469; AVX-NEXT:    vphaddd %xmm0, %xmm0, %xmm0470; AVX-NEXT:    retq471  %a02 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>472  %a13 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>473  %hop = add <4 x i32> %a02, %a13474  %shuf = shufflevector <4 x i32> %hop, <4 x i32> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 1>475  ret <4 x i32> %shuf476}477 478define <8 x i32> @hadd_v8i32a(<8 x i32> %a) {479; SSE3-LABEL: hadd_v8i32a:480; SSE3:       # %bb.0:481; SSE3-NEXT:    movaps %xmm0, %xmm2482; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]483; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]484; SSE3-NEXT:    paddd %xmm0, %xmm2485; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]486; SSE3-NEXT:    movdqa %xmm2, %xmm1487; SSE3-NEXT:    retq488;489; SSSE3_SLOW-LABEL: hadd_v8i32a:490; SSSE3_SLOW:       # %bb.0:491; SSSE3_SLOW-NEXT:    movdqa %xmm0, %xmm2492; SSSE3_SLOW-NEXT:    phaddd %xmm1, %xmm2493; SSSE3_SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]494; SSSE3_SLOW-NEXT:    movdqa %xmm2, %xmm1495; SSSE3_SLOW-NEXT:    retq496;497; SSSE3_FAST-LABEL: hadd_v8i32a:498; SSSE3_FAST:       # %bb.0:499; SSSE3_FAST-NEXT:    movdqa %xmm0, %xmm2500; SSSE3_FAST-NEXT:    phaddd %xmm1, %xmm2501; SSSE3_FAST-NEXT:    phaddd %xmm0, %xmm0502; SSSE3_FAST-NEXT:    movdqa %xmm2, %xmm1503; SSSE3_FAST-NEXT:    retq504;505; AVX1_SLOW-LABEL: hadd_v8i32a:506; AVX1_SLOW:       # %bb.0:507; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1508; AVX1_SLOW-NEXT:    vphaddd %xmm1, %xmm0, %xmm0509; AVX1_SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]510; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0511; AVX1_SLOW-NEXT:    retq512;513; AVX1_FAST-LABEL: hadd_v8i32a:514; AVX1_FAST:       # %bb.0:515; AVX1_FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1516; AVX1_FAST-NEXT:    vphaddd %xmm1, %xmm0, %xmm1517; AVX1_FAST-NEXT:    vphaddd %xmm0, %xmm0, %xmm0518; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0519; AVX1_FAST-NEXT:    retq520;521; AVX2-LABEL: hadd_v8i32a:522; AVX2:       # %bb.0:523; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1524; AVX2-NEXT:    vphaddd %xmm1, %xmm0, %xmm0525; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,1]526; AVX2-NEXT:    retq527  %a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>528  %a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>529  %hop = add <4 x i32> %a0, %a1530  %shuf = shufflevector <4 x i32> %hop, <4 x i32> undef, <8 x i32> <i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef, i32 2, i32 3>531  ret <8 x i32> %shuf532}533 534define <8 x i32> @hadd_v8i32b(<8 x i32> %a) {535; SSE3-LABEL: hadd_v8i32b:536; SSE3:       # %bb.0:537; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,1,3]538; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,0,2]539; SSE3-NEXT:    paddd %xmm2, %xmm0540; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,1,3]541; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,0,2]542; SSE3-NEXT:    paddd %xmm2, %xmm1543; SSE3-NEXT:    retq544;545; SSSE3-LABEL: hadd_v8i32b:546; SSSE3:       # %bb.0:547; SSSE3-NEXT:    phaddd %xmm0, %xmm0548; SSSE3-NEXT:    phaddd %xmm1, %xmm1549; SSSE3-NEXT:    retq550;551; AVX1-LABEL: hadd_v8i32b:552; AVX1:       # %bb.0:553; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm1554; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0555; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm0556; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0557; AVX1-NEXT:    retq558;559; AVX2-LABEL: hadd_v8i32b:560; AVX2:       # %bb.0:561; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0562; AVX2-NEXT:    retq563  %a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>564  %a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>565  %hop = add <8 x i32> %a0, %a1566  %shuf = shufflevector <8 x i32> %hop, <8 x i32> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>567  ret <8 x i32> %shuf568}569 570define <4 x i32> @hsub_v4i32(<4 x i32> %a) {571; SSE3-LABEL: hsub_v4i32:572; SSE3:       # %bb.0:573; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,3,1,3]574; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,0,3]575; SSE3-NEXT:    psubd %xmm1, %xmm0576; SSE3-NEXT:    retq577;578; SSSE3-LABEL: hsub_v4i32:579; SSSE3:       # %bb.0:580; SSSE3-NEXT:    phsubd %xmm0, %xmm0581; SSSE3-NEXT:    retq582;583; AVX-LABEL: hsub_v4i32:584; AVX:       # %bb.0:585; AVX-NEXT:    vphsubd %xmm0, %xmm0, %xmm0586; AVX-NEXT:    retq587  %a02 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>588  %a13 = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>589  %hop = sub <4 x i32> %a02, %a13590  %shuf = shufflevector <4 x i32> %hop, <4 x i32> undef, <4 x i32> <i32 undef, i32 1, i32 0, i32 undef>591  ret <4 x i32> %shuf592}593 594define <8 x i32> @hsub_v8i32a(<8 x i32> %a) {595; SSE3-LABEL: hsub_v8i32a:596; SSE3:       # %bb.0:597; SSE3-NEXT:    movaps %xmm0, %xmm2598; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]599; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]600; SSE3-NEXT:    psubd %xmm0, %xmm2601; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]602; SSE3-NEXT:    movdqa %xmm2, %xmm1603; SSE3-NEXT:    retq604;605; SSSE3_SLOW-LABEL: hsub_v8i32a:606; SSSE3_SLOW:       # %bb.0:607; SSSE3_SLOW-NEXT:    movdqa %xmm0, %xmm2608; SSSE3_SLOW-NEXT:    phsubd %xmm1, %xmm2609; SSSE3_SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]610; SSSE3_SLOW-NEXT:    movdqa %xmm2, %xmm1611; SSSE3_SLOW-NEXT:    retq612;613; SSSE3_FAST-LABEL: hsub_v8i32a:614; SSSE3_FAST:       # %bb.0:615; SSSE3_FAST-NEXT:    movdqa %xmm0, %xmm2616; SSSE3_FAST-NEXT:    phsubd %xmm1, %xmm2617; SSSE3_FAST-NEXT:    phsubd %xmm0, %xmm0618; SSSE3_FAST-NEXT:    movdqa %xmm2, %xmm1619; SSSE3_FAST-NEXT:    retq620;621; AVX1_SLOW-LABEL: hsub_v8i32a:622; AVX1_SLOW:       # %bb.0:623; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1624; AVX1_SLOW-NEXT:    vphsubd %xmm1, %xmm0, %xmm0625; AVX1_SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]626; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0627; AVX1_SLOW-NEXT:    retq628;629; AVX1_FAST-LABEL: hsub_v8i32a:630; AVX1_FAST:       # %bb.0:631; AVX1_FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1632; AVX1_FAST-NEXT:    vphsubd %xmm1, %xmm0, %xmm1633; AVX1_FAST-NEXT:    vphsubd %xmm0, %xmm0, %xmm0634; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0635; AVX1_FAST-NEXT:    retq636;637; AVX2-LABEL: hsub_v8i32a:638; AVX2:       # %bb.0:639; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1640; AVX2-NEXT:    vphsubd %xmm1, %xmm0, %xmm0641; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,1]642; AVX2-NEXT:    retq643  %a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>644  %a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>645  %hop = sub <4 x i32> %a0, %a1646  %shuf = shufflevector <4 x i32> %hop, <4 x i32> undef, <8 x i32> <i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef, i32 2, i32 3>647  ret <8 x i32> %shuf648}649 650define <8 x i32> @hsub_v8i32b(<8 x i32> %a) {651; SSE3-LABEL: hsub_v8i32b:652; SSE3:       # %bb.0:653; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,1,3]654; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,0,2]655; SSE3-NEXT:    psubd %xmm2, %xmm0656; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,1,3]657; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,0,2]658; SSE3-NEXT:    psubd %xmm2, %xmm1659; SSE3-NEXT:    retq660;661; SSSE3-LABEL: hsub_v8i32b:662; SSSE3:       # %bb.0:663; SSSE3-NEXT:    phsubd %xmm0, %xmm0664; SSSE3-NEXT:    phsubd %xmm1, %xmm1665; SSSE3-NEXT:    retq666;667; AVX1-LABEL: hsub_v8i32b:668; AVX1:       # %bb.0:669; AVX1-NEXT:    vphsubd %xmm0, %xmm0, %xmm1670; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0671; AVX1-NEXT:    vphsubd %xmm0, %xmm0, %xmm0672; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0673; AVX1-NEXT:    retq674;675; AVX2-LABEL: hsub_v8i32b:676; AVX2:       # %bb.0:677; AVX2-NEXT:    vphsubd %ymm0, %ymm0, %ymm0678; AVX2-NEXT:    retq679  %a0 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 4, i32 6, i32 undef, i32 undef>680  %a1 = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 5, i32 7, i32 undef, i32 undef>681  %hop = sub <8 x i32> %a0, %a1682  %shuf = shufflevector <8 x i32> %hop, <8 x i32> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 4, i32 5, i32 4, i32 5>683  ret <8 x i32> %shuf684}685 686define <8 x i16> @hadd_v8i16(<8 x i16> %a) {687; SSE3-LABEL: hadd_v8i16:688; SSE3:       # %bb.0:689; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]690; SSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]691; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,2]692; SSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]693; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,5,6,7]694; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,2,0]695; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]696; SSE3-NEXT:    paddw %xmm1, %xmm0697; SSE3-NEXT:    retq698;699; SSSE3-LABEL: hadd_v8i16:700; SSSE3:       # %bb.0:701; SSSE3-NEXT:    phaddw %xmm0, %xmm0702; SSSE3-NEXT:    retq703;704; AVX-LABEL: hadd_v8i16:705; AVX:       # %bb.0:706; AVX-NEXT:    vphaddw %xmm0, %xmm0, %xmm0707; AVX-NEXT:    retq708  %a0246 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>709  %a1357 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>710  %hop = add <8 x i16> %a0246, %a1357711  %shuf = shufflevector <8 x i16> %hop, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 2, i32 3>712  ret <8 x i16> %shuf713}714 715define <16 x i16> @hadd_v16i16a(<16 x i16> %a) {716; SSE3-LABEL: hadd_v16i16a:717; SSE3:       # %bb.0:718; SSE3-NEXT:    movdqa %xmm1, %xmm3719; SSE3-NEXT:    pslld $16, %xmm3720; SSE3-NEXT:    psrad $16, %xmm3721; SSE3-NEXT:    movdqa %xmm0, %xmm2722; SSE3-NEXT:    pslld $16, %xmm2723; SSE3-NEXT:    psrad $16, %xmm2724; SSE3-NEXT:    packssdw %xmm3, %xmm2725; SSE3-NEXT:    psrad $16, %xmm1726; SSE3-NEXT:    psrad $16, %xmm0727; SSE3-NEXT:    packssdw %xmm1, %xmm0728; SSE3-NEXT:    paddw %xmm0, %xmm2729; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]730; SSE3-NEXT:    movdqa %xmm2, %xmm1731; SSE3-NEXT:    retq732;733; SSSE3_SLOW-LABEL: hadd_v16i16a:734; SSSE3_SLOW:       # %bb.0:735; SSSE3_SLOW-NEXT:    movdqa %xmm0, %xmm2736; SSSE3_SLOW-NEXT:    phaddw %xmm1, %xmm2737; SSSE3_SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]738; SSSE3_SLOW-NEXT:    movdqa %xmm2, %xmm1739; SSSE3_SLOW-NEXT:    retq740;741; SSSE3_FAST-LABEL: hadd_v16i16a:742; SSSE3_FAST:       # %bb.0:743; SSSE3_FAST-NEXT:    movdqa %xmm0, %xmm2744; SSSE3_FAST-NEXT:    phaddw %xmm1, %xmm2745; SSSE3_FAST-NEXT:    phaddw %xmm0, %xmm0746; SSSE3_FAST-NEXT:    movdqa %xmm2, %xmm1747; SSSE3_FAST-NEXT:    retq748;749; AVX1_SLOW-LABEL: hadd_v16i16a:750; AVX1_SLOW:       # %bb.0:751; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1752; AVX1_SLOW-NEXT:    vphaddw %xmm1, %xmm0, %xmm0753; AVX1_SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]754; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0755; AVX1_SLOW-NEXT:    retq756;757; AVX1_FAST-LABEL: hadd_v16i16a:758; AVX1_FAST:       # %bb.0:759; AVX1_FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1760; AVX1_FAST-NEXT:    vphaddw %xmm1, %xmm0, %xmm1761; AVX1_FAST-NEXT:    vphaddw %xmm0, %xmm0, %xmm0762; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0763; AVX1_FAST-NEXT:    retq764;765; AVX2-LABEL: hadd_v16i16a:766; AVX2:       # %bb.0:767; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1768; AVX2-NEXT:    vphaddw %xmm1, %xmm0, %xmm0769; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,1]770; AVX2-NEXT:    retq771  %a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>772  %a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>773  %hop = add <8 x i16> %a0, %a1774  %shuf = shufflevector <8 x i16> %hop, <8 x i16> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 4, i32 5, i32 6, i32 7>775  ret <16 x i16> %shuf776}777 778define <16 x i16> @hadd_v16i16b(<16 x i16> %a) {779; SSE3-LABEL: hadd_v16i16b:780; SSE3:       # %bb.0:781; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[3,1,1,3,4,5,6,7]782; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,5,7]783; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]784; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,2,3,4,5,6,7]785; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,7,5,4]786; SSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]787; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,4]788; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]789; SSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,3,2,4,5,6,7]790; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]791; SSE3-NEXT:    paddw %xmm2, %xmm0792; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[3,1,1,3,4,5,6,7]793; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,5,7]794; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]795; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,2,3,4,5,6,7]796; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,7,5,4]797; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,0,4,5,6,7]798; SSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,4]799; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,3,2,1]800; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,3,2,4,5,6,7]801; SSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,4,5]802; SSE3-NEXT:    paddw %xmm2, %xmm1803; SSE3-NEXT:    retq804;805; SSSE3-LABEL: hadd_v16i16b:806; SSSE3:       # %bb.0:807; SSSE3-NEXT:    phaddw %xmm0, %xmm0808; SSSE3-NEXT:    phaddw %xmm1, %xmm1809; SSSE3-NEXT:    retq810;811; AVX1-LABEL: hadd_v16i16b:812; AVX1:       # %bb.0:813; AVX1-NEXT:    vphaddw %xmm0, %xmm0, %xmm1814; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0815; AVX1-NEXT:    vphaddw %xmm0, %xmm0, %xmm0816; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0817; AVX1-NEXT:    retq818;819; AVX2-LABEL: hadd_v16i16b:820; AVX2:       # %bb.0:821; AVX2-NEXT:    vphaddw %ymm0, %ymm0, %ymm0822; AVX2-NEXT:    retq823  %a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 10, i32 12, i32 14, i32 undef, i32 undef, i32 undef, i32 undef>824  %a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 9, i32 11, i32 13, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>825  %hop = add <16 x i16> %a0, %a1826  %shuf = shufflevector <16 x i16> %hop, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11>827  ret <16 x i16> %shuf828}829 830define <8 x i16> @hsub_v8i16(<8 x i16> %a) {831; SSE3-LABEL: hsub_v8i16:832; SSE3:       # %bb.0:833; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]834; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[1,1,3,3,4,5,6,7]835; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,6,6]836; SSE3-NEXT:    psubw %xmm1, %xmm0837; SSE3-NEXT:    retq838;839; SSSE3-LABEL: hsub_v8i16:840; SSSE3:       # %bb.0:841; SSSE3-NEXT:    phsubw %xmm0, %xmm0842; SSSE3-NEXT:    retq843;844; AVX-LABEL: hsub_v8i16:845; AVX:       # %bb.0:846; AVX-NEXT:    vphsubw %xmm0, %xmm0, %xmm0847; AVX-NEXT:    retq848  %a0246 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>849  %a1357 = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>850  %hop = sub <8 x i16> %a0246, %a1357851  %shuf = shufflevector <8 x i16> %hop, <8 x i16> undef, <8 x i32> <i32 0, i32 undef, i32 2, i32 undef, i32 undef, i32 1, i32 undef, i32 3>852  ret <8 x i16> %shuf853}854 855define <16 x i16> @hsub_v16i16a(<16 x i16> %a) {856; SSE3-LABEL: hsub_v16i16a:857; SSE3:       # %bb.0:858; SSE3-NEXT:    movdqa %xmm1, %xmm3859; SSE3-NEXT:    pslld $16, %xmm3860; SSE3-NEXT:    psrad $16, %xmm3861; SSE3-NEXT:    movdqa %xmm0, %xmm2862; SSE3-NEXT:    pslld $16, %xmm2863; SSE3-NEXT:    psrad $16, %xmm2864; SSE3-NEXT:    packssdw %xmm3, %xmm2865; SSE3-NEXT:    psrad $16, %xmm1866; SSE3-NEXT:    psrad $16, %xmm0867; SSE3-NEXT:    packssdw %xmm1, %xmm0868; SSE3-NEXT:    psubw %xmm0, %xmm2869; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]870; SSE3-NEXT:    movdqa %xmm2, %xmm1871; SSE3-NEXT:    retq872;873; SSSE3_SLOW-LABEL: hsub_v16i16a:874; SSSE3_SLOW:       # %bb.0:875; SSSE3_SLOW-NEXT:    movdqa %xmm0, %xmm2876; SSSE3_SLOW-NEXT:    phsubw %xmm1, %xmm2877; SSSE3_SLOW-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,1,0,1]878; SSSE3_SLOW-NEXT:    movdqa %xmm2, %xmm1879; SSSE3_SLOW-NEXT:    retq880;881; SSSE3_FAST-LABEL: hsub_v16i16a:882; SSSE3_FAST:       # %bb.0:883; SSSE3_FAST-NEXT:    movdqa %xmm0, %xmm2884; SSSE3_FAST-NEXT:    phsubw %xmm1, %xmm2885; SSSE3_FAST-NEXT:    phsubw %xmm0, %xmm0886; SSSE3_FAST-NEXT:    movdqa %xmm2, %xmm1887; SSSE3_FAST-NEXT:    retq888;889; AVX1_SLOW-LABEL: hsub_v16i16a:890; AVX1_SLOW:       # %bb.0:891; AVX1_SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1892; AVX1_SLOW-NEXT:    vphsubw %xmm1, %xmm0, %xmm0893; AVX1_SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]894; AVX1_SLOW-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0895; AVX1_SLOW-NEXT:    retq896;897; AVX1_FAST-LABEL: hsub_v16i16a:898; AVX1_FAST:       # %bb.0:899; AVX1_FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1900; AVX1_FAST-NEXT:    vphsubw %xmm1, %xmm0, %xmm1901; AVX1_FAST-NEXT:    vphsubw %xmm0, %xmm0, %xmm0902; AVX1_FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0903; AVX1_FAST-NEXT:    retq904;905; AVX2-LABEL: hsub_v16i16a:906; AVX2:       # %bb.0:907; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1908; AVX2-NEXT:    vphsubw %xmm1, %xmm0, %xmm0909; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,0,2,1]910; AVX2-NEXT:    retq911  %a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>912  %a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>913  %hop = sub <8 x i16> %a0, %a1914  %shuf = shufflevector <8 x i16> %hop, <8 x i16> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 4, i32 5, i32 6, i32 7>915  ret <16 x i16> %shuf916}917 918define <16 x i16> @hsub_v16i16b(<16 x i16> %a) {919; SSE3-LABEL: hsub_v16i16b:920; SSE3:       # %bb.0:921; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[3,1,1,3,4,5,6,7]922; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,5,7]923; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]924; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,2,3,4,5,6,7]925; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,7,5,4]926; SSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,0,4,5,6,7]927; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,4]928; SSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,2,1]929; SSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,3,2,4,5,6,7]930; SSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]931; SSE3-NEXT:    psubw %xmm2, %xmm0932; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[3,1,1,3,4,5,6,7]933; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,7,5,5,7]934; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,3,2,1]935; SSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[1,0,2,3,4,5,6,7]936; SSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,6,7,5,4]937; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,0,4,5,6,7]938; SSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,4]939; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,3,2,1]940; SSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,3,2,4,5,6,7]941; SSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,7,6,4,5]942; SSE3-NEXT:    psubw %xmm2, %xmm1943; SSE3-NEXT:    retq944;945; SSSE3-LABEL: hsub_v16i16b:946; SSSE3:       # %bb.0:947; SSSE3-NEXT:    phsubw %xmm0, %xmm0948; SSSE3-NEXT:    phsubw %xmm1, %xmm1949; SSSE3-NEXT:    retq950;951; AVX1-LABEL: hsub_v16i16b:952; AVX1:       # %bb.0:953; AVX1-NEXT:    vphsubw %xmm0, %xmm0, %xmm1954; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0955; AVX1-NEXT:    vphsubw %xmm0, %xmm0, %xmm0956; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0957; AVX1-NEXT:    retq958;959; AVX2-LABEL: hsub_v16i16b:960; AVX2:       # %bb.0:961; AVX2-NEXT:    vphsubw %ymm0, %ymm0, %ymm0962; AVX2-NEXT:    retq963  %a0 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 10, i32 12, i32 14, i32 undef, i32 undef, i32 undef, i32 undef>964  %a1 = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 9, i32 11, i32 13, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>965  %hop = sub <16 x i16> %a0, %a1966  %shuf = shufflevector <16 x i16> %hop, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11>967  ret <16 x i16> %shuf968}969 970define <4 x float> @broadcast_haddps_v4f32(<4 x float> %a0) {971; SSE-LABEL: broadcast_haddps_v4f32:972; SSE:       # %bb.0:973; SSE-NEXT:    haddps %xmm0, %xmm0974; SSE-NEXT:    movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]975; SSE-NEXT:    retq976;977; AVX1-LABEL: broadcast_haddps_v4f32:978; AVX1:       # %bb.0:979; AVX1-NEXT:    vhaddps %xmm0, %xmm0, %xmm0980; AVX1-NEXT:    vmovsldup {{.*#+}} xmm0 = xmm0[0,0,2,2]981; AVX1-NEXT:    retq982;983; AVX2-LABEL: broadcast_haddps_v4f32:984; AVX2:       # %bb.0:985; AVX2-NEXT:    vhaddps %xmm0, %xmm0, %xmm0986; AVX2-NEXT:    vbroadcastss %xmm0, %xmm0987; AVX2-NEXT:    retq988  %1 = tail call <4 x float> @llvm.x86.sse3.hadd.ps(<4 x float> %a0, <4 x float> %a0)989  %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> zeroinitializer990  ret <4 x float> %2991}992 993declare <4 x float> @llvm.x86.sse3.hadd.ps(<4 x float>, <4 x float>)994 995define <4 x float> @PR34724_1(<4 x float> %a, <4 x float> %b) {996; SSE-LABEL: PR34724_1:997; SSE:       # %bb.0:998; SSE-NEXT:    haddps %xmm1, %xmm0999; SSE-NEXT:    retq1000;1001; AVX-LABEL: PR34724_1:1002; AVX:       # %bb.0:1003; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm01004; AVX-NEXT:    retq1005  %t0 = shufflevector <4 x float> %a, <4 x float> %b, <2 x i32> <i32 2, i32 4>1006  %t1 = shufflevector <4 x float> %a, <4 x float> %b, <2 x i32> <i32 3, i32 5>1007  %t2 = fadd <2 x float> %t0, %t11008  %vecinit9 = shufflevector <2 x float> %t2, <2 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 undef>1009  %t3 = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 undef, i32 2>1010  %t4 = fadd <4 x float> %t3, %b1011  %vecinit13 = shufflevector <4 x float> %vecinit9, <4 x float> %t4, <4 x i32> <i32 undef, i32 1, i32 2, i32 7>1012  ret <4 x float> %vecinit131013}1014 1015define <4 x float> @PR34724_2(<4 x float> %a, <4 x float> %b) {1016; SSE-LABEL: PR34724_2:1017; SSE:       # %bb.0:1018; SSE-NEXT:    haddps %xmm1, %xmm01019; SSE-NEXT:    retq1020;1021; AVX-LABEL: PR34724_2:1022; AVX:       # %bb.0:1023; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm01024; AVX-NEXT:    retq1025  %t0 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 4, i32 undef, i32 undef>1026  %t1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 3, i32 5, i32 undef, i32 undef>1027  %t2 = fadd <4 x float> %t0, %t11028  %vecinit9 = shufflevector <4 x float> %t2, <4 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 undef>1029  %t3 = shufflevector <4 x float> %b, <4 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 undef, i32 2>1030  %t4 = fadd <4 x float> %t3, %b1031  %vecinit13 = shufflevector <4 x float> %vecinit9, <4 x float> %t4, <4 x i32> <i32 undef, i32 1, i32 2, i32 7>1032  ret <4 x float> %vecinit131033}1034 1035;1036; fold HOP(LOSUBVECTOR(SHUFFLE(X)),HISUBVECTOR(SHUFFLE(X)))1037;  --> SHUFFLE(HOP(LOSUBVECTOR(X),HISUBVECTOR(X))).1038;1039 1040define <4 x float> @hadd_4f32_v8f32_shuffle(<8 x float> %a0) {1041; SSE-LABEL: hadd_4f32_v8f32_shuffle:1042; SSE:       # %bb.0:1043; SSE-NEXT:    haddps %xmm1, %xmm01044; SSE-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1045; SSE-NEXT:    retq1046;1047; AVX-LABEL: hadd_4f32_v8f32_shuffle:1048; AVX:       # %bb.0:1049; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm11050; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm01051; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1052; AVX-NEXT:    vzeroupper1053; AVX-NEXT:    retq1054  %shuf256 = shufflevector <8 x float> %a0, <8 x float> undef, <8 x i32> <i32 2, i32 3, i32 2, i32 3, i32 6, i32 7, i32 6, i32 7>1055  %lo = shufflevector <8 x float> %shuf256, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1056  %hi = shufflevector <8 x float> %shuf256, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1057  %hadd0 = shufflevector <4 x float> %lo, <4 x float> %hi, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1058  %hadd1 = shufflevector <4 x float> %lo, <4 x float> %hi, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1059  %hadd = fadd <4 x float> %hadd0, %hadd11060  ret <4 x float> %hadd1061}1062 1063define <4 x float> @hsub_4f32_v8f32_shuffle(<8 x float> %a0) {1064; SSE-LABEL: hsub_4f32_v8f32_shuffle:1065; SSE:       # %bb.0:1066; SSE-NEXT:    haddps %xmm1, %xmm01067; SSE-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1068; SSE-NEXT:    retq1069;1070; AVX-LABEL: hsub_4f32_v8f32_shuffle:1071; AVX:       # %bb.0:1072; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm11073; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm01074; AVX-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1075; AVX-NEXT:    vzeroupper1076; AVX-NEXT:    retq1077  %shuf256 = shufflevector <8 x float> %a0, <8 x float> undef, <8 x i32> <i32 2, i32 3, i32 2, i32 3, i32 6, i32 7, i32 6, i32 7>1078  %lo = shufflevector <8 x float> %shuf256, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1079  %hi = shufflevector <8 x float> %shuf256, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1080  %hsub0 = shufflevector <4 x float> %lo, <4 x float> %hi, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1081  %hsub1 = shufflevector <4 x float> %lo, <4 x float> %hi, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1082  %hsub = fadd <4 x float> %hsub0, %hsub11083  ret <4 x float> %hsub1084}1085 1086define <4 x i32> @hadd_4i32_v8i32_shuffle(<8 x i32> %a0) {1087; SSE3-LABEL: hadd_4i32_v8i32_shuffle:1088; SSE3:       # %bb.0:1089; SSE3-NEXT:    movaps %xmm0, %xmm21090; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,2],xmm1[2,2]1091; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3]1092; SSE3-NEXT:    paddd %xmm2, %xmm01093; SSE3-NEXT:    retq1094;1095; SSSE3-LABEL: hadd_4i32_v8i32_shuffle:1096; SSSE3:       # %bb.0:1097; SSSE3-NEXT:    phaddd %xmm1, %xmm01098; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1099; SSSE3-NEXT:    retq1100;1101; AVX1-LABEL: hadd_4i32_v8i32_shuffle:1102; AVX1:       # %bb.0:1103; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11104; AVX1-NEXT:    vphaddd %xmm1, %xmm0, %xmm01105; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1106; AVX1-NEXT:    vzeroupper1107; AVX1-NEXT:    retq1108;1109; AVX2-LABEL: hadd_4i32_v8i32_shuffle:1110; AVX2:       # %bb.0:1111; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11112; AVX2-NEXT:    vphaddd %xmm1, %xmm0, %xmm01113; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1114; AVX2-NEXT:    vzeroupper1115; AVX2-NEXT:    retq1116  %shuf256 = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 2, i32 3, i32 6, i32 7, i32 6, i32 7>1117  %lo = shufflevector <8 x i32> %shuf256, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1118  %hi = shufflevector <8 x i32> %shuf256, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1119  %hadd0 = shufflevector <4 x i32> %lo, <4 x i32> %hi, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1120  %hadd1 = shufflevector <4 x i32> %lo, <4 x i32> %hi, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1121  %hadd = add <4 x i32> %hadd0, %hadd11122  ret <4 x i32> %hadd1123}1124 1125define <4 x i32> @hsub_4i32_v8i32_shuffle(<8 x i32> %a0) {1126; SSE3-LABEL: hsub_4i32_v8i32_shuffle:1127; SSE3:       # %bb.0:1128; SSE3-NEXT:    movaps %xmm0, %xmm21129; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,2],xmm1[2,2]1130; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm1[3,3]1131; SSE3-NEXT:    paddd %xmm2, %xmm01132; SSE3-NEXT:    retq1133;1134; SSSE3-LABEL: hsub_4i32_v8i32_shuffle:1135; SSSE3:       # %bb.0:1136; SSSE3-NEXT:    phaddd %xmm1, %xmm01137; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1138; SSSE3-NEXT:    retq1139;1140; AVX1-LABEL: hsub_4i32_v8i32_shuffle:1141; AVX1:       # %bb.0:1142; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11143; AVX1-NEXT:    vphaddd %xmm1, %xmm0, %xmm01144; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1145; AVX1-NEXT:    vzeroupper1146; AVX1-NEXT:    retq1147;1148; AVX2-LABEL: hsub_4i32_v8i32_shuffle:1149; AVX2:       # %bb.0:1150; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11151; AVX2-NEXT:    vphaddd %xmm1, %xmm0, %xmm01152; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]1153; AVX2-NEXT:    vzeroupper1154; AVX2-NEXT:    retq1155  %shuf256 = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 2, i32 3, i32 6, i32 7, i32 6, i32 7>1156  %lo = shufflevector <8 x i32> %shuf256, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1157  %hi = shufflevector <8 x i32> %shuf256, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1158  %hsub0 = shufflevector <4 x i32> %lo, <4 x i32> %hi, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1159  %hsub1 = shufflevector <4 x i32> %lo, <4 x i32> %hi, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1160  %hsub = add <4 x i32> %hsub0, %hsub11161  ret <4 x i32> %hsub1162}1163 1164;1165; fold HOP(SHUFFLE(X,Y),SHUFFLE(X,Y)) --> SHUFFLE(HOP(X,Y)).1166;1167 1168define <4 x double> @hadd_4f64_v4f64_shuffle(<4 x double> %a0, <4 x double> %a1) {1169; SSE-LABEL: hadd_4f64_v4f64_shuffle:1170; SSE:       # %bb.0:1171; SSE-NEXT:    haddpd %xmm1, %xmm01172; SSE-NEXT:    haddpd %xmm3, %xmm21173; SSE-NEXT:    movapd %xmm2, %xmm11174; SSE-NEXT:    retq1175;1176; AVX1-LABEL: hadd_4f64_v4f64_shuffle:1177; AVX1:       # %bb.0:1178; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm21179; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]1180; AVX1-NEXT:    vhaddpd %ymm0, %ymm2, %ymm01181; AVX1-NEXT:    retq1182;1183; AVX2-LABEL: hadd_4f64_v4f64_shuffle:1184; AVX2:       # %bb.0:1185; AVX2-NEXT:    vhaddpd %ymm1, %ymm0, %ymm01186; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1187; AVX2-NEXT:    retq1188  %shuf0 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>1189  %shuf1 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> <i32 2, i32 3, i32 6, i32 7>1190  %hadd0 = shufflevector <4 x double> %shuf0, <4 x double> %shuf1, <4 x i32> <i32 0, i32 4, i32 2, i32 6>1191  %hadd1 = shufflevector <4 x double> %shuf0, <4 x double> %shuf1, <4 x i32> <i32 1, i32 5, i32 3, i32 7>1192  %hadd = fadd <4 x double> %hadd0, %hadd11193  ret <4 x double> %hadd1194}1195 1196define <4 x double> @hsub_4f64_v4f64_shuffle(<4 x double> %a0, <4 x double> %a1) {1197; SSE-LABEL: hsub_4f64_v4f64_shuffle:1198; SSE:       # %bb.0:1199; SSE-NEXT:    hsubpd %xmm1, %xmm01200; SSE-NEXT:    hsubpd %xmm3, %xmm21201; SSE-NEXT:    movapd %xmm2, %xmm11202; SSE-NEXT:    retq1203;1204; AVX1-LABEL: hsub_4f64_v4f64_shuffle:1205; AVX1:       # %bb.0:1206; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm21207; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]1208; AVX1-NEXT:    vhsubpd %ymm0, %ymm2, %ymm01209; AVX1-NEXT:    retq1210;1211; AVX2-LABEL: hsub_4f64_v4f64_shuffle:1212; AVX2:       # %bb.0:1213; AVX2-NEXT:    vhsubpd %ymm1, %ymm0, %ymm01214; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1215; AVX2-NEXT:    retq1216  %shuf0 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>1217  %shuf1 = shufflevector <4 x double> %a0, <4 x double> %a1, <4 x i32> <i32 2, i32 3, i32 6, i32 7>1218  %hadd0 = shufflevector <4 x double> %shuf0, <4 x double> %shuf1, <4 x i32> <i32 0, i32 4, i32 2, i32 6>1219  %hadd1 = shufflevector <4 x double> %shuf0, <4 x double> %shuf1, <4 x i32> <i32 1, i32 5, i32 3, i32 7>1220  %hadd = fsub <4 x double> %hadd0, %hadd11221  ret <4 x double> %hadd1222}1223 1224define <8 x float> @hadd_8f32_v8f32_shuffle(<8 x float> %a0, <8 x float> %a1) {1225; SSE-LABEL: hadd_8f32_v8f32_shuffle:1226; SSE:       # %bb.0:1227; SSE-NEXT:    haddps %xmm1, %xmm01228; SSE-NEXT:    haddps %xmm3, %xmm21229; SSE-NEXT:    movaps %xmm2, %xmm11230; SSE-NEXT:    retq1231;1232; AVX1-LABEL: hadd_8f32_v8f32_shuffle:1233; AVX1:       # %bb.0:1234; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm21235; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]1236; AVX1-NEXT:    vhaddps %ymm0, %ymm2, %ymm01237; AVX1-NEXT:    retq1238;1239; AVX2-LABEL: hadd_8f32_v8f32_shuffle:1240; AVX2:       # %bb.0:1241; AVX2-NEXT:    vhaddps %ymm1, %ymm0, %ymm01242; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1243; AVX2-NEXT:    retq1244  %shuf0 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1245  %shuf1 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>1246  %hadd0 = shufflevector <8 x float> %shuf0, <8 x float> %shuf1, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>1247  %hadd1 = shufflevector <8 x float> %shuf0, <8 x float> %shuf1, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>1248  %hadd = fadd <8 x float> %hadd0, %hadd11249  ret <8 x float> %hadd1250}1251 1252define <8 x float> @hsub_8f32_v8f32_shuffle(<8 x float> %a0, <8 x float> %a1) {1253; SSE-LABEL: hsub_8f32_v8f32_shuffle:1254; SSE:       # %bb.0:1255; SSE-NEXT:    haddps %xmm1, %xmm01256; SSE-NEXT:    haddps %xmm3, %xmm21257; SSE-NEXT:    movaps %xmm2, %xmm11258; SSE-NEXT:    retq1259;1260; AVX1-LABEL: hsub_8f32_v8f32_shuffle:1261; AVX1:       # %bb.0:1262; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm21263; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3],ymm1[2,3]1264; AVX1-NEXT:    vhaddps %ymm0, %ymm2, %ymm01265; AVX1-NEXT:    retq1266;1267; AVX2-LABEL: hsub_8f32_v8f32_shuffle:1268; AVX2:       # %bb.0:1269; AVX2-NEXT:    vhaddps %ymm1, %ymm0, %ymm01270; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]1271; AVX2-NEXT:    retq1272  %shuf0 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1273  %shuf1 = shufflevector <8 x float> %a0, <8 x float> %a1, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>1274  %hsub0 = shufflevector <8 x float> %shuf0, <8 x float> %shuf1, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>1275  %hsub1 = shufflevector <8 x float> %shuf0, <8 x float> %shuf1, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>1276  %hsub = fadd <8 x float> %hsub0, %hsub11277  ret <8 x float> %hsub1278}1279 1280define <8 x i32> @hadd_8i32_v8i32_shuffle(<8 x i32> %a0, <8 x i32> %a1) {1281; SSE3-LABEL: hadd_8i32_v8i32_shuffle:1282; SSE3:       # %bb.0:1283; SSE3-NEXT:    movaps %xmm2, %xmm41284; SSE3-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm3[0,2]1285; SSE3-NEXT:    movaps %xmm0, %xmm51286; SSE3-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,2],xmm1[0,2]1287; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]1288; SSE3-NEXT:    paddd %xmm2, %xmm41289; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]1290; SSE3-NEXT:    paddd %xmm5, %xmm01291; SSE3-NEXT:    movdqa %xmm4, %xmm11292; SSE3-NEXT:    retq1293;1294; SSSE3-LABEL: hadd_8i32_v8i32_shuffle:1295; SSSE3:       # %bb.0:1296; SSSE3-NEXT:    phaddd %xmm1, %xmm01297; SSSE3-NEXT:    phaddd %xmm3, %xmm21298; SSSE3-NEXT:    movdqa %xmm2, %xmm11299; SSSE3-NEXT:    retq1300;1301; AVX1-LABEL: hadd_8i32_v8i32_shuffle:1302; AVX1:       # %bb.0:1303; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21304; AVX1-NEXT:    vphaddd %xmm2, %xmm1, %xmm11305; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21306; AVX1-NEXT:    vphaddd %xmm2, %xmm0, %xmm01307; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01308; AVX1-NEXT:    retq1309;1310; AVX2-LABEL: hadd_8i32_v8i32_shuffle:1311; AVX2:       # %bb.0:1312; AVX2-NEXT:    vphaddd %ymm1, %ymm0, %ymm01313; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1314; AVX2-NEXT:    retq1315  %shuf0 = shufflevector <8 x i32> %a0, <8 x i32> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1316  %shuf1 = shufflevector <8 x i32> %a0, <8 x i32> %a1, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>1317  %hadd0 = shufflevector <8 x i32> %shuf0, <8 x i32> %shuf1, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>1318  %hadd1 = shufflevector <8 x i32> %shuf0, <8 x i32> %shuf1, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>1319  %hadd = add <8 x i32> %hadd0, %hadd11320  ret <8 x i32> %hadd1321}1322 1323define <8 x i32> @hsub_8i32_v8i32_shuffle(<8 x i32> %a0, <8 x i32> %a1) {1324; SSE3-LABEL: hsub_8i32_v8i32_shuffle:1325; SSE3:       # %bb.0:1326; SSE3-NEXT:    movaps %xmm2, %xmm41327; SSE3-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm3[0,2]1328; SSE3-NEXT:    movaps %xmm0, %xmm51329; SSE3-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,2],xmm1[0,2]1330; SSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]1331; SSE3-NEXT:    psubd %xmm2, %xmm41332; SSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]1333; SSE3-NEXT:    psubd %xmm0, %xmm51334; SSE3-NEXT:    movdqa %xmm5, %xmm01335; SSE3-NEXT:    movdqa %xmm4, %xmm11336; SSE3-NEXT:    retq1337;1338; SSSE3-LABEL: hsub_8i32_v8i32_shuffle:1339; SSSE3:       # %bb.0:1340; SSSE3-NEXT:    phsubd %xmm1, %xmm01341; SSSE3-NEXT:    phsubd %xmm3, %xmm21342; SSSE3-NEXT:    movdqa %xmm2, %xmm11343; SSSE3-NEXT:    retq1344;1345; AVX1-LABEL: hsub_8i32_v8i32_shuffle:1346; AVX1:       # %bb.0:1347; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21348; AVX1-NEXT:    vphsubd %xmm2, %xmm1, %xmm11349; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21350; AVX1-NEXT:    vphsubd %xmm2, %xmm0, %xmm01351; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01352; AVX1-NEXT:    retq1353;1354; AVX2-LABEL: hsub_8i32_v8i32_shuffle:1355; AVX2:       # %bb.0:1356; AVX2-NEXT:    vphsubd %ymm1, %ymm0, %ymm01357; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1358; AVX2-NEXT:    retq1359  %shuf0 = shufflevector <8 x i32> %a0, <8 x i32> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1360  %shuf1 = shufflevector <8 x i32> %a0, <8 x i32> %a1, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>1361  %hadd0 = shufflevector <8 x i32> %shuf0, <8 x i32> %shuf1, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>1362  %hadd1 = shufflevector <8 x i32> %shuf0, <8 x i32> %shuf1, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>1363  %hadd = sub <8 x i32> %hadd0, %hadd11364  ret <8 x i32> %hadd1365}1366 1367define <16 x i16> @hadd_16i16_16i16_shuffle(<16 x i16> %a0, <16 x i16> %a1) {1368; SSE3-LABEL: hadd_16i16_16i16_shuffle:1369; SSE3:       # %bb.0:1370; SSE3-NEXT:    movdqa %xmm3, %xmm51371; SSE3-NEXT:    pslld $16, %xmm51372; SSE3-NEXT:    psrad $16, %xmm51373; SSE3-NEXT:    movdqa %xmm2, %xmm41374; SSE3-NEXT:    pslld $16, %xmm41375; SSE3-NEXT:    psrad $16, %xmm41376; SSE3-NEXT:    packssdw %xmm5, %xmm41377; SSE3-NEXT:    movdqa %xmm1, %xmm51378; SSE3-NEXT:    pslld $16, %xmm51379; SSE3-NEXT:    psrad $16, %xmm51380; SSE3-NEXT:    movdqa %xmm0, %xmm61381; SSE3-NEXT:    pslld $16, %xmm61382; SSE3-NEXT:    psrad $16, %xmm61383; SSE3-NEXT:    packssdw %xmm5, %xmm61384; SSE3-NEXT:    psrad $16, %xmm31385; SSE3-NEXT:    psrad $16, %xmm21386; SSE3-NEXT:    packssdw %xmm3, %xmm21387; SSE3-NEXT:    paddw %xmm2, %xmm41388; SSE3-NEXT:    psrad $16, %xmm11389; SSE3-NEXT:    psrad $16, %xmm01390; SSE3-NEXT:    packssdw %xmm1, %xmm01391; SSE3-NEXT:    paddw %xmm6, %xmm01392; SSE3-NEXT:    movdqa %xmm4, %xmm11393; SSE3-NEXT:    retq1394;1395; SSSE3-LABEL: hadd_16i16_16i16_shuffle:1396; SSSE3:       # %bb.0:1397; SSSE3-NEXT:    phaddw %xmm1, %xmm01398; SSSE3-NEXT:    phaddw %xmm3, %xmm21399; SSSE3-NEXT:    movdqa %xmm2, %xmm11400; SSSE3-NEXT:    retq1401;1402; AVX1-LABEL: hadd_16i16_16i16_shuffle:1403; AVX1:       # %bb.0:1404; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm21405; AVX1-NEXT:    vphaddw %xmm2, %xmm1, %xmm11406; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21407; AVX1-NEXT:    vphaddw %xmm2, %xmm0, %xmm01408; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01409; AVX1-NEXT:    retq1410;1411; AVX2-LABEL: hadd_16i16_16i16_shuffle:1412; AVX2:       # %bb.0:1413; AVX2-NEXT:    vphaddw %ymm1, %ymm0, %ymm01414; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]1415; AVX2-NEXT:    retq1416  %shuf0 = shufflevector <16 x i16> %a0, <16 x i16> %a1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>1417  %shuf1 = shufflevector <16 x i16> %a0, <16 x i16> %a1, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>1418  %hadd0 = shufflevector <16 x i16> %shuf0, <16 x i16> %shuf1, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 16, i32 18, i32 20, i32 22, i32 8, i32 10, i32 12, i32 14, i32 24, i32 26, i32 28, i32 30>1419  %hadd1 = shufflevector <16 x i16> %shuf0, <16 x i16> %shuf1, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 17, i32 19, i32 21, i32 23, i32 9, i32 11, i32 13, i32 15, i32 25, i32 27, i32 29, i32 31>1420  %hadd = add <16 x i16> %hadd0, %hadd11421  ret <16 x i16> %hadd1422}1423