double BesselI0(double x) {
  double denominator;
  double numerator;
  double z;
  if (x == 0.0) {
    return 1.0;
  } else {
    z = x * x;
    numerator =
        (z * (z * (z * (z * (z * (z * (z * (z * (z * (z * (z * (z * (z * (z * 0.210580722890567e-22 +
                                                                          0.380715242345326e-19) +
                                                                     0.479440257548300e-16) +
                                                                0.435125971262668e-13) +
                                                           0.300931127112960e-10) +
                                                      0.160224679395361e-7) +
                                                 0.654858370096785e-5) +
                                            0.202591084143397e-2) +
                                       0.463076284721000e0) +
                                  0.754337328948189e2) +
                             0.830792541809429e4) +
                        0.571661130563785e6) +
                   0.216415572361227e8) +
              0.356644482244025e9) +
         0.144048298227235e10);
    denominator = (z * (z * (z - 0.307646912682801e4) + 0.347626332405882e7) -
                   0.144048298227235e10);
  }
  return -numerator / denominator;
}


x86 assembly (clang, -O0):
<BesselI0>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1133 <BesselI0+0x33>
jp     1133 <BesselI0+0x33>
movsd  0xf67(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12f7 <BesselI0+0x1f7>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  -0x28(%rbp),%xmm3
movsd  -0x28(%rbp),%xmm4
movsd  -0x28(%rbp),%xmm5
movsd  -0x28(%rbp),%xmm6
movsd  -0x28(%rbp),%xmm7
movsd  -0x28(%rbp),%xmm8
movsd  -0x28(%rbp),%xmm9
movsd  -0x28(%rbp),%xmm10
movsd  -0x28(%rbp),%xmm11
movsd  -0x28(%rbp),%xmm12
movsd  -0x28(%rbp),%xmm13
movsd  0xee9(%rip),%xmm14
mulsd  %xmm14,%xmm13
movsd  0xee3(%rip),%xmm14
addsd  %xmm14,%xmm13
mulsd  %xmm13,%xmm12
movsd  0xec0(%rip),%xmm13
addsd  %xmm13,%xmm12
mulsd  %xmm12,%xmm11
movsd  0xea5(%rip),%xmm12
addsd  %xmm12,%xmm11
mulsd  %xmm11,%xmm10
movsd  0xe8a(%rip),%xmm11
addsd  %xmm11,%xmm10
mulsd  %xmm10,%xmm9
movsd  0xe6f(%rip),%xmm10
addsd  %xmm10,%xmm9
mulsd  %xmm9,%xmm8
movsd  0xe54(%rip),%xmm9
addsd  %xmm9,%xmm8
mulsd  %xmm8,%xmm7
movsd  0xe39(%rip),%xmm8
addsd  %xmm8,%xmm7
mulsd  %xmm7,%xmm6
movsd  0xe20(%rip),%xmm7
addsd  %xmm7,%xmm6
mulsd  %xmm6,%xmm5
movsd  0xe08(%rip),%xmm6
addsd  %xmm6,%xmm5
mulsd  %xmm5,%xmm4
movsd  0xdf0(%rip),%xmm5
addsd  %xmm5,%xmm4
mulsd  %xmm4,%xmm3
movsd  0xdd8(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm2
movsd  0xdc0(%rip),%xmm3
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xda8(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd90(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm2
movsd  0xd68(%rip),%xmm3
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
movsd  0xd50(%rip),%xmm2
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd38(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<BesselI0>:
movapd %xmm0,%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jne    1119 <BesselI0+0x19>
jp     1119 <BesselI0+0x19>
movsd  0xee8(%rip),%xmm0
ret
mulsd  %xmm1,%xmm1
movsd  0xee3(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xedf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xedb(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xed7(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xed3(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xecf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xecb(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xec7(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xec3(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xebf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xebb(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xeb7(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xeb3(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xeaf(%rip),%xmm0
mulsd  %xmm1,%xmm0
addsd  0xeab(%rip),%xmm0
movsd  0xeab(%rip),%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm1,%xmm2
addsd  0xea3(%rip),%xmm2
mulsd  %xmm1,%xmm2
addsd  0xe9f(%rip),%xmm2
xorpd  0xea7(%rip),%xmm0
divsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @BesselI0(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
store double %0, double* %3
%7 = load double, double* %3
%8 = fcmp oeq double %7, 0.000000e+00
br i1 %8, label %9, label %10
9: ; preds = %1
store double 1.000000e+00, double* %2
br label %53
10: ; preds = %1
%11 = load double, double* %3
%12 = load double, double* %3
%13 = fmul double %11, %12
store double %13, double* %6
%14 = load double, double* %6
%15 = load double, double* %6
%16 = load double, double* %6
%17 = load double, double* %6
%18 = load double, double* %6
%19 = load double, double* %6
%20 = load double, double* %6
%21 = load double, double* %6
%22 = load double, double* %6
%23 = load double, double* %6
%24 = load double, double* %6
%25 = load double, double* %6
%26 = load double, double* %6
%27 = load double, double* %6
%28 = call double @llvm.fmuladd.f64(double %27, double 0x3B3975285FA144B7, double 0x3BE67934C1A70486)
%29 = call double @llvm.fmuladd.f64(double %26, double %28, double 0x3C8BA34A150CDDF8)
%30 = call double @llvm.fmuladd.f64(double %25, double %29, double 0x3D287ED37C80DDD3)
%31 = call double @llvm.fmuladd.f64(double %24, double %30, double 0x3DC08B3AA6488577)
%32 = call double @llvm.fmuladd.f64(double %23, double %31, double 0x3E513438F29175B0)
%33 = call double @llvm.fmuladd.f64(double %22, double %32, double 0x3EDB777CFB2DEEEA)
%34 = call double @llvm.fmuladd.f64(double %21, double %33, double 0x3F6098A499DFCFC0)
%35 = call double @llvm.fmuladd.f64(double %20, double %34, double 0x3FDDA30AB69B8325)
%36 = call double @llvm.fmuladd.f64(double %19, double %35, double 0x4052DBC2479D9C95)
%37 = call double @llvm.fmuladd.f64(double %18, double %36, double 0x40C039F67419A10D)
%38 = call double @llvm.fmuladd.f64(double %17, double %37, double 0x4121721A42D941A5)
%39 = call double @llvm.fmuladd.f64(double %16, double %38, double 0x4174A39553C72899)
%40 = call double @llvm.fmuladd.f64(double %15, double %39, double 0x41B541F6823E786C)
%41 = call double @llvm.fmuladd.f64(double %14, double %40, double 0x41D57701A9916E2F)
store double %41, double* %5
%42 = load double, double* %6
%43 = load double, double* %6
%44 = load double, double* %6
%45 = fsub double %44, 0x40A808F031643FF5
%46 = call double @llvm.fmuladd.f64(double %43, double %45, double 0x414A8593A97AC269)
%47 = call double @llvm.fmuladd.f64(double %42, double %46, double 0xC1D57701A9916E2F)
store double %47, double* %4
br label %48
48: ; preds = %10
%49 = load double, double* %5
%50 = fneg double %49
%51 = load double, double* %4
%52 = fdiv double %50, %51
store double %52, double* %2
br label %53
53: ; preds = %48, %9
%54 = load double, double* %2
ret double %54
}

LLVM IR (-O2):
define double @BesselI0(double %0) {
%2 = fcmp oeq double %0, 0.000000e+00
br i1 %2, label %24, label %3
3: ; preds = %1
%4 = fmul double %0, %0
%5 = tail call double @llvm.fmuladd.f64(double %4, double 0x3B3975285FA144B7, double 0x3BE67934C1A70486)
%6 = tail call double @llvm.fmuladd.f64(double %4, double %5, double 0x3C8BA34A150CDDF8)
%7 = tail call double @llvm.fmuladd.f64(double %4, double %6, double 0x3D287ED37C80DDD3)
%8 = tail call double @llvm.fmuladd.f64(double %4, double %7, double 0x3DC08B3AA6488577)
%9 = tail call double @llvm.fmuladd.f64(double %4, double %8, double 0x3E513438F29175B0)
%10 = tail call double @llvm.fmuladd.f64(double %4, double %9, double 0x3EDB777CFB2DEEEA)
%11 = tail call double @llvm.fmuladd.f64(double %4, double %10, double 0x3F6098A499DFCFC0)
%12 = tail call double @llvm.fmuladd.f64(double %4, double %11, double 0x3FDDA30AB69B8325)
%13 = tail call double @llvm.fmuladd.f64(double %4, double %12, double 0x4052DBC2479D9C95)
%14 = tail call double @llvm.fmuladd.f64(double %4, double %13, double 0x40C039F67419A10D)
%15 = tail call double @llvm.fmuladd.f64(double %4, double %14, double 0x4121721A42D941A5)
%16 = tail call double @llvm.fmuladd.f64(double %4, double %15, double 0x4174A39553C72899)
%17 = tail call double @llvm.fmuladd.f64(double %4, double %16, double 0x41B541F6823E786C)
%18 = tail call double @llvm.fmuladd.f64(double %4, double %17, double 0x41D57701A9916E2F)
%19 = fadd double %4, 0xC0A808F031643FF5
%20 = tail call double @llvm.fmuladd.f64(double %4, double %19, double 0x414A8593A97AC269)
%21 = tail call double @llvm.fmuladd.f64(double %4, double %20, double 0xC1D57701A9916E2F)
%22 = fneg double %18
%23 = fdiv double %22, %21
br label %24
24: ; preds = %1, %3
%25 = phi double [ %23, %3 ], [ 1.000000e+00, %1 ]
ret double %25
}