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