float besselizero(float x) {
  float temp;
  float sum = 1.0;
  float u = 1.0;
  float halfx = x / 2.0;
  int n = 1;
  do {
    temp = halfx / (float)n;
    u *= temp * temp;
    sum += u;
    n++;
  } while (u >= 1E-21 * sum);
  return sum;
}


x86 assembly (clang, -O0):
<besselizero>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  0xeff(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  0xef2(%rip),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xecc(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x1,-0x18(%rbp)
movss  -0x14(%rbp),%xmm0
cvtsi2ssl -0x18(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0xc(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe67(%rip),%xmm1
mulsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jae    1148 <besselizero+0x48>
movss  -0xc(%rbp),%xmm0
pop    %rbp
ret

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

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

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