1407 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-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX-RECIP4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+fma | FileCheck %s --check-prefixes=AVX,FMA-RECIP5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=bdver2 | FileCheck %s --check-prefixes=AVX,BDVER26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=btver2 | FileCheck %s --check-prefixes=AVX,BTVER27; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=sandybridge | FileCheck %s --check-prefixes=AVX,SANDY8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=haswell | FileCheck %s --check-prefixes=AVX,HASWELL9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=haswell -mattr=-fma | FileCheck %s --check-prefixes=AVX,HASWELL-NO-FMA10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl | FileCheck %s --check-prefixes=AVX,AVX512,KNL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=AVX,AVX512,SKX12 13; If the target's divss/divps instructions are substantially14; slower than rcpss/rcpps with a Newton-Raphson refinement,15; we should generate the estimate sequence.16 17; See PR21385 ( http://llvm.org/bugs/show_bug.cgi?id=21385 )18; for details about the accuracy, speed, and implementation19; differences of x86 reciprocal estimates.20 21define float @f32_no_estimate(float %x) #0 {22; SSE-LABEL: f32_no_estimate:23; SSE: # %bb.0:24; SSE-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]25; SSE-NEXT: divss %xmm0, %xmm126; SSE-NEXT: movaps %xmm1, %xmm027; SSE-NEXT: retq28;29; AVX-LABEL: f32_no_estimate:30; AVX: # %bb.0:31; AVX-NEXT: vmovss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]32; AVX-NEXT: vdivss %xmm0, %xmm1, %xmm033; AVX-NEXT: retq34 %div = fdiv fast float 1.0, %x35 ret float %div36}37 38define float @f32_one_step(float %x) #1 {39; SSE-LABEL: f32_one_step:40; SSE: # %bb.0:41; SSE-NEXT: rcpss %xmm0, %xmm242; SSE-NEXT: mulss %xmm2, %xmm043; SSE-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]44; SSE-NEXT: subss %xmm0, %xmm145; SSE-NEXT: mulss %xmm2, %xmm146; SSE-NEXT: addss %xmm2, %xmm147; SSE-NEXT: movaps %xmm1, %xmm048; SSE-NEXT: retq49;50; AVX-RECIP-LABEL: f32_one_step:51; AVX-RECIP: # %bb.0:52; AVX-RECIP-NEXT: vrcpss %xmm0, %xmm0, %xmm153; AVX-RECIP-NEXT: vmulss %xmm1, %xmm0, %xmm054; AVX-RECIP-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]55; AVX-RECIP-NEXT: vsubss %xmm0, %xmm2, %xmm056; AVX-RECIP-NEXT: vmulss %xmm0, %xmm1, %xmm057; AVX-RECIP-NEXT: vaddss %xmm0, %xmm1, %xmm058; AVX-RECIP-NEXT: retq59;60; FMA-RECIP-LABEL: f32_one_step:61; FMA-RECIP: # %bb.0:62; FMA-RECIP-NEXT: vrcpss %xmm0, %xmm0, %xmm163; FMA-RECIP-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem64; FMA-RECIP-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm165; FMA-RECIP-NEXT: retq66;67; BDVER2-LABEL: f32_one_step:68; BDVER2: # %bb.0:69; BDVER2-NEXT: vrcpss %xmm0, %xmm0, %xmm170; BDVER2-NEXT: vfmsubss {{.*#+}} xmm0 = (xmm0 * xmm1) - mem71; BDVER2-NEXT: vfnmaddss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm172; BDVER2-NEXT: retq73;74; BTVER2-LABEL: f32_one_step:75; BTVER2: # %bb.0:76; BTVER2-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]77; BTVER2-NEXT: vrcpss %xmm0, %xmm0, %xmm178; BTVER2-NEXT: vmulss %xmm1, %xmm0, %xmm079; BTVER2-NEXT: vsubss %xmm0, %xmm2, %xmm080; BTVER2-NEXT: vmulss %xmm0, %xmm1, %xmm081; BTVER2-NEXT: vaddss %xmm0, %xmm1, %xmm082; BTVER2-NEXT: retq83;84; SANDY-LABEL: f32_one_step:85; SANDY: # %bb.0:86; SANDY-NEXT: vrcpss %xmm0, %xmm0, %xmm187; SANDY-NEXT: vmulss %xmm1, %xmm0, %xmm088; SANDY-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]89; SANDY-NEXT: vsubss %xmm0, %xmm2, %xmm090; SANDY-NEXT: vmulss %xmm0, %xmm1, %xmm091; SANDY-NEXT: vaddss %xmm0, %xmm1, %xmm092; SANDY-NEXT: retq93;94; HASWELL-LABEL: f32_one_step:95; HASWELL: # %bb.0:96; HASWELL-NEXT: vrcpss %xmm0, %xmm0, %xmm197; HASWELL-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem98; HASWELL-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm199; HASWELL-NEXT: retq100;101; HASWELL-NO-FMA-LABEL: f32_one_step:102; HASWELL-NO-FMA: # %bb.0:103; HASWELL-NO-FMA-NEXT: vrcpss %xmm0, %xmm0, %xmm1104; HASWELL-NO-FMA-NEXT: vmulss %xmm1, %xmm0, %xmm0105; HASWELL-NO-FMA-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]106; HASWELL-NO-FMA-NEXT: vsubss %xmm0, %xmm2, %xmm0107; HASWELL-NO-FMA-NEXT: vmulss %xmm0, %xmm1, %xmm0108; HASWELL-NO-FMA-NEXT: vaddss %xmm0, %xmm1, %xmm0109; HASWELL-NO-FMA-NEXT: retq110;111; AVX512-LABEL: f32_one_step:112; AVX512: # %bb.0:113; AVX512-NEXT: vrcpss %xmm0, %xmm0, %xmm1114; AVX512-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm1 * xmm0) - mem115; AVX512-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1116; AVX512-NEXT: retq117 %div = fdiv fast float 1.0, %x118 ret float %div119}120 121define float @f32_one_step_variables(float %x, float %y) #1 {122; SSE-LABEL: f32_one_step_variables:123; SSE: # %bb.0:124; SSE-NEXT: rcpss %xmm1, %xmm2125; SSE-NEXT: movaps %xmm0, %xmm3126; SSE-NEXT: mulss %xmm2, %xmm3127; SSE-NEXT: mulss %xmm3, %xmm1128; SSE-NEXT: subss %xmm1, %xmm0129; SSE-NEXT: mulss %xmm2, %xmm0130; SSE-NEXT: addss %xmm3, %xmm0131; SSE-NEXT: retq132;133; AVX-RECIP-LABEL: f32_one_step_variables:134; AVX-RECIP: # %bb.0:135; AVX-RECIP-NEXT: vrcpss %xmm1, %xmm1, %xmm2136; AVX-RECIP-NEXT: vmulss %xmm2, %xmm0, %xmm3137; AVX-RECIP-NEXT: vmulss %xmm3, %xmm1, %xmm1138; AVX-RECIP-NEXT: vsubss %xmm1, %xmm0, %xmm0139; AVX-RECIP-NEXT: vmulss %xmm0, %xmm2, %xmm0140; AVX-RECIP-NEXT: vaddss %xmm0, %xmm3, %xmm0141; AVX-RECIP-NEXT: retq142;143; FMA-RECIP-LABEL: f32_one_step_variables:144; FMA-RECIP: # %bb.0:145; FMA-RECIP-NEXT: vrcpss %xmm1, %xmm1, %xmm2146; FMA-RECIP-NEXT: vmulss %xmm2, %xmm0, %xmm3147; FMA-RECIP-NEXT: vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0148; FMA-RECIP-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3149; FMA-RECIP-NEXT: retq150;151; BDVER2-LABEL: f32_one_step_variables:152; BDVER2: # %bb.0:153; BDVER2-NEXT: vrcpss %xmm1, %xmm1, %xmm2154; BDVER2-NEXT: vmulss %xmm2, %xmm0, %xmm3155; BDVER2-NEXT: vfmsubss {{.*#+}} xmm0 = (xmm1 * xmm3) - xmm0156; BDVER2-NEXT: vfnmaddss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3157; BDVER2-NEXT: retq158;159; BTVER2-LABEL: f32_one_step_variables:160; BTVER2: # %bb.0:161; BTVER2-NEXT: vrcpss %xmm1, %xmm1, %xmm2162; BTVER2-NEXT: vmulss %xmm2, %xmm0, %xmm3163; BTVER2-NEXT: vmulss %xmm3, %xmm1, %xmm1164; BTVER2-NEXT: vsubss %xmm1, %xmm0, %xmm0165; BTVER2-NEXT: vmulss %xmm0, %xmm2, %xmm0166; BTVER2-NEXT: vaddss %xmm0, %xmm3, %xmm0167; BTVER2-NEXT: retq168;169; SANDY-LABEL: f32_one_step_variables:170; SANDY: # %bb.0:171; SANDY-NEXT: vrcpss %xmm1, %xmm1, %xmm2172; SANDY-NEXT: vmulss %xmm2, %xmm0, %xmm3173; SANDY-NEXT: vmulss %xmm3, %xmm1, %xmm1174; SANDY-NEXT: vsubss %xmm1, %xmm0, %xmm0175; SANDY-NEXT: vmulss %xmm0, %xmm2, %xmm0176; SANDY-NEXT: vaddss %xmm0, %xmm3, %xmm0177; SANDY-NEXT: retq178;179; HASWELL-LABEL: f32_one_step_variables:180; HASWELL: # %bb.0:181; HASWELL-NEXT: vrcpss %xmm1, %xmm1, %xmm2182; HASWELL-NEXT: vmulss %xmm2, %xmm0, %xmm3183; HASWELL-NEXT: vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0184; HASWELL-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3185; HASWELL-NEXT: retq186;187; HASWELL-NO-FMA-LABEL: f32_one_step_variables:188; HASWELL-NO-FMA: # %bb.0:189; HASWELL-NO-FMA-NEXT: vrcpss %xmm1, %xmm1, %xmm2190; HASWELL-NO-FMA-NEXT: vmulss %xmm2, %xmm0, %xmm3191; HASWELL-NO-FMA-NEXT: vmulss %xmm3, %xmm1, %xmm1192; HASWELL-NO-FMA-NEXT: vsubss %xmm1, %xmm0, %xmm0193; HASWELL-NO-FMA-NEXT: vmulss %xmm0, %xmm2, %xmm0194; HASWELL-NO-FMA-NEXT: vaddss %xmm0, %xmm3, %xmm0195; HASWELL-NO-FMA-NEXT: retq196;197; AVX512-LABEL: f32_one_step_variables:198; AVX512: # %bb.0:199; AVX512-NEXT: vrcpss %xmm1, %xmm1, %xmm2200; AVX512-NEXT: vmulss %xmm2, %xmm0, %xmm3201; AVX512-NEXT: vfmsub231ss {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0202; AVX512-NEXT: vfnmadd213ss {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3203; AVX512-NEXT: retq204 %div = fdiv fast float %x, %y205 ret float %div206}207 208define float @f32_two_step(float %x) #2 {209; SSE-LABEL: f32_two_step:210; SSE: # %bb.0:211; SSE-NEXT: rcpss %xmm0, %xmm2212; SSE-NEXT: movaps %xmm0, %xmm3213; SSE-NEXT: mulss %xmm2, %xmm3214; SSE-NEXT: movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]215; SSE-NEXT: movaps %xmm1, %xmm4216; SSE-NEXT: subss %xmm3, %xmm4217; SSE-NEXT: mulss %xmm2, %xmm4218; SSE-NEXT: addss %xmm2, %xmm4219; SSE-NEXT: mulss %xmm4, %xmm0220; SSE-NEXT: subss %xmm0, %xmm1221; SSE-NEXT: mulss %xmm4, %xmm1222; SSE-NEXT: addss %xmm4, %xmm1223; SSE-NEXT: movaps %xmm1, %xmm0224; SSE-NEXT: retq225;226; AVX-RECIP-LABEL: f32_two_step:227; AVX-RECIP: # %bb.0:228; AVX-RECIP-NEXT: vrcpss %xmm0, %xmm0, %xmm1229; AVX-RECIP-NEXT: vmulss %xmm1, %xmm0, %xmm2230; AVX-RECIP-NEXT: vmovss {{.*#+}} xmm3 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]231; AVX-RECIP-NEXT: vsubss %xmm2, %xmm3, %xmm2232; AVX-RECIP-NEXT: vmulss %xmm2, %xmm1, %xmm2233; AVX-RECIP-NEXT: vaddss %xmm2, %xmm1, %xmm1234; AVX-RECIP-NEXT: vmulss %xmm1, %xmm0, %xmm0235; AVX-RECIP-NEXT: vsubss %xmm0, %xmm3, %xmm0236; AVX-RECIP-NEXT: vmulss %xmm0, %xmm1, %xmm0237; AVX-RECIP-NEXT: vaddss %xmm0, %xmm1, %xmm0238; AVX-RECIP-NEXT: retq239;240; FMA-RECIP-LABEL: f32_two_step:241; FMA-RECIP: # %bb.0:242; FMA-RECIP-NEXT: vrcpss %xmm0, %xmm0, %xmm1243; FMA-RECIP-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]244; FMA-RECIP-NEXT: vmovaps %xmm1, %xmm3245; FMA-RECIP-NEXT: vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2246; FMA-RECIP-NEXT: vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1247; FMA-RECIP-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2248; FMA-RECIP-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3249; FMA-RECIP-NEXT: retq250;251; BDVER2-LABEL: f32_two_step:252; BDVER2: # %bb.0:253; BDVER2-NEXT: vrcpss %xmm0, %xmm0, %xmm1254; BDVER2-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]255; BDVER2-NEXT: vfmsubss {{.*#+}} xmm3 = (xmm0 * xmm1) - xmm2256; BDVER2-NEXT: vfnmaddss {{.*#+}} xmm1 = -(xmm1 * xmm3) + xmm1257; BDVER2-NEXT: vfmsubss {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2258; BDVER2-NEXT: vfnmaddss {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1259; BDVER2-NEXT: retq260;261; BTVER2-LABEL: f32_two_step:262; BTVER2: # %bb.0:263; BTVER2-NEXT: vmovss {{.*#+}} xmm3 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]264; BTVER2-NEXT: vrcpss %xmm0, %xmm0, %xmm1265; BTVER2-NEXT: vmulss %xmm1, %xmm0, %xmm2266; BTVER2-NEXT: vsubss %xmm2, %xmm3, %xmm2267; BTVER2-NEXT: vmulss %xmm2, %xmm1, %xmm2268; BTVER2-NEXT: vaddss %xmm2, %xmm1, %xmm1269; BTVER2-NEXT: vmulss %xmm1, %xmm0, %xmm0270; BTVER2-NEXT: vsubss %xmm0, %xmm3, %xmm0271; BTVER2-NEXT: vmulss %xmm0, %xmm1, %xmm0272; BTVER2-NEXT: vaddss %xmm0, %xmm1, %xmm0273; BTVER2-NEXT: retq274;275; SANDY-LABEL: f32_two_step:276; SANDY: # %bb.0:277; SANDY-NEXT: vrcpss %xmm0, %xmm0, %xmm1278; SANDY-NEXT: vmulss %xmm1, %xmm0, %xmm2279; SANDY-NEXT: vmovss {{.*#+}} xmm3 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]280; SANDY-NEXT: vsubss %xmm2, %xmm3, %xmm2281; SANDY-NEXT: vmulss %xmm2, %xmm1, %xmm2282; SANDY-NEXT: vaddss %xmm2, %xmm1, %xmm1283; SANDY-NEXT: vmulss %xmm1, %xmm0, %xmm0284; SANDY-NEXT: vsubss %xmm0, %xmm3, %xmm0285; SANDY-NEXT: vmulss %xmm0, %xmm1, %xmm0286; SANDY-NEXT: vaddss %xmm0, %xmm1, %xmm0287; SANDY-NEXT: retq288;289; HASWELL-LABEL: f32_two_step:290; HASWELL: # %bb.0:291; HASWELL-NEXT: vrcpss %xmm0, %xmm0, %xmm1292; HASWELL-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]293; HASWELL-NEXT: vmovaps %xmm1, %xmm3294; HASWELL-NEXT: vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2295; HASWELL-NEXT: vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1296; HASWELL-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2297; HASWELL-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3298; HASWELL-NEXT: retq299;300; HASWELL-NO-FMA-LABEL: f32_two_step:301; HASWELL-NO-FMA: # %bb.0:302; HASWELL-NO-FMA-NEXT: vrcpss %xmm0, %xmm0, %xmm1303; HASWELL-NO-FMA-NEXT: vmulss %xmm1, %xmm0, %xmm2304; HASWELL-NO-FMA-NEXT: vmovss {{.*#+}} xmm3 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]305; HASWELL-NO-FMA-NEXT: vsubss %xmm2, %xmm3, %xmm2306; HASWELL-NO-FMA-NEXT: vmulss %xmm2, %xmm1, %xmm2307; HASWELL-NO-FMA-NEXT: vaddss %xmm2, %xmm1, %xmm1308; HASWELL-NO-FMA-NEXT: vmulss %xmm1, %xmm0, %xmm0309; HASWELL-NO-FMA-NEXT: vsubss %xmm0, %xmm3, %xmm0310; HASWELL-NO-FMA-NEXT: vmulss %xmm0, %xmm1, %xmm0311; HASWELL-NO-FMA-NEXT: vaddss %xmm0, %xmm1, %xmm0312; HASWELL-NO-FMA-NEXT: retq313;314; AVX512-LABEL: f32_two_step:315; AVX512: # %bb.0:316; AVX512-NEXT: vrcpss %xmm0, %xmm0, %xmm1317; AVX512-NEXT: vmovss {{.*#+}} xmm2 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]318; AVX512-NEXT: vmovaps %xmm1, %xmm3319; AVX512-NEXT: vfmsub213ss {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2320; AVX512-NEXT: vfnmadd132ss {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1321; AVX512-NEXT: vfmsub213ss {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2322; AVX512-NEXT: vfnmadd132ss {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3323; AVX512-NEXT: retq324 %div = fdiv fast float 1.0, %x325 ret float %div326}327 328define <4 x float> @v4f32_no_estimate(<4 x float> %x) #0 {329; SSE-LABEL: v4f32_no_estimate:330; SSE: # %bb.0:331; SSE-NEXT: movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]332; SSE-NEXT: divps %xmm0, %xmm1333; SSE-NEXT: movaps %xmm1, %xmm0334; SSE-NEXT: retq335;336; AVX-RECIP-LABEL: v4f32_no_estimate:337; AVX-RECIP: # %bb.0:338; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]339; AVX-RECIP-NEXT: vdivps %xmm0, %xmm1, %xmm0340; AVX-RECIP-NEXT: retq341;342; FMA-RECIP-LABEL: v4f32_no_estimate:343; FMA-RECIP: # %bb.0:344; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]345; FMA-RECIP-NEXT: vdivps %xmm0, %xmm1, %xmm0346; FMA-RECIP-NEXT: retq347;348; BDVER2-LABEL: v4f32_no_estimate:349; BDVER2: # %bb.0:350; BDVER2-NEXT: vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]351; BDVER2-NEXT: vdivps %xmm0, %xmm1, %xmm0352; BDVER2-NEXT: retq353;354; BTVER2-LABEL: v4f32_no_estimate:355; BTVER2: # %bb.0:356; BTVER2-NEXT: vmovaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]357; BTVER2-NEXT: vdivps %xmm0, %xmm1, %xmm0358; BTVER2-NEXT: retq359;360; SANDY-LABEL: v4f32_no_estimate:361; SANDY: # %bb.0:362; SANDY-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]363; SANDY-NEXT: vdivps %xmm0, %xmm1, %xmm0364; SANDY-NEXT: retq365;366; HASWELL-LABEL: v4f32_no_estimate:367; HASWELL: # %bb.0:368; HASWELL-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]369; HASWELL-NEXT: vdivps %xmm0, %xmm1, %xmm0370; HASWELL-NEXT: retq371;372; HASWELL-NO-FMA-LABEL: v4f32_no_estimate:373; HASWELL-NO-FMA: # %bb.0:374; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]375; HASWELL-NO-FMA-NEXT: vdivps %xmm0, %xmm1, %xmm0376; HASWELL-NO-FMA-NEXT: retq377;378; AVX512-LABEL: v4f32_no_estimate:379; AVX512: # %bb.0:380; AVX512-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]381; AVX512-NEXT: vdivps %xmm0, %xmm1, %xmm0382; AVX512-NEXT: retq383 %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x384 ret <4 x float> %div385}386 387define <4 x float> @v4f32_one_step(<4 x float> %x) #1 {388; SSE-LABEL: v4f32_one_step:389; SSE: # %bb.0:390; SSE-NEXT: rcpps %xmm0, %xmm2391; SSE-NEXT: mulps %xmm2, %xmm0392; SSE-NEXT: movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]393; SSE-NEXT: subps %xmm0, %xmm1394; SSE-NEXT: mulps %xmm2, %xmm1395; SSE-NEXT: addps %xmm2, %xmm1396; SSE-NEXT: movaps %xmm1, %xmm0397; SSE-NEXT: retq398;399; AVX-RECIP-LABEL: v4f32_one_step:400; AVX-RECIP: # %bb.0:401; AVX-RECIP-NEXT: vrcpps %xmm0, %xmm1402; AVX-RECIP-NEXT: vmulps %xmm1, %xmm0, %xmm0403; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]404; AVX-RECIP-NEXT: vsubps %xmm0, %xmm2, %xmm0405; AVX-RECIP-NEXT: vmulps %xmm0, %xmm1, %xmm0406; AVX-RECIP-NEXT: vaddps %xmm0, %xmm1, %xmm0407; AVX-RECIP-NEXT: retq408;409; FMA-RECIP-LABEL: v4f32_one_step:410; FMA-RECIP: # %bb.0:411; FMA-RECIP-NEXT: vrcpps %xmm0, %xmm1412; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - mem413; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1414; FMA-RECIP-NEXT: retq415;416; BDVER2-LABEL: v4f32_one_step:417; BDVER2: # %bb.0:418; BDVER2-NEXT: vrcpps %xmm0, %xmm1419; BDVER2-NEXT: vfmsubps {{.*#+}} xmm0 = (xmm0 * xmm1) - mem420; BDVER2-NEXT: vfnmaddps {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1421; BDVER2-NEXT: retq422;423; BTVER2-LABEL: v4f32_one_step:424; BTVER2: # %bb.0:425; BTVER2-NEXT: vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]426; BTVER2-NEXT: vrcpps %xmm0, %xmm1427; BTVER2-NEXT: vmulps %xmm1, %xmm0, %xmm0428; BTVER2-NEXT: vsubps %xmm0, %xmm2, %xmm0429; BTVER2-NEXT: vmulps %xmm0, %xmm1, %xmm0430; BTVER2-NEXT: vaddps %xmm0, %xmm1, %xmm0431; BTVER2-NEXT: retq432;433; SANDY-LABEL: v4f32_one_step:434; SANDY: # %bb.0:435; SANDY-NEXT: vrcpps %xmm0, %xmm1436; SANDY-NEXT: vmulps %xmm1, %xmm0, %xmm0437; SANDY-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]438; SANDY-NEXT: vsubps %xmm0, %xmm2, %xmm0439; SANDY-NEXT: vmulps %xmm0, %xmm1, %xmm0440; SANDY-NEXT: vaddps %xmm0, %xmm1, %xmm0441; SANDY-NEXT: retq442;443; HASWELL-LABEL: v4f32_one_step:444; HASWELL: # %bb.0:445; HASWELL-NEXT: vrcpps %xmm0, %xmm1446; HASWELL-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]447; HASWELL-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2448; HASWELL-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1449; HASWELL-NEXT: retq450;451; HASWELL-NO-FMA-LABEL: v4f32_one_step:452; HASWELL-NO-FMA: # %bb.0:453; HASWELL-NO-FMA-NEXT: vrcpps %xmm0, %xmm1454; HASWELL-NO-FMA-NEXT: vmulps %xmm1, %xmm0, %xmm0455; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]456; HASWELL-NO-FMA-NEXT: vsubps %xmm0, %xmm2, %xmm0457; HASWELL-NO-FMA-NEXT: vmulps %xmm0, %xmm1, %xmm0458; HASWELL-NO-FMA-NEXT: vaddps %xmm0, %xmm1, %xmm0459; HASWELL-NO-FMA-NEXT: retq460;461; KNL-LABEL: v4f32_one_step:462; KNL: # %bb.0:463; KNL-NEXT: vrcpps %xmm0, %xmm1464; KNL-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]465; KNL-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - xmm2466; KNL-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1467; KNL-NEXT: retq468;469; SKX-LABEL: v4f32_one_step:470; SKX: # %bb.0:471; SKX-NEXT: vrcpps %xmm0, %xmm1472; SKX-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm1 * xmm0) - mem473; SKX-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm1) + xmm1474; SKX-NEXT: retq475 %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x476 ret <4 x float> %div477}478 479define <4 x float> @v4f32_one_step_variables(<4 x float> %x, <4 x float> %y) #1 {480; SSE-LABEL: v4f32_one_step_variables:481; SSE: # %bb.0:482; SSE-NEXT: rcpps %xmm1, %xmm2483; SSE-NEXT: movaps %xmm0, %xmm3484; SSE-NEXT: mulps %xmm2, %xmm3485; SSE-NEXT: mulps %xmm3, %xmm1486; SSE-NEXT: subps %xmm1, %xmm0487; SSE-NEXT: mulps %xmm2, %xmm0488; SSE-NEXT: addps %xmm3, %xmm0489; SSE-NEXT: retq490;491; AVX-RECIP-LABEL: v4f32_one_step_variables:492; AVX-RECIP: # %bb.0:493; AVX-RECIP-NEXT: vrcpps %xmm1, %xmm2494; AVX-RECIP-NEXT: vmulps %xmm2, %xmm0, %xmm3495; AVX-RECIP-NEXT: vmulps %xmm3, %xmm1, %xmm1496; AVX-RECIP-NEXT: vsubps %xmm1, %xmm0, %xmm0497; AVX-RECIP-NEXT: vmulps %xmm0, %xmm2, %xmm0498; AVX-RECIP-NEXT: vaddps %xmm0, %xmm3, %xmm0499; AVX-RECIP-NEXT: retq500;501; FMA-RECIP-LABEL: v4f32_one_step_variables:502; FMA-RECIP: # %bb.0:503; FMA-RECIP-NEXT: vrcpps %xmm1, %xmm2504; FMA-RECIP-NEXT: vmulps %xmm2, %xmm0, %xmm3505; FMA-RECIP-NEXT: vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0506; FMA-RECIP-NEXT: vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3507; FMA-RECIP-NEXT: retq508;509; BDVER2-LABEL: v4f32_one_step_variables:510; BDVER2: # %bb.0:511; BDVER2-NEXT: vrcpps %xmm1, %xmm2512; BDVER2-NEXT: vmulps %xmm2, %xmm0, %xmm3513; BDVER2-NEXT: vfmsubps {{.*#+}} xmm0 = (xmm1 * xmm3) - xmm0514; BDVER2-NEXT: vfnmaddps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3515; BDVER2-NEXT: retq516;517; BTVER2-LABEL: v4f32_one_step_variables:518; BTVER2: # %bb.0:519; BTVER2-NEXT: vrcpps %xmm1, %xmm2520; BTVER2-NEXT: vmulps %xmm2, %xmm0, %xmm3521; BTVER2-NEXT: vmulps %xmm3, %xmm1, %xmm1522; BTVER2-NEXT: vsubps %xmm1, %xmm0, %xmm0523; BTVER2-NEXT: vmulps %xmm0, %xmm2, %xmm0524; BTVER2-NEXT: vaddps %xmm0, %xmm3, %xmm0525; BTVER2-NEXT: retq526;527; SANDY-LABEL: v4f32_one_step_variables:528; SANDY: # %bb.0:529; SANDY-NEXT: vrcpps %xmm1, %xmm2530; SANDY-NEXT: vmulps %xmm2, %xmm0, %xmm3531; SANDY-NEXT: vmulps %xmm3, %xmm1, %xmm1532; SANDY-NEXT: vsubps %xmm1, %xmm0, %xmm0533; SANDY-NEXT: vmulps %xmm0, %xmm2, %xmm0534; SANDY-NEXT: vaddps %xmm0, %xmm3, %xmm0535; SANDY-NEXT: retq536;537; HASWELL-LABEL: v4f32_one_step_variables:538; HASWELL: # %bb.0:539; HASWELL-NEXT: vrcpps %xmm1, %xmm2540; HASWELL-NEXT: vmulps %xmm2, %xmm0, %xmm3541; HASWELL-NEXT: vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0542; HASWELL-NEXT: vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3543; HASWELL-NEXT: retq544;545; HASWELL-NO-FMA-LABEL: v4f32_one_step_variables:546; HASWELL-NO-FMA: # %bb.0:547; HASWELL-NO-FMA-NEXT: vrcpps %xmm1, %xmm2548; HASWELL-NO-FMA-NEXT: vmulps %xmm2, %xmm0, %xmm3549; HASWELL-NO-FMA-NEXT: vmulps %xmm3, %xmm1, %xmm1550; HASWELL-NO-FMA-NEXT: vsubps %xmm1, %xmm0, %xmm0551; HASWELL-NO-FMA-NEXT: vmulps %xmm0, %xmm2, %xmm0552; HASWELL-NO-FMA-NEXT: vaddps %xmm0, %xmm3, %xmm0553; HASWELL-NO-FMA-NEXT: retq554;555; AVX512-LABEL: v4f32_one_step_variables:556; AVX512: # %bb.0:557; AVX512-NEXT: vrcpps %xmm1, %xmm2558; AVX512-NEXT: vmulps %xmm2, %xmm0, %xmm3559; AVX512-NEXT: vfmsub231ps {{.*#+}} xmm0 = (xmm3 * xmm1) - xmm0560; AVX512-NEXT: vfnmadd213ps {{.*#+}} xmm0 = -(xmm2 * xmm0) + xmm3561; AVX512-NEXT: retq562 %div = fdiv fast <4 x float> %x, %y563 ret <4 x float> %div564}565 566define <4 x float> @v4f32_two_step(<4 x float> %x) #2 {567; SSE-LABEL: v4f32_two_step:568; SSE: # %bb.0:569; SSE-NEXT: rcpps %xmm0, %xmm2570; SSE-NEXT: movaps %xmm0, %xmm3571; SSE-NEXT: mulps %xmm2, %xmm3572; SSE-NEXT: movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]573; SSE-NEXT: movaps %xmm1, %xmm4574; SSE-NEXT: subps %xmm3, %xmm4575; SSE-NEXT: mulps %xmm2, %xmm4576; SSE-NEXT: addps %xmm2, %xmm4577; SSE-NEXT: mulps %xmm4, %xmm0578; SSE-NEXT: subps %xmm0, %xmm1579; SSE-NEXT: mulps %xmm4, %xmm1580; SSE-NEXT: addps %xmm4, %xmm1581; SSE-NEXT: movaps %xmm1, %xmm0582; SSE-NEXT: retq583;584; AVX-RECIP-LABEL: v4f32_two_step:585; AVX-RECIP: # %bb.0:586; AVX-RECIP-NEXT: vrcpps %xmm0, %xmm1587; AVX-RECIP-NEXT: vmulps %xmm1, %xmm0, %xmm2588; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]589; AVX-RECIP-NEXT: vsubps %xmm2, %xmm3, %xmm2590; AVX-RECIP-NEXT: vmulps %xmm2, %xmm1, %xmm2591; AVX-RECIP-NEXT: vaddps %xmm2, %xmm1, %xmm1592; AVX-RECIP-NEXT: vmulps %xmm1, %xmm0, %xmm0593; AVX-RECIP-NEXT: vsubps %xmm0, %xmm3, %xmm0594; AVX-RECIP-NEXT: vmulps %xmm0, %xmm1, %xmm0595; AVX-RECIP-NEXT: vaddps %xmm0, %xmm1, %xmm0596; AVX-RECIP-NEXT: retq597;598; FMA-RECIP-LABEL: v4f32_two_step:599; FMA-RECIP: # %bb.0:600; FMA-RECIP-NEXT: vrcpps %xmm0, %xmm1601; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]602; FMA-RECIP-NEXT: vmovaps %xmm1, %xmm3603; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2604; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1605; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2606; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3607; FMA-RECIP-NEXT: retq608;609; BDVER2-LABEL: v4f32_two_step:610; BDVER2: # %bb.0:611; BDVER2-NEXT: vrcpps %xmm0, %xmm1612; BDVER2-NEXT: vmovaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]613; BDVER2-NEXT: vfmsubps {{.*#+}} xmm3 = (xmm0 * xmm1) - xmm2614; BDVER2-NEXT: vfnmaddps {{.*#+}} xmm1 = -(xmm1 * xmm3) + xmm1615; BDVER2-NEXT: vfmsubps {{.*#+}} xmm0 = (xmm0 * xmm1) - xmm2616; BDVER2-NEXT: vfnmaddps {{.*#+}} xmm0 = -(xmm1 * xmm0) + xmm1617; BDVER2-NEXT: retq618;619; BTVER2-LABEL: v4f32_two_step:620; BTVER2: # %bb.0:621; BTVER2-NEXT: vmovaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]622; BTVER2-NEXT: vrcpps %xmm0, %xmm1623; BTVER2-NEXT: vmulps %xmm1, %xmm0, %xmm2624; BTVER2-NEXT: vsubps %xmm2, %xmm3, %xmm2625; BTVER2-NEXT: vmulps %xmm2, %xmm1, %xmm2626; BTVER2-NEXT: vaddps %xmm2, %xmm1, %xmm1627; BTVER2-NEXT: vmulps %xmm1, %xmm0, %xmm0628; BTVER2-NEXT: vsubps %xmm0, %xmm3, %xmm0629; BTVER2-NEXT: vmulps %xmm0, %xmm1, %xmm0630; BTVER2-NEXT: vaddps %xmm0, %xmm1, %xmm0631; BTVER2-NEXT: retq632;633; SANDY-LABEL: v4f32_two_step:634; SANDY: # %bb.0:635; SANDY-NEXT: vrcpps %xmm0, %xmm1636; SANDY-NEXT: vmulps %xmm1, %xmm0, %xmm2637; SANDY-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]638; SANDY-NEXT: vsubps %xmm2, %xmm3, %xmm2639; SANDY-NEXT: vmulps %xmm2, %xmm1, %xmm2640; SANDY-NEXT: vaddps %xmm2, %xmm1, %xmm1641; SANDY-NEXT: vmulps %xmm1, %xmm0, %xmm0642; SANDY-NEXT: vsubps %xmm0, %xmm3, %xmm0643; SANDY-NEXT: vmulps %xmm0, %xmm1, %xmm0644; SANDY-NEXT: vaddps %xmm0, %xmm1, %xmm0645; SANDY-NEXT: retq646;647; HASWELL-LABEL: v4f32_two_step:648; HASWELL: # %bb.0:649; HASWELL-NEXT: vrcpps %xmm0, %xmm1650; HASWELL-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]651; HASWELL-NEXT: vmovaps %xmm1, %xmm3652; HASWELL-NEXT: vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2653; HASWELL-NEXT: vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1654; HASWELL-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2655; HASWELL-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3656; HASWELL-NEXT: retq657;658; HASWELL-NO-FMA-LABEL: v4f32_two_step:659; HASWELL-NO-FMA: # %bb.0:660; HASWELL-NO-FMA-NEXT: vrcpps %xmm0, %xmm1661; HASWELL-NO-FMA-NEXT: vmulps %xmm1, %xmm0, %xmm2662; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]663; HASWELL-NO-FMA-NEXT: vsubps %xmm2, %xmm3, %xmm2664; HASWELL-NO-FMA-NEXT: vmulps %xmm2, %xmm1, %xmm2665; HASWELL-NO-FMA-NEXT: vaddps %xmm2, %xmm1, %xmm1666; HASWELL-NO-FMA-NEXT: vmulps %xmm1, %xmm0, %xmm0667; HASWELL-NO-FMA-NEXT: vsubps %xmm0, %xmm3, %xmm0668; HASWELL-NO-FMA-NEXT: vmulps %xmm0, %xmm1, %xmm0669; HASWELL-NO-FMA-NEXT: vaddps %xmm0, %xmm1, %xmm0670; HASWELL-NO-FMA-NEXT: retq671;672; AVX512-LABEL: v4f32_two_step:673; AVX512: # %bb.0:674; AVX512-NEXT: vrcpps %xmm0, %xmm1675; AVX512-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]676; AVX512-NEXT: vmovaps %xmm1, %xmm3677; AVX512-NEXT: vfmsub213ps {{.*#+}} xmm3 = (xmm0 * xmm3) - xmm2678; AVX512-NEXT: vfnmadd132ps {{.*#+}} xmm3 = -(xmm3 * xmm1) + xmm1679; AVX512-NEXT: vfmsub213ps {{.*#+}} xmm0 = (xmm3 * xmm0) - xmm2680; AVX512-NEXT: vfnmadd132ps {{.*#+}} xmm0 = -(xmm0 * xmm3) + xmm3681; AVX512-NEXT: retq682 %div = fdiv fast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>, %x683 ret <4 x float> %div684}685 686define <8 x float> @v8f32_no_estimate(<8 x float> %x) #0 {687; SSE-LABEL: v8f32_no_estimate:688; SSE: # %bb.0:689; SSE-NEXT: movaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]690; SSE-NEXT: movaps %xmm2, %xmm3691; SSE-NEXT: divps %xmm0, %xmm3692; SSE-NEXT: divps %xmm1, %xmm2693; SSE-NEXT: movaps %xmm3, %xmm0694; SSE-NEXT: movaps %xmm2, %xmm1695; SSE-NEXT: retq696;697; AVX-RECIP-LABEL: v8f32_no_estimate:698; AVX-RECIP: # %bb.0:699; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]700; AVX-RECIP-NEXT: vdivps %ymm0, %ymm1, %ymm0701; AVX-RECIP-NEXT: retq702;703; FMA-RECIP-LABEL: v8f32_no_estimate:704; FMA-RECIP: # %bb.0:705; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]706; FMA-RECIP-NEXT: vdivps %ymm0, %ymm1, %ymm0707; FMA-RECIP-NEXT: retq708;709; BDVER2-LABEL: v8f32_no_estimate:710; BDVER2: # %bb.0:711; BDVER2-NEXT: vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]712; BDVER2-NEXT: vdivps %ymm0, %ymm1, %ymm0713; BDVER2-NEXT: retq714;715; BTVER2-LABEL: v8f32_no_estimate:716; BTVER2: # %bb.0:717; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]718; BTVER2-NEXT: vdivps %ymm0, %ymm1, %ymm0719; BTVER2-NEXT: retq720;721; SANDY-LABEL: v8f32_no_estimate:722; SANDY: # %bb.0:723; SANDY-NEXT: vmovaps {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]724; SANDY-NEXT: vdivps %ymm0, %ymm1, %ymm0725; SANDY-NEXT: retq726;727; HASWELL-LABEL: v8f32_no_estimate:728; HASWELL: # %bb.0:729; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]730; HASWELL-NEXT: vdivps %ymm0, %ymm1, %ymm0731; HASWELL-NEXT: retq732;733; HASWELL-NO-FMA-LABEL: v8f32_no_estimate:734; HASWELL-NO-FMA: # %bb.0:735; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]736; HASWELL-NO-FMA-NEXT: vdivps %ymm0, %ymm1, %ymm0737; HASWELL-NO-FMA-NEXT: retq738;739; AVX512-LABEL: v8f32_no_estimate:740; AVX512: # %bb.0:741; AVX512-NEXT: vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]742; AVX512-NEXT: vdivps %ymm0, %ymm1, %ymm0743; AVX512-NEXT: retq744 %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x745 ret <8 x float> %div746}747 748define <8 x float> @v8f32_one_step(<8 x float> %x) #1 {749; SSE-LABEL: v8f32_one_step:750; SSE: # %bb.0:751; SSE-NEXT: rcpps %xmm0, %xmm4752; SSE-NEXT: mulps %xmm4, %xmm0753; SSE-NEXT: movaps {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]754; SSE-NEXT: movaps %xmm2, %xmm3755; SSE-NEXT: subps %xmm0, %xmm3756; SSE-NEXT: mulps %xmm4, %xmm3757; SSE-NEXT: addps %xmm4, %xmm3758; SSE-NEXT: rcpps %xmm1, %xmm0759; SSE-NEXT: mulps %xmm0, %xmm1760; SSE-NEXT: subps %xmm1, %xmm2761; SSE-NEXT: mulps %xmm0, %xmm2762; SSE-NEXT: addps %xmm0, %xmm2763; SSE-NEXT: movaps %xmm3, %xmm0764; SSE-NEXT: movaps %xmm2, %xmm1765; SSE-NEXT: retq766;767; AVX-RECIP-LABEL: v8f32_one_step:768; AVX-RECIP: # %bb.0:769; AVX-RECIP-NEXT: vrcpps %ymm0, %ymm1770; AVX-RECIP-NEXT: vmulps %ymm1, %ymm0, %ymm0771; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]772; AVX-RECIP-NEXT: vsubps %ymm0, %ymm2, %ymm0773; AVX-RECIP-NEXT: vmulps %ymm0, %ymm1, %ymm0774; AVX-RECIP-NEXT: vaddps %ymm0, %ymm1, %ymm0775; AVX-RECIP-NEXT: retq776;777; FMA-RECIP-LABEL: v8f32_one_step:778; FMA-RECIP: # %bb.0:779; FMA-RECIP-NEXT: vrcpps %ymm0, %ymm1780; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - mem781; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1782; FMA-RECIP-NEXT: retq783;784; BDVER2-LABEL: v8f32_one_step:785; BDVER2: # %bb.0:786; BDVER2-NEXT: vrcpps %ymm0, %ymm1787; BDVER2-NEXT: vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm1) - mem788; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm0 = -(ymm1 * ymm0) + ymm1789; BDVER2-NEXT: retq790;791; BTVER2-LABEL: v8f32_one_step:792; BTVER2: # %bb.0:793; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]794; BTVER2-NEXT: vrcpps %ymm0, %ymm1795; BTVER2-NEXT: vmulps %ymm1, %ymm0, %ymm0796; BTVER2-NEXT: vsubps %ymm0, %ymm2, %ymm0797; BTVER2-NEXT: vmulps %ymm0, %ymm1, %ymm0798; BTVER2-NEXT: vaddps %ymm0, %ymm1, %ymm0799; BTVER2-NEXT: retq800;801; SANDY-LABEL: v8f32_one_step:802; SANDY: # %bb.0:803; SANDY-NEXT: vrcpps %ymm0, %ymm1804; SANDY-NEXT: vmulps %ymm1, %ymm0, %ymm0805; SANDY-NEXT: vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]806; SANDY-NEXT: vsubps %ymm0, %ymm2, %ymm0807; SANDY-NEXT: vmulps %ymm0, %ymm1, %ymm0808; SANDY-NEXT: vaddps %ymm0, %ymm1, %ymm0809; SANDY-NEXT: retq810;811; HASWELL-LABEL: v8f32_one_step:812; HASWELL: # %bb.0:813; HASWELL-NEXT: vrcpps %ymm0, %ymm1814; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]815; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2816; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1817; HASWELL-NEXT: retq818;819; HASWELL-NO-FMA-LABEL: v8f32_one_step:820; HASWELL-NO-FMA: # %bb.0:821; HASWELL-NO-FMA-NEXT: vrcpps %ymm0, %ymm1822; HASWELL-NO-FMA-NEXT: vmulps %ymm1, %ymm0, %ymm0823; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]824; HASWELL-NO-FMA-NEXT: vsubps %ymm0, %ymm2, %ymm0825; HASWELL-NO-FMA-NEXT: vmulps %ymm0, %ymm1, %ymm0826; HASWELL-NO-FMA-NEXT: vaddps %ymm0, %ymm1, %ymm0827; HASWELL-NO-FMA-NEXT: retq828;829; KNL-LABEL: v8f32_one_step:830; KNL: # %bb.0:831; KNL-NEXT: vrcpps %ymm0, %ymm1832; KNL-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]833; KNL-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - ymm2834; KNL-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1835; KNL-NEXT: retq836;837; SKX-LABEL: v8f32_one_step:838; SKX: # %bb.0:839; SKX-NEXT: vrcpps %ymm0, %ymm1840; SKX-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm1 * ymm0) - mem841; SKX-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm1) + ymm1842; SKX-NEXT: retq843 %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x844 ret <8 x float> %div845}846 847define <8 x float> @v8f32_two_step(<8 x float> %x) #2 {848; SSE-LABEL: v8f32_two_step:849; SSE: # %bb.0:850; SSE-NEXT: movaps %xmm1, %xmm2851; SSE-NEXT: rcpps %xmm0, %xmm3852; SSE-NEXT: movaps %xmm0, %xmm4853; SSE-NEXT: mulps %xmm3, %xmm4854; SSE-NEXT: movaps {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]855; SSE-NEXT: movaps %xmm1, %xmm5856; SSE-NEXT: subps %xmm4, %xmm5857; SSE-NEXT: mulps %xmm3, %xmm5858; SSE-NEXT: addps %xmm3, %xmm5859; SSE-NEXT: mulps %xmm5, %xmm0860; SSE-NEXT: movaps %xmm1, %xmm3861; SSE-NEXT: subps %xmm0, %xmm3862; SSE-NEXT: mulps %xmm5, %xmm3863; SSE-NEXT: addps %xmm5, %xmm3864; SSE-NEXT: rcpps %xmm2, %xmm0865; SSE-NEXT: movaps %xmm2, %xmm4866; SSE-NEXT: mulps %xmm0, %xmm4867; SSE-NEXT: movaps %xmm1, %xmm5868; SSE-NEXT: subps %xmm4, %xmm5869; SSE-NEXT: mulps %xmm0, %xmm5870; SSE-NEXT: addps %xmm0, %xmm5871; SSE-NEXT: mulps %xmm5, %xmm2872; SSE-NEXT: subps %xmm2, %xmm1873; SSE-NEXT: mulps %xmm5, %xmm1874; SSE-NEXT: addps %xmm5, %xmm1875; SSE-NEXT: movaps %xmm3, %xmm0876; SSE-NEXT: retq877;878; AVX-RECIP-LABEL: v8f32_two_step:879; AVX-RECIP: # %bb.0:880; AVX-RECIP-NEXT: vrcpps %ymm0, %ymm1881; AVX-RECIP-NEXT: vmulps %ymm1, %ymm0, %ymm2882; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]883; AVX-RECIP-NEXT: vsubps %ymm2, %ymm3, %ymm2884; AVX-RECIP-NEXT: vmulps %ymm2, %ymm1, %ymm2885; AVX-RECIP-NEXT: vaddps %ymm2, %ymm1, %ymm1886; AVX-RECIP-NEXT: vmulps %ymm1, %ymm0, %ymm0887; AVX-RECIP-NEXT: vsubps %ymm0, %ymm3, %ymm0888; AVX-RECIP-NEXT: vmulps %ymm0, %ymm1, %ymm0889; AVX-RECIP-NEXT: vaddps %ymm0, %ymm1, %ymm0890; AVX-RECIP-NEXT: retq891;892; FMA-RECIP-LABEL: v8f32_two_step:893; FMA-RECIP: # %bb.0:894; FMA-RECIP-NEXT: vrcpps %ymm0, %ymm1895; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]896; FMA-RECIP-NEXT: vmovaps %ymm1, %ymm3897; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2898; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1899; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2900; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3901; FMA-RECIP-NEXT: retq902;903; BDVER2-LABEL: v8f32_two_step:904; BDVER2: # %bb.0:905; BDVER2-NEXT: vrcpps %ymm0, %ymm1906; BDVER2-NEXT: vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]907; BDVER2-NEXT: vfmsubps {{.*#+}} ymm3 = (ymm0 * ymm1) - ymm2908; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm1 = -(ymm1 * ymm3) + ymm1909; BDVER2-NEXT: vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm1) - ymm2910; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm0 = -(ymm1 * ymm0) + ymm1911; BDVER2-NEXT: retq912;913; BTVER2-LABEL: v8f32_two_step:914; BTVER2: # %bb.0:915; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]916; BTVER2-NEXT: vrcpps %ymm0, %ymm1917; BTVER2-NEXT: vmulps %ymm1, %ymm0, %ymm2918; BTVER2-NEXT: vsubps %ymm2, %ymm3, %ymm2919; BTVER2-NEXT: vmulps %ymm2, %ymm1, %ymm2920; BTVER2-NEXT: vaddps %ymm2, %ymm1, %ymm1921; BTVER2-NEXT: vmulps %ymm1, %ymm0, %ymm0922; BTVER2-NEXT: vsubps %ymm0, %ymm3, %ymm0923; BTVER2-NEXT: vmulps %ymm0, %ymm1, %ymm0924; BTVER2-NEXT: vaddps %ymm0, %ymm1, %ymm0925; BTVER2-NEXT: retq926;927; SANDY-LABEL: v8f32_two_step:928; SANDY: # %bb.0:929; SANDY-NEXT: vrcpps %ymm0, %ymm1930; SANDY-NEXT: vmulps %ymm1, %ymm0, %ymm2931; SANDY-NEXT: vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]932; SANDY-NEXT: vsubps %ymm2, %ymm3, %ymm2933; SANDY-NEXT: vmulps %ymm2, %ymm1, %ymm2934; SANDY-NEXT: vaddps %ymm2, %ymm1, %ymm1935; SANDY-NEXT: vmulps %ymm1, %ymm0, %ymm0936; SANDY-NEXT: vsubps %ymm0, %ymm3, %ymm0937; SANDY-NEXT: vmulps %ymm0, %ymm1, %ymm0938; SANDY-NEXT: vaddps %ymm0, %ymm1, %ymm0939; SANDY-NEXT: retq940;941; HASWELL-LABEL: v8f32_two_step:942; HASWELL: # %bb.0:943; HASWELL-NEXT: vrcpps %ymm0, %ymm1944; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]945; HASWELL-NEXT: vmovaps %ymm1, %ymm3946; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2947; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1948; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2949; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3950; HASWELL-NEXT: retq951;952; HASWELL-NO-FMA-LABEL: v8f32_two_step:953; HASWELL-NO-FMA: # %bb.0:954; HASWELL-NO-FMA-NEXT: vrcpps %ymm0, %ymm1955; HASWELL-NO-FMA-NEXT: vmulps %ymm1, %ymm0, %ymm2956; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]957; HASWELL-NO-FMA-NEXT: vsubps %ymm2, %ymm3, %ymm2958; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm1, %ymm2959; HASWELL-NO-FMA-NEXT: vaddps %ymm2, %ymm1, %ymm1960; HASWELL-NO-FMA-NEXT: vmulps %ymm1, %ymm0, %ymm0961; HASWELL-NO-FMA-NEXT: vsubps %ymm0, %ymm3, %ymm0962; HASWELL-NO-FMA-NEXT: vmulps %ymm0, %ymm1, %ymm0963; HASWELL-NO-FMA-NEXT: vaddps %ymm0, %ymm1, %ymm0964; HASWELL-NO-FMA-NEXT: retq965;966; AVX512-LABEL: v8f32_two_step:967; AVX512: # %bb.0:968; AVX512-NEXT: vrcpps %ymm0, %ymm1969; AVX512-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]970; AVX512-NEXT: vmovaps %ymm1, %ymm3971; AVX512-NEXT: vfmsub213ps {{.*#+}} ymm3 = (ymm0 * ymm3) - ymm2972; AVX512-NEXT: vfnmadd132ps {{.*#+}} ymm3 = -(ymm3 * ymm1) + ymm1973; AVX512-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm3 * ymm0) - ymm2974; AVX512-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm3) + ymm3975; AVX512-NEXT: retq976 %div = fdiv fast <8 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x977 ret <8 x float> %div978}979 980define <16 x float> @v16f32_no_estimate(<16 x float> %x) #0 {981; SSE-LABEL: v16f32_no_estimate:982; SSE: # %bb.0:983; SSE-NEXT: movaps {{.*#+}} xmm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]984; SSE-NEXT: movaps %xmm4, %xmm5985; SSE-NEXT: divps %xmm0, %xmm5986; SSE-NEXT: movaps %xmm4, %xmm6987; SSE-NEXT: divps %xmm1, %xmm6988; SSE-NEXT: movaps %xmm4, %xmm7989; SSE-NEXT: divps %xmm2, %xmm7990; SSE-NEXT: divps %xmm3, %xmm4991; SSE-NEXT: movaps %xmm5, %xmm0992; SSE-NEXT: movaps %xmm6, %xmm1993; SSE-NEXT: movaps %xmm7, %xmm2994; SSE-NEXT: movaps %xmm4, %xmm3995; SSE-NEXT: retq996;997; AVX-RECIP-LABEL: v16f32_no_estimate:998; AVX-RECIP: # %bb.0:999; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1000; AVX-RECIP-NEXT: vdivps %ymm0, %ymm2, %ymm01001; AVX-RECIP-NEXT: vdivps %ymm1, %ymm2, %ymm11002; AVX-RECIP-NEXT: retq1003;1004; FMA-RECIP-LABEL: v16f32_no_estimate:1005; FMA-RECIP: # %bb.0:1006; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1007; FMA-RECIP-NEXT: vdivps %ymm0, %ymm2, %ymm01008; FMA-RECIP-NEXT: vdivps %ymm1, %ymm2, %ymm11009; FMA-RECIP-NEXT: retq1010;1011; BDVER2-LABEL: v16f32_no_estimate:1012; BDVER2: # %bb.0:1013; BDVER2-NEXT: vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1014; BDVER2-NEXT: vdivps %ymm0, %ymm2, %ymm01015; BDVER2-NEXT: vdivps %ymm1, %ymm2, %ymm11016; BDVER2-NEXT: retq1017;1018; BTVER2-LABEL: v16f32_no_estimate:1019; BTVER2: # %bb.0:1020; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1021; BTVER2-NEXT: vdivps %ymm0, %ymm2, %ymm01022; BTVER2-NEXT: vdivps %ymm1, %ymm2, %ymm11023; BTVER2-NEXT: retq1024;1025; SANDY-LABEL: v16f32_no_estimate:1026; SANDY: # %bb.0:1027; SANDY-NEXT: vmovaps {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1028; SANDY-NEXT: vdivps %ymm0, %ymm2, %ymm01029; SANDY-NEXT: vdivps %ymm1, %ymm2, %ymm11030; SANDY-NEXT: retq1031;1032; HASWELL-LABEL: v16f32_no_estimate:1033; HASWELL: # %bb.0:1034; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1035; HASWELL-NEXT: vdivps %ymm0, %ymm2, %ymm01036; HASWELL-NEXT: vdivps %ymm1, %ymm2, %ymm11037; HASWELL-NEXT: retq1038;1039; HASWELL-NO-FMA-LABEL: v16f32_no_estimate:1040; HASWELL-NO-FMA: # %bb.0:1041; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1042; HASWELL-NO-FMA-NEXT: vdivps %ymm0, %ymm2, %ymm01043; HASWELL-NO-FMA-NEXT: vdivps %ymm1, %ymm2, %ymm11044; HASWELL-NO-FMA-NEXT: retq1045;1046; AVX512-LABEL: v16f32_no_estimate:1047; AVX512: # %bb.0:1048; AVX512-NEXT: vbroadcastss {{.*#+}} zmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1049; AVX512-NEXT: vdivps %zmm0, %zmm1, %zmm01050; AVX512-NEXT: retq1051 %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x1052 ret <16 x float> %div1053}1054 1055define <16 x float> @v16f32_one_step(<16 x float> %x) #1 {1056; SSE-LABEL: v16f32_one_step:1057; SSE: # %bb.0:1058; SSE-NEXT: movaps %xmm3, %xmm41059; SSE-NEXT: movaps %xmm0, %xmm51060; SSE-NEXT: rcpps %xmm0, %xmm61061; SSE-NEXT: mulps %xmm6, %xmm51062; SSE-NEXT: movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]1063; SSE-NEXT: movaps %xmm3, %xmm01064; SSE-NEXT: subps %xmm5, %xmm01065; SSE-NEXT: mulps %xmm6, %xmm01066; SSE-NEXT: addps %xmm6, %xmm01067; SSE-NEXT: rcpps %xmm1, %xmm61068; SSE-NEXT: mulps %xmm6, %xmm11069; SSE-NEXT: movaps %xmm3, %xmm51070; SSE-NEXT: subps %xmm1, %xmm51071; SSE-NEXT: mulps %xmm6, %xmm51072; SSE-NEXT: addps %xmm6, %xmm51073; SSE-NEXT: rcpps %xmm2, %xmm11074; SSE-NEXT: mulps %xmm1, %xmm21075; SSE-NEXT: movaps %xmm3, %xmm61076; SSE-NEXT: subps %xmm2, %xmm61077; SSE-NEXT: mulps %xmm1, %xmm61078; SSE-NEXT: addps %xmm1, %xmm61079; SSE-NEXT: rcpps %xmm4, %xmm11080; SSE-NEXT: mulps %xmm1, %xmm41081; SSE-NEXT: subps %xmm4, %xmm31082; SSE-NEXT: mulps %xmm1, %xmm31083; SSE-NEXT: addps %xmm1, %xmm31084; SSE-NEXT: movaps %xmm5, %xmm11085; SSE-NEXT: movaps %xmm6, %xmm21086; SSE-NEXT: retq1087;1088; AVX-RECIP-LABEL: v16f32_one_step:1089; AVX-RECIP: # %bb.0:1090; AVX-RECIP-NEXT: vrcpps %ymm0, %ymm21091; AVX-RECIP-NEXT: vmulps %ymm2, %ymm0, %ymm01092; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1093; AVX-RECIP-NEXT: vsubps %ymm0, %ymm3, %ymm01094; AVX-RECIP-NEXT: vmulps %ymm0, %ymm2, %ymm01095; AVX-RECIP-NEXT: vaddps %ymm0, %ymm2, %ymm01096; AVX-RECIP-NEXT: vrcpps %ymm1, %ymm21097; AVX-RECIP-NEXT: vmulps %ymm2, %ymm1, %ymm11098; AVX-RECIP-NEXT: vsubps %ymm1, %ymm3, %ymm11099; AVX-RECIP-NEXT: vmulps %ymm1, %ymm2, %ymm11100; AVX-RECIP-NEXT: vaddps %ymm1, %ymm2, %ymm11101; AVX-RECIP-NEXT: retq1102;1103; FMA-RECIP-LABEL: v16f32_one_step:1104; FMA-RECIP: # %bb.0:1105; FMA-RECIP-NEXT: vrcpps %ymm0, %ymm21106; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1107; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm2 * ymm0) - ymm31108; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm2) + ymm21109; FMA-RECIP-NEXT: vrcpps %ymm1, %ymm21110; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm1 = (ymm2 * ymm1) - ymm31111; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm2) + ymm21112; FMA-RECIP-NEXT: retq1113;1114; BDVER2-LABEL: v16f32_one_step:1115; BDVER2: # %bb.0:1116; BDVER2-NEXT: vrcpps %ymm0, %ymm21117; BDVER2-NEXT: vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1118; BDVER2-NEXT: vrcpps %ymm1, %ymm41119; BDVER2-NEXT: vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm2) - ymm31120; BDVER2-NEXT: vfmsubps {{.*#+}} ymm1 = (ymm1 * ymm4) - ymm31121; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm0 = -(ymm2 * ymm0) + ymm21122; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm1 = -(ymm4 * ymm1) + ymm41123; BDVER2-NEXT: retq1124;1125; BTVER2-LABEL: v16f32_one_step:1126; BTVER2: # %bb.0:1127; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1128; BTVER2-NEXT: vrcpps %ymm0, %ymm21129; BTVER2-NEXT: vrcpps %ymm1, %ymm41130; BTVER2-NEXT: vmulps %ymm2, %ymm0, %ymm01131; BTVER2-NEXT: vmulps %ymm4, %ymm1, %ymm11132; BTVER2-NEXT: vsubps %ymm0, %ymm3, %ymm01133; BTVER2-NEXT: vsubps %ymm1, %ymm3, %ymm11134; BTVER2-NEXT: vmulps %ymm0, %ymm2, %ymm01135; BTVER2-NEXT: vmulps %ymm1, %ymm4, %ymm11136; BTVER2-NEXT: vaddps %ymm0, %ymm2, %ymm01137; BTVER2-NEXT: vaddps %ymm1, %ymm4, %ymm11138; BTVER2-NEXT: retq1139;1140; SANDY-LABEL: v16f32_one_step:1141; SANDY: # %bb.0:1142; SANDY-NEXT: vrcpps %ymm0, %ymm21143; SANDY-NEXT: vmulps %ymm2, %ymm0, %ymm01144; SANDY-NEXT: vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1145; SANDY-NEXT: vsubps %ymm0, %ymm3, %ymm01146; SANDY-NEXT: vrcpps %ymm1, %ymm41147; SANDY-NEXT: vmulps %ymm0, %ymm2, %ymm01148; SANDY-NEXT: vaddps %ymm0, %ymm2, %ymm01149; SANDY-NEXT: vmulps %ymm4, %ymm1, %ymm11150; SANDY-NEXT: vsubps %ymm1, %ymm3, %ymm11151; SANDY-NEXT: vmulps %ymm1, %ymm4, %ymm11152; SANDY-NEXT: vaddps %ymm1, %ymm4, %ymm11153; SANDY-NEXT: retq1154;1155; HASWELL-LABEL: v16f32_one_step:1156; HASWELL: # %bb.0:1157; HASWELL-NEXT: vrcpps %ymm0, %ymm21158; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1159; HASWELL-NEXT: vrcpps %ymm1, %ymm41160; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm2 * ymm0) - ymm31161; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm2) + ymm21162; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm31163; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm41164; HASWELL-NEXT: retq1165;1166; HASWELL-NO-FMA-LABEL: v16f32_one_step:1167; HASWELL-NO-FMA: # %bb.0:1168; HASWELL-NO-FMA-NEXT: vrcpps %ymm0, %ymm21169; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm0, %ymm01170; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1171; HASWELL-NO-FMA-NEXT: vsubps %ymm0, %ymm3, %ymm01172; HASWELL-NO-FMA-NEXT: vmulps %ymm0, %ymm2, %ymm01173; HASWELL-NO-FMA-NEXT: vaddps %ymm0, %ymm2, %ymm01174; HASWELL-NO-FMA-NEXT: vrcpps %ymm1, %ymm21175; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm1, %ymm11176; HASWELL-NO-FMA-NEXT: vsubps %ymm1, %ymm3, %ymm11177; HASWELL-NO-FMA-NEXT: vmulps %ymm1, %ymm2, %ymm11178; HASWELL-NO-FMA-NEXT: vaddps %ymm1, %ymm2, %ymm11179; HASWELL-NO-FMA-NEXT: retq1180;1181; AVX512-LABEL: v16f32_one_step:1182; AVX512: # %bb.0:1183; AVX512-NEXT: vrcp14ps %zmm0, %zmm11184; AVX512-NEXT: vfmsub213ps {{.*#+}} zmm0 = (zmm1 * zmm0) - mem1185; AVX512-NEXT: vfnmadd132ps {{.*#+}} zmm0 = -(zmm0 * zmm1) + zmm11186; AVX512-NEXT: retq1187 %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x1188 ret <16 x float> %div1189}1190 1191define <16 x float> @v16f32_two_step(<16 x float> %x) #2 {1192; SSE-LABEL: v16f32_two_step:1193; SSE: # %bb.0:1194; SSE-NEXT: movaps %xmm3, %xmm41195; SSE-NEXT: movaps %xmm1, %xmm51196; SSE-NEXT: movaps %xmm0, %xmm11197; SSE-NEXT: rcpps %xmm0, %xmm01198; SSE-NEXT: movaps %xmm1, %xmm61199; SSE-NEXT: mulps %xmm0, %xmm61200; SSE-NEXT: movaps {{.*#+}} xmm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]1201; SSE-NEXT: movaps %xmm3, %xmm71202; SSE-NEXT: subps %xmm6, %xmm71203; SSE-NEXT: mulps %xmm0, %xmm71204; SSE-NEXT: addps %xmm0, %xmm71205; SSE-NEXT: mulps %xmm7, %xmm11206; SSE-NEXT: movaps %xmm3, %xmm01207; SSE-NEXT: subps %xmm1, %xmm01208; SSE-NEXT: mulps %xmm7, %xmm01209; SSE-NEXT: addps %xmm7, %xmm01210; SSE-NEXT: rcpps %xmm5, %xmm11211; SSE-NEXT: movaps %xmm5, %xmm61212; SSE-NEXT: mulps %xmm1, %xmm61213; SSE-NEXT: movaps %xmm3, %xmm71214; SSE-NEXT: subps %xmm6, %xmm71215; SSE-NEXT: mulps %xmm1, %xmm71216; SSE-NEXT: addps %xmm1, %xmm71217; SSE-NEXT: mulps %xmm7, %xmm51218; SSE-NEXT: movaps %xmm3, %xmm11219; SSE-NEXT: subps %xmm5, %xmm11220; SSE-NEXT: mulps %xmm7, %xmm11221; SSE-NEXT: addps %xmm7, %xmm11222; SSE-NEXT: rcpps %xmm2, %xmm51223; SSE-NEXT: movaps %xmm2, %xmm61224; SSE-NEXT: mulps %xmm5, %xmm61225; SSE-NEXT: movaps %xmm3, %xmm71226; SSE-NEXT: subps %xmm6, %xmm71227; SSE-NEXT: mulps %xmm5, %xmm71228; SSE-NEXT: addps %xmm5, %xmm71229; SSE-NEXT: mulps %xmm7, %xmm21230; SSE-NEXT: movaps %xmm3, %xmm51231; SSE-NEXT: subps %xmm2, %xmm51232; SSE-NEXT: mulps %xmm7, %xmm51233; SSE-NEXT: addps %xmm7, %xmm51234; SSE-NEXT: rcpps %xmm4, %xmm21235; SSE-NEXT: movaps %xmm4, %xmm61236; SSE-NEXT: mulps %xmm2, %xmm61237; SSE-NEXT: movaps %xmm3, %xmm71238; SSE-NEXT: subps %xmm6, %xmm71239; SSE-NEXT: mulps %xmm2, %xmm71240; SSE-NEXT: addps %xmm2, %xmm71241; SSE-NEXT: mulps %xmm7, %xmm41242; SSE-NEXT: subps %xmm4, %xmm31243; SSE-NEXT: mulps %xmm7, %xmm31244; SSE-NEXT: addps %xmm7, %xmm31245; SSE-NEXT: movaps %xmm5, %xmm21246; SSE-NEXT: retq1247;1248; AVX-RECIP-LABEL: v16f32_two_step:1249; AVX-RECIP: # %bb.0:1250; AVX-RECIP-NEXT: vrcpps %ymm0, %ymm21251; AVX-RECIP-NEXT: vmulps %ymm2, %ymm0, %ymm31252; AVX-RECIP-NEXT: vbroadcastss {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1253; AVX-RECIP-NEXT: vsubps %ymm3, %ymm4, %ymm31254; AVX-RECIP-NEXT: vmulps %ymm3, %ymm2, %ymm31255; AVX-RECIP-NEXT: vaddps %ymm3, %ymm2, %ymm21256; AVX-RECIP-NEXT: vmulps %ymm2, %ymm0, %ymm01257; AVX-RECIP-NEXT: vsubps %ymm0, %ymm4, %ymm01258; AVX-RECIP-NEXT: vmulps %ymm0, %ymm2, %ymm01259; AVX-RECIP-NEXT: vaddps %ymm0, %ymm2, %ymm01260; AVX-RECIP-NEXT: vrcpps %ymm1, %ymm21261; AVX-RECIP-NEXT: vmulps %ymm2, %ymm1, %ymm31262; AVX-RECIP-NEXT: vsubps %ymm3, %ymm4, %ymm31263; AVX-RECIP-NEXT: vmulps %ymm3, %ymm2, %ymm31264; AVX-RECIP-NEXT: vaddps %ymm3, %ymm2, %ymm21265; AVX-RECIP-NEXT: vmulps %ymm2, %ymm1, %ymm11266; AVX-RECIP-NEXT: vsubps %ymm1, %ymm4, %ymm11267; AVX-RECIP-NEXT: vmulps %ymm1, %ymm2, %ymm11268; AVX-RECIP-NEXT: vaddps %ymm1, %ymm2, %ymm11269; AVX-RECIP-NEXT: retq1270;1271; FMA-RECIP-LABEL: v16f32_two_step:1272; FMA-RECIP: # %bb.0:1273; FMA-RECIP-NEXT: vrcpps %ymm0, %ymm21274; FMA-RECIP-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1275; FMA-RECIP-NEXT: vmovaps %ymm2, %ymm41276; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm4 = (ymm0 * ymm4) - ymm31277; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm21278; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm4 * ymm0) - ymm31279; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm4) + ymm41280; FMA-RECIP-NEXT: vrcpps %ymm1, %ymm21281; FMA-RECIP-NEXT: vmovaps %ymm2, %ymm41282; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm4 = (ymm1 * ymm4) - ymm31283; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm21284; FMA-RECIP-NEXT: vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm31285; FMA-RECIP-NEXT: vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm41286; FMA-RECIP-NEXT: retq1287;1288; BDVER2-LABEL: v16f32_two_step:1289; BDVER2: # %bb.0:1290; BDVER2-NEXT: vrcpps %ymm0, %ymm21291; BDVER2-NEXT: vmovaps {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1292; BDVER2-NEXT: vfmsubps {{.*#+}} ymm4 = (ymm0 * ymm2) - ymm31293; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm2 = -(ymm2 * ymm4) + ymm21294; BDVER2-NEXT: vfmsubps {{.*#+}} ymm0 = (ymm0 * ymm2) - ymm31295; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm0 = -(ymm2 * ymm0) + ymm21296; BDVER2-NEXT: vrcpps %ymm1, %ymm21297; BDVER2-NEXT: vfmsubps {{.*#+}} ymm4 = (ymm1 * ymm2) - ymm31298; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm2 = -(ymm2 * ymm4) + ymm21299; BDVER2-NEXT: vfmsubps {{.*#+}} ymm1 = (ymm1 * ymm2) - ymm31300; BDVER2-NEXT: vfnmaddps {{.*#+}} ymm1 = -(ymm2 * ymm1) + ymm21301; BDVER2-NEXT: retq1302;1303; BTVER2-LABEL: v16f32_two_step:1304; BTVER2: # %bb.0:1305; BTVER2-NEXT: vbroadcastss {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1306; BTVER2-NEXT: vrcpps %ymm0, %ymm21307; BTVER2-NEXT: vmulps %ymm2, %ymm0, %ymm31308; BTVER2-NEXT: vsubps %ymm3, %ymm4, %ymm31309; BTVER2-NEXT: vmulps %ymm3, %ymm2, %ymm31310; BTVER2-NEXT: vaddps %ymm3, %ymm2, %ymm21311; BTVER2-NEXT: vmulps %ymm2, %ymm0, %ymm01312; BTVER2-NEXT: vsubps %ymm0, %ymm4, %ymm01313; BTVER2-NEXT: vmulps %ymm0, %ymm2, %ymm01314; BTVER2-NEXT: vaddps %ymm0, %ymm2, %ymm01315; BTVER2-NEXT: vrcpps %ymm1, %ymm21316; BTVER2-NEXT: vmulps %ymm2, %ymm1, %ymm31317; BTVER2-NEXT: vsubps %ymm3, %ymm4, %ymm31318; BTVER2-NEXT: vmulps %ymm3, %ymm2, %ymm31319; BTVER2-NEXT: vaddps %ymm3, %ymm2, %ymm21320; BTVER2-NEXT: vmulps %ymm2, %ymm1, %ymm11321; BTVER2-NEXT: vsubps %ymm1, %ymm4, %ymm11322; BTVER2-NEXT: vmulps %ymm1, %ymm2, %ymm11323; BTVER2-NEXT: vaddps %ymm1, %ymm2, %ymm11324; BTVER2-NEXT: retq1325;1326; SANDY-LABEL: v16f32_two_step:1327; SANDY: # %bb.0:1328; SANDY-NEXT: vrcpps %ymm0, %ymm21329; SANDY-NEXT: vmulps %ymm2, %ymm0, %ymm31330; SANDY-NEXT: vmovaps {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1331; SANDY-NEXT: vsubps %ymm3, %ymm4, %ymm31332; SANDY-NEXT: vmulps %ymm3, %ymm2, %ymm31333; SANDY-NEXT: vaddps %ymm3, %ymm2, %ymm21334; SANDY-NEXT: vmulps %ymm2, %ymm0, %ymm01335; SANDY-NEXT: vsubps %ymm0, %ymm4, %ymm01336; SANDY-NEXT: vrcpps %ymm1, %ymm31337; SANDY-NEXT: vmulps %ymm0, %ymm2, %ymm01338; SANDY-NEXT: vaddps %ymm0, %ymm2, %ymm01339; SANDY-NEXT: vmulps %ymm3, %ymm1, %ymm21340; SANDY-NEXT: vsubps %ymm2, %ymm4, %ymm21341; SANDY-NEXT: vmulps %ymm2, %ymm3, %ymm21342; SANDY-NEXT: vaddps %ymm2, %ymm3, %ymm21343; SANDY-NEXT: vmulps %ymm2, %ymm1, %ymm11344; SANDY-NEXT: vsubps %ymm1, %ymm4, %ymm11345; SANDY-NEXT: vmulps %ymm1, %ymm2, %ymm11346; SANDY-NEXT: vaddps %ymm1, %ymm2, %ymm11347; SANDY-NEXT: retq1348;1349; HASWELL-LABEL: v16f32_two_step:1350; HASWELL: # %bb.0:1351; HASWELL-NEXT: vrcpps %ymm0, %ymm21352; HASWELL-NEXT: vbroadcastss {{.*#+}} ymm3 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1353; HASWELL-NEXT: vmovaps %ymm2, %ymm41354; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm4 = (ymm0 * ymm4) - ymm31355; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm21356; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm0 = (ymm4 * ymm0) - ymm31357; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm0 = -(ymm0 * ymm4) + ymm41358; HASWELL-NEXT: vrcpps %ymm1, %ymm21359; HASWELL-NEXT: vmovaps %ymm2, %ymm41360; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm4 = (ymm1 * ymm4) - ymm31361; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm4 = -(ymm4 * ymm2) + ymm21362; HASWELL-NEXT: vfmsub213ps {{.*#+}} ymm1 = (ymm4 * ymm1) - ymm31363; HASWELL-NEXT: vfnmadd132ps {{.*#+}} ymm1 = -(ymm1 * ymm4) + ymm41364; HASWELL-NEXT: retq1365;1366; HASWELL-NO-FMA-LABEL: v16f32_two_step:1367; HASWELL-NO-FMA: # %bb.0:1368; HASWELL-NO-FMA-NEXT: vrcpps %ymm0, %ymm21369; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm0, %ymm31370; HASWELL-NO-FMA-NEXT: vbroadcastss {{.*#+}} ymm4 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1371; HASWELL-NO-FMA-NEXT: vsubps %ymm3, %ymm4, %ymm31372; HASWELL-NO-FMA-NEXT: vmulps %ymm3, %ymm2, %ymm31373; HASWELL-NO-FMA-NEXT: vaddps %ymm3, %ymm2, %ymm21374; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm0, %ymm01375; HASWELL-NO-FMA-NEXT: vsubps %ymm0, %ymm4, %ymm01376; HASWELL-NO-FMA-NEXT: vmulps %ymm0, %ymm2, %ymm01377; HASWELL-NO-FMA-NEXT: vaddps %ymm0, %ymm2, %ymm01378; HASWELL-NO-FMA-NEXT: vrcpps %ymm1, %ymm21379; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm1, %ymm31380; HASWELL-NO-FMA-NEXT: vsubps %ymm3, %ymm4, %ymm31381; HASWELL-NO-FMA-NEXT: vmulps %ymm3, %ymm2, %ymm31382; HASWELL-NO-FMA-NEXT: vaddps %ymm3, %ymm2, %ymm21383; HASWELL-NO-FMA-NEXT: vmulps %ymm2, %ymm1, %ymm11384; HASWELL-NO-FMA-NEXT: vsubps %ymm1, %ymm4, %ymm11385; HASWELL-NO-FMA-NEXT: vmulps %ymm1, %ymm2, %ymm11386; HASWELL-NO-FMA-NEXT: vaddps %ymm1, %ymm2, %ymm11387; HASWELL-NO-FMA-NEXT: retq1388;1389; AVX512-LABEL: v16f32_two_step:1390; AVX512: # %bb.0:1391; AVX512-NEXT: vrcp14ps %zmm0, %zmm11392; AVX512-NEXT: vbroadcastss {{.*#+}} zmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]1393; AVX512-NEXT: vmovaps %zmm1, %zmm31394; AVX512-NEXT: vfmsub213ps {{.*#+}} zmm3 = (zmm0 * zmm3) - zmm21395; AVX512-NEXT: vfnmadd132ps {{.*#+}} zmm3 = -(zmm3 * zmm1) + zmm11396; AVX512-NEXT: vfmsub213ps {{.*#+}} zmm0 = (zmm3 * zmm0) - zmm21397; AVX512-NEXT: vfnmadd132ps {{.*#+}} zmm0 = -(zmm0 * zmm3) + zmm31398; AVX512-NEXT: retq1399 %div = fdiv fast <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>, %x1400 ret <16 x float> %div1401}1402 1403attributes #0 = { "reciprocal-estimates"="!divf,!vec-divf" }1404attributes #1 = { "reciprocal-estimates"="divf,vec-divf" }1405attributes #2 = { "reciprocal-estimates"="divf:2,vec-divf:2" }1406 1407