697 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSSE3,SSSE3-SLOW3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3,fast-hops | FileCheck %s --check-prefixes=SSSE3,SSSE3-FAST4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX-SLOW,AVX1-SLOW5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx,fast-hops | FileCheck %s --check-prefixes=AVX,AVX-FAST,AVX1-FAST6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX-SLOW,AVX2-SLOW7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2,fast-hops | FileCheck %s --check-prefixes=AVX,AVX-FAST,AVX2-FAST8; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2-SHUF9; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2-SHUF10 11define <8 x i16> @phaddw1(<8 x i16> %x, <8 x i16> %y) {12; SSSE3-LABEL: phaddw1:13; SSSE3: # %bb.0:14; SSSE3-NEXT: phaddw %xmm1, %xmm015; SSSE3-NEXT: retq16;17; AVX-LABEL: phaddw1:18; AVX: # %bb.0:19; AVX-NEXT: vphaddw %xmm1, %xmm0, %xmm020; AVX-NEXT: retq21 %a = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>22 %b = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>23 %r = add <8 x i16> %a, %b24 ret <8 x i16> %r25}26 27define <8 x i16> @phaddw2(<8 x i16> %x, <8 x i16> %y) {28; SSSE3-LABEL: phaddw2:29; SSSE3: # %bb.0:30; SSSE3-NEXT: phaddw %xmm1, %xmm031; SSSE3-NEXT: retq32;33; AVX-LABEL: phaddw2:34; AVX: # %bb.0:35; AVX-NEXT: vphaddw %xmm1, %xmm0, %xmm036; AVX-NEXT: retq37 %a = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 1, i32 2, i32 5, i32 6, i32 9, i32 10, i32 13, i32 14>38 %b = shufflevector <8 x i16> %y, <8 x i16> %x, <8 x i32> <i32 8, i32 11, i32 12, i32 15, i32 0, i32 3, i32 4, i32 7>39 %r = add <8 x i16> %a, %b40 ret <8 x i16> %r41}42 43define <4 x i32> @phaddd1(<4 x i32> %x, <4 x i32> %y) {44; SSSE3-LABEL: phaddd1:45; SSSE3: # %bb.0:46; SSSE3-NEXT: phaddd %xmm1, %xmm047; SSSE3-NEXT: retq48;49; AVX-LABEL: phaddd1:50; AVX: # %bb.0:51; AVX-NEXT: vphaddd %xmm1, %xmm0, %xmm052; AVX-NEXT: retq53 %a = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 0, i32 2, i32 4, i32 6>54 %b = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 1, i32 3, i32 5, i32 7>55 %r = add <4 x i32> %a, %b56 ret <4 x i32> %r57}58 59define <4 x i32> @phaddd2(<4 x i32> %x, <4 x i32> %y) {60; SSSE3-LABEL: phaddd2:61; SSSE3: # %bb.0:62; SSSE3-NEXT: phaddd %xmm1, %xmm063; SSSE3-NEXT: retq64;65; AVX-LABEL: phaddd2:66; AVX: # %bb.0:67; AVX-NEXT: vphaddd %xmm1, %xmm0, %xmm068; AVX-NEXT: retq69 %a = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 1, i32 2, i32 5, i32 6>70 %b = shufflevector <4 x i32> %y, <4 x i32> %x, <4 x i32> <i32 4, i32 7, i32 0, i32 3>71 %r = add <4 x i32> %a, %b72 ret <4 x i32> %r73}74 75define <4 x i32> @phaddd3(<4 x i32> %x) {76; SSSE3-LABEL: phaddd3:77; SSSE3: # %bb.0:78; SSSE3-NEXT: phaddd %xmm0, %xmm079; SSSE3-NEXT: retq80;81; AVX-LABEL: phaddd3:82; AVX: # %bb.0:83; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm084; AVX-NEXT: retq85 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>86 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>87 %r = add <4 x i32> %a, %b88 ret <4 x i32> %r89}90 91define <4 x i32> @phaddd4(<4 x i32> %x) {92; SSSE3-LABEL: phaddd4:93; SSSE3: # %bb.0:94; SSSE3-NEXT: phaddd %xmm0, %xmm095; SSSE3-NEXT: retq96;97; AVX-LABEL: phaddd4:98; AVX: # %bb.0:99; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0100; AVX-NEXT: retq101 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>102 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>103 %r = add <4 x i32> %a, %b104 ret <4 x i32> %r105}106 107define <4 x i32> @phaddd5(<4 x i32> %x) {108; SSSE3-LABEL: phaddd5:109; SSSE3: # %bb.0:110; SSSE3-NEXT: phaddd %xmm0, %xmm0111; SSSE3-NEXT: retq112;113; AVX-LABEL: phaddd5:114; AVX: # %bb.0:115; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0116; AVX-NEXT: retq117 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 undef, i32 undef>118 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 undef, i32 undef>119 %r = add <4 x i32> %a, %b120 ret <4 x i32> %r121}122 123define <4 x i32> @phaddd6(<4 x i32> %x) {124; SSSE3-SLOW-LABEL: phaddd6:125; SSSE3-SLOW: # %bb.0:126; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]127; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0128; SSSE3-SLOW-NEXT: retq129;130; SSSE3-FAST-LABEL: phaddd6:131; SSSE3-FAST: # %bb.0:132; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0133; SSSE3-FAST-NEXT: retq134;135; AVX-SLOW-LABEL: phaddd6:136; AVX-SLOW: # %bb.0:137; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]138; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0139; AVX-SLOW-NEXT: retq140;141; AVX-FAST-LABEL: phaddd6:142; AVX-FAST: # %bb.0:143; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0144; AVX-FAST-NEXT: retq145;146; AVX2-SHUF-LABEL: phaddd6:147; AVX2-SHUF: # %bb.0:148; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]149; AVX2-SHUF-NEXT: vpaddd %xmm1, %xmm0, %xmm0150; AVX2-SHUF-NEXT: retq151 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>152 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>153 %r = add <4 x i32> %a, %b154 ret <4 x i32> %r155}156 157define <4 x i32> @phaddd7(<4 x i32> %x) {158; SSSE3-LABEL: phaddd7:159; SSSE3: # %bb.0:160; SSSE3-NEXT: phaddd %xmm0, %xmm0161; SSSE3-NEXT: retq162;163; AVX-LABEL: phaddd7:164; AVX: # %bb.0:165; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0166; AVX-NEXT: retq167 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef>168 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 undef, i32 undef>169 %r = add <4 x i32> %a, %b170 ret <4 x i32> %r171}172 173define <8 x i16> @phsubw1(<8 x i16> %x, <8 x i16> %y) {174; SSSE3-LABEL: phsubw1:175; SSSE3: # %bb.0:176; SSSE3-NEXT: phsubw %xmm1, %xmm0177; SSSE3-NEXT: retq178;179; AVX-LABEL: phsubw1:180; AVX: # %bb.0:181; AVX-NEXT: vphsubw %xmm1, %xmm0, %xmm0182; AVX-NEXT: retq183 %a = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>184 %b = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>185 %r = sub <8 x i16> %a, %b186 ret <8 x i16> %r187}188 189define <4 x i32> @phsubd1(<4 x i32> %x, <4 x i32> %y) {190; SSSE3-LABEL: phsubd1:191; SSSE3: # %bb.0:192; SSSE3-NEXT: phsubd %xmm1, %xmm0193; SSSE3-NEXT: retq194;195; AVX-LABEL: phsubd1:196; AVX: # %bb.0:197; AVX-NEXT: vphsubd %xmm1, %xmm0, %xmm0198; AVX-NEXT: retq199 %a = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 0, i32 2, i32 4, i32 6>200 %b = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 1, i32 3, i32 5, i32 7>201 %r = sub <4 x i32> %a, %b202 ret <4 x i32> %r203}204 205define <4 x i32> @phsubd2(<4 x i32> %x) {206; SSSE3-LABEL: phsubd2:207; SSSE3: # %bb.0:208; SSSE3-NEXT: phsubd %xmm0, %xmm0209; SSSE3-NEXT: retq210;211; AVX-LABEL: phsubd2:212; AVX: # %bb.0:213; AVX-NEXT: vphsubd %xmm0, %xmm0, %xmm0214; AVX-NEXT: retq215 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6>216 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7>217 %r = sub <4 x i32> %a, %b218 ret <4 x i32> %r219}220 221define <4 x i32> @phsubd3(<4 x i32> %x) {222; SSSE3-LABEL: phsubd3:223; SSSE3: # %bb.0:224; SSSE3-NEXT: phsubd %xmm0, %xmm0225; SSSE3-NEXT: retq226;227; AVX-LABEL: phsubd3:228; AVX: # %bb.0:229; AVX-NEXT: vphsubd %xmm0, %xmm0, %xmm0230; AVX-NEXT: retq231 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef>232 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef>233 %r = sub <4 x i32> %a, %b234 ret <4 x i32> %r235}236 237define <4 x i32> @phsubd4(<4 x i32> %x) {238; SSSE3-SLOW-LABEL: phsubd4:239; SSSE3-SLOW: # %bb.0:240; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]241; SSSE3-SLOW-NEXT: psubd %xmm1, %xmm0242; SSSE3-SLOW-NEXT: retq243;244; SSSE3-FAST-LABEL: phsubd4:245; SSSE3-FAST: # %bb.0:246; SSSE3-FAST-NEXT: phsubd %xmm0, %xmm0247; SSSE3-FAST-NEXT: retq248;249; AVX-SLOW-LABEL: phsubd4:250; AVX-SLOW: # %bb.0:251; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]252; AVX-SLOW-NEXT: vpsubd %xmm1, %xmm0, %xmm0253; AVX-SLOW-NEXT: retq254;255; AVX-FAST-LABEL: phsubd4:256; AVX-FAST: # %bb.0:257; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0258; AVX-FAST-NEXT: retq259;260; AVX2-SHUF-LABEL: phsubd4:261; AVX2-SHUF: # %bb.0:262; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]263; AVX2-SHUF-NEXT: vpsubd %xmm1, %xmm0, %xmm0264; AVX2-SHUF-NEXT: retq265 %a = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>266 %b = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>267 %r = sub <4 x i32> %a, %b268 ret <4 x i32> %r269}270 271define <8 x i16> @phsubw1_reverse(<8 x i16> %x, <8 x i16> %y) {272; SSSE3-LABEL: phsubw1_reverse:273; SSSE3: # %bb.0:274; SSSE3-NEXT: movdqa %xmm1, %xmm3275; SSSE3-NEXT: psrad $16, %xmm3276; SSSE3-NEXT: movdqa %xmm0, %xmm2277; SSSE3-NEXT: psrad $16, %xmm2278; SSSE3-NEXT: packssdw %xmm3, %xmm2279; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]280; SSSE3-NEXT: pshufb %xmm3, %xmm1281; SSSE3-NEXT: pshufb %xmm3, %xmm0282; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]283; SSSE3-NEXT: psubw %xmm0, %xmm2284; SSSE3-NEXT: movdqa %xmm2, %xmm0285; SSSE3-NEXT: retq286;287; AVX-LABEL: phsubw1_reverse:288; AVX: # %bb.0:289; AVX-NEXT: vpsrld $16, %xmm1, %xmm2290; AVX-NEXT: vpsrld $16, %xmm0, %xmm3291; AVX-NEXT: vpackusdw %xmm2, %xmm3, %xmm2292; AVX-NEXT: vpxor %xmm3, %xmm3, %xmm3293; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3],xmm1[4],xmm3[5],xmm1[6],xmm3[7]294; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3],xmm0[4],xmm3[5],xmm0[6],xmm3[7]295; AVX-NEXT: vpackusdw %xmm1, %xmm0, %xmm0296; AVX-NEXT: vpsubw %xmm0, %xmm2, %xmm0297; AVX-NEXT: retq298 %a = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>299 %b = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>300 %r = sub <8 x i16> %a, %b301 ret <8 x i16> %r302}303 304define <4 x i32> @phsubd1_reverse(<4 x i32> %x, <4 x i32> %y) {305; SSSE3-LABEL: phsubd1_reverse:306; SSSE3: # %bb.0:307; SSSE3-NEXT: movaps %xmm0, %xmm2308; SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]309; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]310; SSSE3-NEXT: psubd %xmm0, %xmm2311; SSSE3-NEXT: movdqa %xmm2, %xmm0312; SSSE3-NEXT: retq313;314; AVX-LABEL: phsubd1_reverse:315; AVX: # %bb.0:316; AVX-NEXT: vshufps {{.*#+}} xmm2 = xmm0[1,3],xmm1[1,3]317; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]318; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0319; AVX-NEXT: retq320 %a = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 1, i32 3, i32 5, i32 7>321 %b = shufflevector <4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 0, i32 2, i32 4, i32 6>322 %r = sub <4 x i32> %a, %b323 ret <4 x i32> %r324}325 326define <4 x i32> @phaddd_single_source1(<4 x i32> %x) {327; SSSE3-LABEL: phaddd_single_source1:328; SSSE3: # %bb.0:329; SSSE3-NEXT: phaddd %xmm0, %xmm0330; SSSE3-NEXT: retq331;332; AVX-LABEL: phaddd_single_source1:333; AVX: # %bb.0:334; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0335; AVX-NEXT: retq336 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>337 %r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>338 %add = add <4 x i32> %l, %r339 ret <4 x i32> %add340}341 342define <4 x i32> @phaddd_single_source2(<4 x i32> %x) {343; SSSE3-SLOW-LABEL: phaddd_single_source2:344; SSSE3-SLOW: # %bb.0:345; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]346; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]347; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0348; SSSE3-SLOW-NEXT: retq349;350; SSSE3-FAST-LABEL: phaddd_single_source2:351; SSSE3-FAST: # %bb.0:352; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0353; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]354; SSSE3-FAST-NEXT: retq355;356; AVX-SLOW-LABEL: phaddd_single_source2:357; AVX-SLOW: # %bb.0:358; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]359; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]360; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0361; AVX-SLOW-NEXT: retq362;363; AVX-FAST-LABEL: phaddd_single_source2:364; AVX-FAST: # %bb.0:365; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0366; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]367; AVX-FAST-NEXT: retq368;369; AVX2-SHUF-LABEL: phaddd_single_source2:370; AVX2-SHUF: # %bb.0:371; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]372; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]373; AVX2-SHUF-NEXT: vpaddd %xmm1, %xmm0, %xmm0374; AVX2-SHUF-NEXT: retq375 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 2>376 %r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 3>377 %add = add <4 x i32> %l, %r378 %shuffle2 = shufflevector <4 x i32> %add, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 undef, i32 undef>379 ret <4 x i32> %shuffle2380}381 382define <4 x i32> @phaddd_single_source3(<4 x i32> %x) {383; SSSE3-LABEL: phaddd_single_source3:384; SSSE3: # %bb.0:385; SSSE3-NEXT: phaddd %xmm0, %xmm0386; SSSE3-NEXT: retq387;388; AVX-LABEL: phaddd_single_source3:389; AVX: # %bb.0:390; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0391; AVX-NEXT: retq392 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>393 %r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>394 %add = add <4 x i32> %l, %r395 ret <4 x i32> %add396}397 398define <4 x i32> @phaddd_single_source4(<4 x i32> %x) {399; SSSE3-SLOW-LABEL: phaddd_single_source4:400; SSSE3-SLOW: # %bb.0:401; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]402; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0403; SSSE3-SLOW-NEXT: retq404;405; SSSE3-FAST-LABEL: phaddd_single_source4:406; SSSE3-FAST: # %bb.0:407; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0408; SSSE3-FAST-NEXT: retq409;410; AVX-SLOW-LABEL: phaddd_single_source4:411; AVX-SLOW: # %bb.0:412; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]413; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0414; AVX-SLOW-NEXT: retq415;416; AVX-FAST-LABEL: phaddd_single_source4:417; AVX-FAST: # %bb.0:418; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0419; AVX-FAST-NEXT: retq420;421; AVX2-SHUF-LABEL: phaddd_single_source4:422; AVX2-SHUF: # %bb.0:423; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]424; AVX2-SHUF-NEXT: vpaddd %xmm0, %xmm1, %xmm0425; AVX2-SHUF-NEXT: retq426 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 undef, i32 2>427 %add = add <4 x i32> %l, %x428 ret <4 x i32> %add429}430 431define <4 x i32> @phaddd_single_source5(<4 x i32> %x) {432; SSSE3-SLOW-LABEL: phaddd_single_source5:433; SSSE3-SLOW: # %bb.0:434; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]435; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]436; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0437; SSSE3-SLOW-NEXT: retq438;439; SSSE3-FAST-LABEL: phaddd_single_source5:440; SSSE3-FAST: # %bb.0:441; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0442; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]443; SSSE3-FAST-NEXT: retq444;445; AVX-SLOW-LABEL: phaddd_single_source5:446; AVX-SLOW: # %bb.0:447; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]448; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]449; AVX-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0450; AVX-SLOW-NEXT: retq451;452; AVX-FAST-LABEL: phaddd_single_source5:453; AVX-FAST: # %bb.0:454; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0455; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]456; AVX-FAST-NEXT: retq457;458; AVX2-SHUF-LABEL: phaddd_single_source5:459; AVX2-SHUF: # %bb.0:460; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,2,2,2]461; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]462; AVX2-SHUF-NEXT: vpaddd %xmm0, %xmm1, %xmm0463; AVX2-SHUF-NEXT: retq464 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 undef, i32 2>465 %add = add <4 x i32> %l, %x466 %shuffle2 = shufflevector <4 x i32> %add, <4 x i32> undef, <4 x i32> <i32 3, i32 undef, i32 undef, i32 undef>467 ret <4 x i32> %shuffle2468}469 470define <4 x i32> @phaddd_single_source6(<4 x i32> %x) {471; SSSE3-LABEL: phaddd_single_source6:472; SSSE3: # %bb.0:473; SSSE3-NEXT: phaddd %xmm0, %xmm0474; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]475; SSSE3-NEXT: retq476;477; AVX-LABEL: phaddd_single_source6:478; AVX: # %bb.0:479; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm0480; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]481; AVX-NEXT: retq482 %l = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 undef>483 %r = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 undef>484 %add = add <4 x i32> %l, %r485 %shuffle2 = shufflevector <4 x i32> %add, <4 x i32> undef, <4 x i32> <i32 undef, i32 2, i32 undef, i32 undef>486 ret <4 x i32> %shuffle2487}488 489define <8 x i16> @phaddw_single_source1(<8 x i16> %x) {490; SSSE3-LABEL: phaddw_single_source1:491; SSSE3: # %bb.0:492; SSSE3-NEXT: phaddw %xmm0, %xmm0493; SSSE3-NEXT: retq494;495; AVX-LABEL: phaddw_single_source1:496; AVX: # %bb.0:497; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0498; AVX-NEXT: retq499 %l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 4, i32 6>500 %r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 5, i32 7>501 %add = add <8 x i16> %l, %r502 ret <8 x i16> %add503}504 505define <8 x i16> @phaddw_single_source2(<8 x i16> %x) {506; SSSE3-SLOW-LABEL: phaddw_single_source2:507; SSSE3-SLOW: # %bb.0:508; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[3,1,2,3,4,5,6,7]509; SSSE3-SLOW-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]510; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0511; SSSE3-SLOW-NEXT: retq512;513; SSSE3-FAST-LABEL: phaddw_single_source2:514; SSSE3-FAST: # %bb.0:515; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0516; SSSE3-FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[1,0,2,3,4,5,6,7]517; SSSE3-FAST-NEXT: retq518;519; AVX-SLOW-LABEL: phaddw_single_source2:520; AVX-SLOW: # %bb.0:521; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[3,1,2,3,4,5,6,7]522; AVX-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]523; AVX-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0524; AVX-SLOW-NEXT: retq525;526; AVX-FAST-LABEL: phaddw_single_source2:527; AVX-FAST: # %bb.0:528; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0529; AVX-FAST-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[1,0,2,3,4,5,6,7]530; AVX-FAST-NEXT: retq531;532; AVX2-SHUF-LABEL: phaddw_single_source2:533; AVX2-SHUF: # %bb.0:534; AVX2-SHUF-NEXT: vpshuflw {{.*#+}} xmm1 = xmm0[3,1,2,3,4,5,6,7]535; AVX2-SHUF-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]536; AVX2-SHUF-NEXT: vpaddw %xmm1, %xmm0, %xmm0537; AVX2-SHUF-NEXT: retq538 %l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 4, i32 6>539 %r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 5, i32 7>540 %add = add <8 x i16> %l, %r541 %shuffle2 = shufflevector <8 x i16> %add, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 3, i32 2, i32 undef, i32 undef, i32 undef, i32 undef>542 ret <8 x i16> %shuffle2543}544 545define <8 x i16> @phaddw_single_source3(<8 x i16> %x) {546; SSSE3-LABEL: phaddw_single_source3:547; SSSE3: # %bb.0:548; SSSE3-NEXT: phaddw %xmm0, %xmm0549; SSSE3-NEXT: retq550;551; AVX-LABEL: phaddw_single_source3:552; AVX: # %bb.0:553; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0554; AVX-NEXT: retq555 %l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 2, i32 undef, i32 undef>556 %r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 3, i32 undef, i32 undef>557 %add = add <8 x i16> %l, %r558 ret <8 x i16> %add559}560 561define <8 x i16> @phaddw_single_source4(<8 x i16> %x) {562; SSSE3-SLOW-LABEL: phaddw_single_source4:563; SSSE3-SLOW: # %bb.0:564; SSSE3-SLOW-NEXT: movdqa %xmm0, %xmm1565; SSSE3-SLOW-NEXT: pslld $16, %xmm1566; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0567; SSSE3-SLOW-NEXT: retq568;569; SSSE3-FAST-LABEL: phaddw_single_source4:570; SSSE3-FAST: # %bb.0:571; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0572; SSSE3-FAST-NEXT: retq573;574; AVX-SLOW-LABEL: phaddw_single_source4:575; AVX-SLOW: # %bb.0:576; AVX-SLOW-NEXT: vpslld $16, %xmm0, %xmm1577; AVX-SLOW-NEXT: vpaddw %xmm0, %xmm1, %xmm0578; AVX-SLOW-NEXT: retq579;580; AVX-FAST-LABEL: phaddw_single_source4:581; AVX-FAST: # %bb.0:582; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0583; AVX-FAST-NEXT: retq584;585; AVX2-SHUF-LABEL: phaddw_single_source4:586; AVX2-SHUF: # %bb.0:587; AVX2-SHUF-NEXT: vpslld $16, %xmm0, %xmm1588; AVX2-SHUF-NEXT: vpaddw %xmm0, %xmm1, %xmm0589; AVX2-SHUF-NEXT: retq590 %l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 6>591 %add = add <8 x i16> %l, %x592 ret <8 x i16> %add593}594 595define <8 x i16> @phaddw_single_source6(<8 x i16> %x) {596; SSSE3-LABEL: phaddw_single_source6:597; SSSE3: # %bb.0:598; SSSE3-NEXT: phaddw %xmm0, %xmm0599; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero600; SSSE3-NEXT: retq601;602; AVX-LABEL: phaddw_single_source6:603; AVX: # %bb.0:604; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm0605; AVX-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero606; AVX-NEXT: retq607 %l = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 undef, i32 undef, i32 undef>608 %r = shufflevector <8 x i16> %x, <8 x i16> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 undef, i32 undef, i32 undef>609 %add = add <8 x i16> %l, %r610 %shuffle2 = shufflevector <8 x i16> %add, <8 x i16> undef, <8 x i32> <i32 undef, i32 4, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>611 ret <8 x i16> %shuffle2612}613 614; PR39921 + PR39936615define i32 @PR39936_v8i32(<8 x i32>) {616; SSSE3-SLOW-LABEL: PR39936_v8i32:617; SSSE3-SLOW: # %bb.0:618; SSSE3-SLOW-NEXT: phaddd %xmm1, %xmm0619; SSSE3-SLOW-NEXT: phaddd %xmm0, %xmm0620; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]621; SSSE3-SLOW-NEXT: paddd %xmm0, %xmm1622; SSSE3-SLOW-NEXT: movd %xmm1, %eax623; SSSE3-SLOW-NEXT: retq624;625; SSSE3-FAST-LABEL: PR39936_v8i32:626; SSSE3-FAST: # %bb.0:627; SSSE3-FAST-NEXT: phaddd %xmm1, %xmm0628; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0629; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0630; SSSE3-FAST-NEXT: movd %xmm0, %eax631; SSSE3-FAST-NEXT: retq632;633; AVX1-SLOW-LABEL: PR39936_v8i32:634; AVX1-SLOW: # %bb.0:635; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1636; AVX1-SLOW-NEXT: vphaddd %xmm1, %xmm0, %xmm0637; AVX1-SLOW-NEXT: vphaddd %xmm0, %xmm0, %xmm0638; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]639; AVX1-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0640; AVX1-SLOW-NEXT: vmovd %xmm0, %eax641; AVX1-SLOW-NEXT: vzeroupper642; AVX1-SLOW-NEXT: retq643;644; AVX1-FAST-LABEL: PR39936_v8i32:645; AVX1-FAST: # %bb.0:646; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1647; AVX1-FAST-NEXT: vphaddd %xmm1, %xmm0, %xmm0648; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0649; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0650; AVX1-FAST-NEXT: vmovd %xmm0, %eax651; AVX1-FAST-NEXT: vzeroupper652; AVX1-FAST-NEXT: retq653;654; AVX2-SLOW-LABEL: PR39936_v8i32:655; AVX2-SLOW: # %bb.0:656; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1657; AVX2-SLOW-NEXT: vphaddd %xmm1, %xmm0, %xmm0658; AVX2-SLOW-NEXT: vphaddd %xmm0, %xmm0, %xmm0659; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]660; AVX2-SLOW-NEXT: vpaddd %xmm0, %xmm1, %xmm0661; AVX2-SLOW-NEXT: vmovd %xmm0, %eax662; AVX2-SLOW-NEXT: vzeroupper663; AVX2-SLOW-NEXT: retq664;665; AVX2-FAST-LABEL: PR39936_v8i32:666; AVX2-FAST: # %bb.0:667; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm1668; AVX2-FAST-NEXT: vphaddd %xmm1, %xmm0, %xmm0669; AVX2-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0670; AVX2-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0671; AVX2-FAST-NEXT: vmovd %xmm0, %eax672; AVX2-FAST-NEXT: vzeroupper673; AVX2-FAST-NEXT: retq674;675; AVX2-SHUF-LABEL: PR39936_v8i32:676; AVX2-SHUF: # %bb.0:677; AVX2-SHUF-NEXT: vextracti128 $1, %ymm0, %xmm1678; AVX2-SHUF-NEXT: vphaddd %xmm1, %xmm0, %xmm0679; AVX2-SHUF-NEXT: vphaddd %xmm0, %xmm0, %xmm0680; AVX2-SHUF-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]681; AVX2-SHUF-NEXT: vpaddd %xmm0, %xmm1, %xmm0682; AVX2-SHUF-NEXT: vmovd %xmm0, %eax683; AVX2-SHUF-NEXT: vzeroupper684; AVX2-SHUF-NEXT: retq685 %2 = shufflevector <8 x i32> %0, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>686 %3 = shufflevector <8 x i32> %0, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>687 %4 = add <8 x i32> %2, %3688 %5 = shufflevector <8 x i32> %4, <8 x i32> undef, <8 x i32> <i32 0, i32 2, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>689 %6 = shufflevector <8 x i32> %4, <8 x i32> undef, <8 x i32> <i32 1, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>690 %7 = add <8 x i32> %5, %6691 %8 = shufflevector <8 x i32> %7, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>692 %9 = add <8 x i32> %8, %7693 %10 = extractelement <8 x i32> %9, i32 0694 ret i32 %10695}696 697