brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.6 KiB · e74e701 Raw
419 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX7 8; Partial load dot product patterns based off PR510759 10;11; dot3(ptr x, ptr y) - ((xptr y[0])+(xptr y[1])+(xptr y[2]))12;13 14define float @dot3_float4(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {15; SSE2-LABEL: dot3_float4:16; SSE2:       # %bb.0:17; SSE2-NEXT:    movups (%rdi), %xmm018; SSE2-NEXT:    movups (%rsi), %xmm119; SSE2-NEXT:    mulps %xmm0, %xmm120; SSE2-NEXT:    movaps %xmm1, %xmm021; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]22; SSE2-NEXT:    addss %xmm1, %xmm023; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]24; SSE2-NEXT:    addss %xmm1, %xmm025; SSE2-NEXT:    retq26;27; SSSE3-LABEL: dot3_float4:28; SSSE3:       # %bb.0:29; SSSE3-NEXT:    movups (%rdi), %xmm030; SSSE3-NEXT:    movups (%rsi), %xmm131; SSSE3-NEXT:    mulps %xmm0, %xmm132; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]33; SSSE3-NEXT:    addss %xmm1, %xmm034; SSSE3-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]35; SSSE3-NEXT:    addss %xmm1, %xmm036; SSSE3-NEXT:    retq37;38; SSE41-LABEL: dot3_float4:39; SSE41:       # %bb.0:40; SSE41-NEXT:    movups (%rdi), %xmm041; SSE41-NEXT:    movups (%rsi), %xmm142; SSE41-NEXT:    mulps %xmm0, %xmm143; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]44; SSE41-NEXT:    addss %xmm1, %xmm045; SSE41-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]46; SSE41-NEXT:    addss %xmm1, %xmm047; SSE41-NEXT:    retq48;49; AVX-LABEL: dot3_float4:50; AVX:       # %bb.0:51; AVX-NEXT:    vmovups (%rdi), %xmm052; AVX-NEXT:    vmulps (%rsi), %xmm0, %xmm053; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]54; AVX-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]55; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm056; AVX-NEXT:    vaddss %xmm2, %xmm0, %xmm057; AVX-NEXT:    retq58  %x0123 = load <4 x float>, ptr %a0, align 459  %y0123 = load <4 x float>, ptr %a1, align 460  %mul0123 = fmul <4 x float> %x0123, %y012361  %mul0 = extractelement <4 x float> %mul0123, i32 062  %mul1 = extractelement <4 x float> %mul0123, i32 163  %mul2 = extractelement <4 x float> %mul0123, i32 264  %dot01 = fadd float %mul0, %mul165  %dot012 = fadd float %dot01, %mul266  ret float %dot01267}68 69define float @dot3_float4_as_float3(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {70; SSE2-LABEL: dot3_float4_as_float3:71; SSE2:       # %bb.0:72; SSE2-NEXT:    movups (%rdi), %xmm073; SSE2-NEXT:    movups (%rsi), %xmm174; SSE2-NEXT:    mulps %xmm0, %xmm175; SSE2-NEXT:    movaps %xmm1, %xmm076; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]77; SSE2-NEXT:    addss %xmm1, %xmm078; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]79; SSE2-NEXT:    addss %xmm1, %xmm080; SSE2-NEXT:    retq81;82; SSSE3-LABEL: dot3_float4_as_float3:83; SSSE3:       # %bb.0:84; SSSE3-NEXT:    movups (%rdi), %xmm085; SSSE3-NEXT:    movups (%rsi), %xmm186; SSSE3-NEXT:    mulps %xmm0, %xmm187; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]88; SSSE3-NEXT:    addss %xmm1, %xmm089; SSSE3-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]90; SSSE3-NEXT:    addss %xmm1, %xmm091; SSSE3-NEXT:    retq92;93; SSE41-LABEL: dot3_float4_as_float3:94; SSE41:       # %bb.0:95; SSE41-NEXT:    movups (%rdi), %xmm096; SSE41-NEXT:    movups (%rsi), %xmm197; SSE41-NEXT:    mulps %xmm0, %xmm198; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]99; SSE41-NEXT:    addss %xmm1, %xmm0100; SSE41-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]101; SSE41-NEXT:    addss %xmm1, %xmm0102; SSE41-NEXT:    retq103;104; AVX-LABEL: dot3_float4_as_float3:105; AVX:       # %bb.0:106; AVX-NEXT:    vmovups (%rdi), %xmm0107; AVX-NEXT:    vmulps (%rsi), %xmm0, %xmm0108; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]109; AVX-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]110; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0111; AVX-NEXT:    vaddss %xmm2, %xmm0, %xmm0112; AVX-NEXT:    retq113  %x0123 = load <4 x float>, ptr %a0, align 4114  %y0123 = load <4 x float>, ptr %a1, align 4115  %x012 = shufflevector <4 x float> %x0123, <4 x float> undef, <3 x i32> <i32 0, i32 1, i32 2>116  %y012 = shufflevector <4 x float> %y0123, <4 x float> undef, <3 x i32> <i32 0, i32 1, i32 2>117  %mul012 = fmul <3 x float> %x012, %y012118  %mul0 = extractelement <3 x float> %mul012, i32 0119  %mul1 = extractelement <3 x float> %mul012, i32 1120  %mul2 = extractelement <3 x float> %mul012, i32 2121  %dot01 = fadd float %mul0, %mul1122  %dot012 = fadd float %dot01, %mul2123  ret float %dot012124}125 126define float @dot3_float3(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {127; SSE2-LABEL: dot3_float3:128; SSE2:       # %bb.0:129; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero130; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero131; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]132; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]133; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero134; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero135; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0]136; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2]137; SSE2-NEXT:    mulps %xmm0, %xmm1138; SSE2-NEXT:    movaps %xmm1, %xmm0139; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]140; SSE2-NEXT:    addss %xmm1, %xmm0141; SSE2-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]142; SSE2-NEXT:    addss %xmm1, %xmm0143; SSE2-NEXT:    retq144;145; SSSE3-LABEL: dot3_float3:146; SSSE3:       # %bb.0:147; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero148; SSSE3-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero149; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]150; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]151; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero152; SSSE3-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero153; SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0]154; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2]155; SSSE3-NEXT:    mulps %xmm0, %xmm1156; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]157; SSSE3-NEXT:    addss %xmm1, %xmm0158; SSSE3-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]159; SSSE3-NEXT:    addss %xmm1, %xmm0160; SSSE3-NEXT:    retq161;162; SSE41-LABEL: dot3_float3:163; SSE41:       # %bb.0:164; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero165; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]166; SSE41-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero167; SSE41-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]168; SSE41-NEXT:    mulps %xmm0, %xmm1169; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]170; SSE41-NEXT:    addss %xmm1, %xmm0171; SSE41-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]172; SSE41-NEXT:    addss %xmm1, %xmm0173; SSE41-NEXT:    retq174;175; AVX-LABEL: dot3_float3:176; AVX:       # %bb.0:177; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero178; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]179; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero180; AVX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]181; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm0182; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]183; AVX-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]184; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0185; AVX-NEXT:    vaddss %xmm2, %xmm0, %xmm0186; AVX-NEXT:    retq187  %x012 = load <3 x float>, ptr %a0, align 4188  %y012 = load <3 x float>, ptr %a1, align 4189  %mul012 = fmul <3 x float> %x012, %y012190  %mul0 = extractelement <3 x float> %mul012, i32 0191  %mul1 = extractelement <3 x float> %mul012, i32 1192  %mul2 = extractelement <3 x float> %mul012, i32 2193  %dot01 = fadd float %mul0, %mul1194  %dot012 = fadd float %dot01, %mul2195  ret float %dot012196}197 198define float @dot3_float2_float(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {199; SSE2-LABEL: dot3_float2_float:200; SSE2:       # %bb.0:201; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero202; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero203; SSE2-NEXT:    mulps %xmm0, %xmm1204; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero205; SSE2-NEXT:    mulss 8(%rsi), %xmm2206; SSE2-NEXT:    movaps %xmm1, %xmm0207; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]208; SSE2-NEXT:    addss %xmm1, %xmm0209; SSE2-NEXT:    addss %xmm2, %xmm0210; SSE2-NEXT:    retq211;212; SSSE3-LABEL: dot3_float2_float:213; SSSE3:       # %bb.0:214; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero215; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero216; SSSE3-NEXT:    mulps %xmm0, %xmm1217; SSSE3-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero218; SSSE3-NEXT:    mulss 8(%rsi), %xmm2219; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]220; SSSE3-NEXT:    addss %xmm1, %xmm0221; SSSE3-NEXT:    addss %xmm2, %xmm0222; SSSE3-NEXT:    retq223;224; SSE41-LABEL: dot3_float2_float:225; SSE41:       # %bb.0:226; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero227; SSE41-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero228; SSE41-NEXT:    mulps %xmm0, %xmm1229; SSE41-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero230; SSE41-NEXT:    mulss 8(%rsi), %xmm2231; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]232; SSE41-NEXT:    addss %xmm1, %xmm0233; SSE41-NEXT:    addss %xmm2, %xmm0234; SSE41-NEXT:    retq235;236; AVX-LABEL: dot3_float2_float:237; AVX:       # %bb.0:238; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero239; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero240; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm0241; AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero242; AVX-NEXT:    vmulss 8(%rsi), %xmm1, %xmm1243; AVX-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]244; AVX-NEXT:    vaddss %xmm2, %xmm0, %xmm0245; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0246; AVX-NEXT:    retq247  %x01 = load <2 x float>, ptr %a0, align 4248  %y01 = load <2 x float>, ptr %a1, align 4249  %ptrx2 = getelementptr inbounds float, ptr %a0, i64 2250  %ptry2 = getelementptr inbounds float, ptr %a1, i64 2251  %x2 = load float, ptr %ptrx2, align 4252  %y2 = load float, ptr %ptry2, align 4253  %mul01 = fmul <2 x float> %x01, %y01254  %mul2 = fmul float %x2, %y2255  %mul0 = extractelement <2 x float> %mul01, i32 0256  %mul1 = extractelement <2 x float> %mul01, i32 1257  %dot01 = fadd float %mul0, %mul1258  %dot012 = fadd float %dot01, %mul2259  ret float %dot012260}261 262define float @dot3_float_float2(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {263; SSE2-LABEL: dot3_float_float2:264; SSE2:       # %bb.0:265; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero266; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero267; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero268; SSE2-NEXT:    mulps %xmm2, %xmm0269; SSE2-NEXT:    mulss (%rsi), %xmm1270; SSE2-NEXT:    addss %xmm0, %xmm1271; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]272; SSE2-NEXT:    addss %xmm1, %xmm0273; SSE2-NEXT:    retq274;275; SSSE3-LABEL: dot3_float_float2:276; SSSE3:       # %bb.0:277; SSSE3-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero278; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero279; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero280; SSSE3-NEXT:    mulps %xmm1, %xmm2281; SSSE3-NEXT:    mulss (%rsi), %xmm0282; SSSE3-NEXT:    movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]283; SSSE3-NEXT:    addss %xmm2, %xmm0284; SSSE3-NEXT:    addss %xmm1, %xmm0285; SSSE3-NEXT:    retq286;287; SSE41-LABEL: dot3_float_float2:288; SSE41:       # %bb.0:289; SSE41-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero290; SSE41-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero291; SSE41-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero292; SSE41-NEXT:    mulps %xmm1, %xmm2293; SSE41-NEXT:    mulss (%rsi), %xmm0294; SSE41-NEXT:    movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]295; SSE41-NEXT:    addss %xmm2, %xmm0296; SSE41-NEXT:    addss %xmm1, %xmm0297; SSE41-NEXT:    retq298;299; AVX-LABEL: dot3_float_float2:300; AVX:       # %bb.0:301; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero302; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero303; AVX-NEXT:    vmovsd {{.*#+}} xmm2 = mem[0],zero304; AVX-NEXT:    vmulps %xmm2, %xmm1, %xmm1305; AVX-NEXT:    vmulss (%rsi), %xmm0, %xmm0306; AVX-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]307; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0308; AVX-NEXT:    vaddss %xmm2, %xmm0, %xmm0309; AVX-NEXT:    retq310  %x0 = load float, ptr %a0, align 4311  %y0 = load float, ptr %a1, align 4312  %ptrx12 = getelementptr inbounds float, ptr %a0, i64 1313  %ptry12 = getelementptr inbounds float, ptr %a1, i64 1314  %x12 = load <2 x float>, ptr %ptrx12, align 4315  %y12 = load <2 x float>, ptr %ptry12, align 4316  %mul0 = fmul float %x0, %y0317  %mul12 = fmul <2 x float> %x12, %y12318  %mul1 = extractelement <2 x float> %mul12, i32 0319  %mul2 = extractelement <2 x float> %mul12, i32 1320  %dot01 = fadd float %mul0, %mul1321  %dot012 = fadd float %dot01, %mul2322  ret float %dot012323}324 325;326; dot2(ptr x, ptr y) - ((xptr y[0])+(xptr y[1]))327;328 329define float @dot2_float4(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {330; SSE2-LABEL: dot2_float4:331; SSE2:       # %bb.0:332; SSE2-NEXT:    movups (%rdi), %xmm0333; SSE2-NEXT:    movups (%rsi), %xmm1334; SSE2-NEXT:    mulps %xmm0, %xmm1335; SSE2-NEXT:    movaps %xmm1, %xmm0336; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]337; SSE2-NEXT:    addss %xmm1, %xmm0338; SSE2-NEXT:    retq339;340; SSSE3-LABEL: dot2_float4:341; SSSE3:       # %bb.0:342; SSSE3-NEXT:    movups (%rdi), %xmm0343; SSSE3-NEXT:    movups (%rsi), %xmm1344; SSSE3-NEXT:    mulps %xmm0, %xmm1345; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]346; SSSE3-NEXT:    addss %xmm1, %xmm0347; SSSE3-NEXT:    retq348;349; SSE41-LABEL: dot2_float4:350; SSE41:       # %bb.0:351; SSE41-NEXT:    movups (%rdi), %xmm0352; SSE41-NEXT:    movups (%rsi), %xmm1353; SSE41-NEXT:    mulps %xmm0, %xmm1354; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]355; SSE41-NEXT:    addss %xmm1, %xmm0356; SSE41-NEXT:    retq357;358; AVX-LABEL: dot2_float4:359; AVX:       # %bb.0:360; AVX-NEXT:    vmovups (%rdi), %xmm0361; AVX-NEXT:    vmulps (%rsi), %xmm0, %xmm0362; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]363; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0364; AVX-NEXT:    retq365  %x0123 = load <4 x float>, ptr %a0, align 4366  %y0123 = load <4 x float>, ptr %a1, align 4367  %mul0123 = fmul <4 x float> %x0123, %y0123368  %mul0 = extractelement <4 x float> %mul0123, i32 0369  %mul1 = extractelement <4 x float> %mul0123, i32 1370  %dot01 = fadd float %mul0, %mul1371  ret float %dot01372}373 374define float @dot2_float2(ptr dereferenceable(16) %a0, ptr dereferenceable(16) %a1) {375; SSE2-LABEL: dot2_float2:376; SSE2:       # %bb.0:377; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero378; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero379; SSE2-NEXT:    mulps %xmm0, %xmm1380; SSE2-NEXT:    movaps %xmm1, %xmm0381; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]382; SSE2-NEXT:    addss %xmm1, %xmm0383; SSE2-NEXT:    retq384;385; SSSE3-LABEL: dot2_float2:386; SSSE3:       # %bb.0:387; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero388; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero389; SSSE3-NEXT:    mulps %xmm0, %xmm1390; SSSE3-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]391; SSSE3-NEXT:    addss %xmm1, %xmm0392; SSSE3-NEXT:    retq393;394; SSE41-LABEL: dot2_float2:395; SSE41:       # %bb.0:396; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero397; SSE41-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero398; SSE41-NEXT:    mulps %xmm0, %xmm1399; SSE41-NEXT:    movshdup {{.*#+}} xmm0 = xmm1[1,1,3,3]400; SSE41-NEXT:    addss %xmm1, %xmm0401; SSE41-NEXT:    retq402;403; AVX-LABEL: dot2_float2:404; AVX:       # %bb.0:405; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero406; AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero407; AVX-NEXT:    vmulps %xmm1, %xmm0, %xmm0408; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]409; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0410; AVX-NEXT:    retq411  %x01 = load <2 x float>, ptr %a0, align 4412  %y01 = load <2 x float>, ptr %a1, align 4413  %mul01 = fmul <2 x float> %x01, %y01414  %mul0 = extractelement <2 x float> %mul01, i32 0415  %mul1 = extractelement <2 x float> %mul01, i32 1416  %dot01 = fadd float %mul0, %mul1417  ret float %dot01418}419