float Izero(float x) {
  float IzeroEPSILON = 1E-37f;
  float sum, u, halfx, temp;
  int n;
  sum = u = 1.f;
  n = 1;
  halfx = x / 2.0f;
  do {
    temp = halfx / (float)n;
    n += 1;
    temp *= temp;
    u *= temp;
    sum += u;
  } while (u >= IzeroEPSILON * sum);
  return (sum);
}


x86 assembly (clang, -O0):
<Izero>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  0xef7(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xee6(%rip),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  0xed9(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movl   $0x1,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xebc(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
cvtsi2ssl -0x1c(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x10(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
mulss  -0xc(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jae    114d <Izero+0x4d>
movss  -0xc(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Izero>:
mulss  0xef8(%rip),%xmm0
mov    $0x1,%eax
movss  0xeef(%rip),%xmm2
movss  0xeeb(%rip),%xmm3
movaps %xmm2,%xmm1
xorps  %xmm4,%xmm4
cvtsi2ss %eax,%xmm4
movaps %xmm0,%xmm5
divss  %xmm4,%xmm5
add    $0x1,%eax
mulss  %xmm5,%xmm5
mulss  %xmm5,%xmm2
addss  %xmm2,%xmm1
movaps %xmm1,%xmm4
mulss  %xmm3,%xmm4
ucomiss %xmm4,%xmm2
jae    1120 <Izero+0x20>
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @Izero(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca i32
store float %0, float* %2
store float 0x3841039D40000000, float* %3
store float 1.000000e+00, float* %5
store float 1.000000e+00, float* %4
store i32 1, i32* %8
%9 = load float, float* %2
%10 = fdiv float %9, 2.000000e+00
store float %10, float* %6
br label %11
11: ; preds = %27, %1
%12 = load float, float* %6
%13 = load i32, i32* %8
%14 = sitofp i32 %13 to float
%15 = fdiv float %12, %14
store float %15, float* %7
%16 = load i32, i32* %8
%17 = add nsw i32 %16, 1
store i32 %17, i32* %8
%18 = load float, float* %7
%19 = load float, float* %7
%20 = fmul float %19, %18
store float %20, float* %7
%21 = load float, float* %7
%22 = load float, float* %5
%23 = fmul float %22, %21
store float %23, float* %5
%24 = load float, float* %5
%25 = load float, float* %4
%26 = fadd float %25, %24
store float %26, float* %4
br label %27
27: ; preds = %11
%28 = load float, float* %5
%29 = load float, float* %3
%30 = load float, float* %4
%31 = fmul float %29, %30
%32 = fcmp oge float %28, %31
br i1 %32, label %11, label %33
33: ; preds = %27
%34 = load float, float* %4
ret float %34
}

LLVM IR (-O2):
define float @Izero(float %0) {
%2 = fmul float %0, 5.000000e-01
br label %3
3: ; preds = %3, %1
%4 = phi float [ 1.000000e+00, %1 ], [ %11, %3 ]
%5 = phi float [ 1.000000e+00, %1 ], [ %12, %3 ]
%6 = phi i32 [ 1, %1 ], [ %9, %3 ]
%7 = sitofp i32 %6 to float
%8 = fdiv float %2, %7
%9 = add nuw nsw i32 %6, 1
%10 = fmul float %8, %8
%11 = fmul float %4, %10
%12 = fadd float %5, %11
%13 = fmul float %12, 0x3841039D40000000
%14 = fcmp ult float %11, %13
br i1 %14, label %15, label %3
15: ; preds = %3
ret float %12
}