brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.9 KiB · 12c7a09 Raw
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