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