double BesselI0(double arg) {
  double numerator, denominator, z, z1, z2, z3, z4, z5, z6, z7, z8, z9, z10,
      z11, z12, z13, z_1, z_2;
  if (arg == 0.0) {
    return 1.0;
  }
  z = arg * arg;
  z1 = z * 0.210580722890567e-22 + 0.380715242345326e-19;
  z2 = z * z1 + 0.479440257548300e-16;
  z3 = z * z2 + 0.435125971262668e-13;
  z4 = z * z3 + 0.300931127112960e-10;
  z5 = z * z4 + 0.160224679395361e-7;
  z6 = z * z5 + 0.654858370096785e-5;
  z7 = z * z6 + 0.202591084143397e-2;
  z8 = z * z7 + 0.463076284721000e0;
  z9 = z * z8 + 0.754337328948189e2;
  z10 = z * z9 + 0.830792541809429e4;
  z11 = z * z10 + 0.571661130563785e6;
  z12 = z * z11 + 0.216415572361227e8;
  z13 = z * z12 + 0.356644482244025e9;
  numerator = z * z13 + 0.144048298227235e10;
  z_1 = z - 0.307646912682801e4;
  z_2 = z * z_1 + 0.347626332405882e7;
  denominator = z * z_2 - 0.144048298227235e10;
  return -numerator / denominator;
}


x86 assembly (clang, -O0):
<BesselI0>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1137 <BesselI0+0x37>
jp     1137 <BesselI0+0x37>
movsd  0xf63(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    138d <BesselI0+0x28d>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xf2d(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xf29(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xefa(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xed3(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xeac(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe85(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe5e(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe37(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe10(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xde9(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdc2(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd9b(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd74(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xd47(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xd1a(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xcfc(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xccf(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xca2(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x20,%rsp
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
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
store double %0, double* %3
%22 = load double, double* %3
%23 = fcmp oeq double %22, 0.000000e+00
br i1 %23, label %24, label %25
24: ; preds = %1
store double 1.000000e+00, double* %2
br label %82
25: ; preds = %1
%26 = load double, double* %3
%27 = load double, double* %3
%28 = fmul double %26, %27
store double %28, double* %6
%29 = load double, double* %6
%30 = call double @llvm.fmuladd.f64(double %29, double 0x3B3975285FA144B7, double 0x3BE67934C1A70486)
store double %30, double* %7
%31 = load double, double* %6
%32 = load double, double* %7
%33 = call double @llvm.fmuladd.f64(double %31, double %32, double 0x3C8BA34A150CDDF8)
store double %33, double* %8
%34 = load double, double* %6
%35 = load double, double* %8
%36 = call double @llvm.fmuladd.f64(double %34, double %35, double 0x3D287ED37C80DDD3)
store double %36, double* %9
%37 = load double, double* %6
%38 = load double, double* %9
%39 = call double @llvm.fmuladd.f64(double %37, double %38, double 0x3DC08B3AA6488577)
store double %39, double* %10
%40 = load double, double* %6
%41 = load double, double* %10
%42 = call double @llvm.fmuladd.f64(double %40, double %41, double 0x3E513438F29175B0)
store double %42, double* %11
%43 = load double, double* %6
%44 = load double, double* %11
%45 = call double @llvm.fmuladd.f64(double %43, double %44, double 0x3EDB777CFB2DEEEA)
store double %45, double* %12
%46 = load double, double* %6
%47 = load double, double* %12
%48 = call double @llvm.fmuladd.f64(double %46, double %47, double 0x3F6098A499DFCFC0)
store double %48, double* %13
%49 = load double, double* %6
%50 = load double, double* %13
%51 = call double @llvm.fmuladd.f64(double %49, double %50, double 0x3FDDA30AB69B8325)
store double %51, double* %14
%52 = load double, double* %6
%53 = load double, double* %14
%54 = call double @llvm.fmuladd.f64(double %52, double %53, double 0x4052DBC2479D9C95)
store double %54, double* %15
%55 = load double, double* %6
%56 = load double, double* %15
%57 = call double @llvm.fmuladd.f64(double %55, double %56, double 0x40C039F67419A10D)
store double %57, double* %16
%58 = load double, double* %6
%59 = load double, double* %16
%60 = call double @llvm.fmuladd.f64(double %58, double %59, double 0x4121721A42D941A5)
store double %60, double* %17
%61 = load double, double* %6
%62 = load double, double* %17
%63 = call double @llvm.fmuladd.f64(double %61, double %62, double 0x4174A39553C72899)
store double %63, double* %18
%64 = load double, double* %6
%65 = load double, double* %18
%66 = call double @llvm.fmuladd.f64(double %64, double %65, double 0x41B541F6823E786C)
store double %66, double* %19
%67 = load double, double* %6
%68 = load double, double* %19
%69 = call double @llvm.fmuladd.f64(double %67, double %68, double 0x41D57701A9916E2F)
store double %69, double* %4
%70 = load double, double* %6
%71 = fsub double %70, 0x40A808F031643FF5
store double %71, double* %20
%72 = load double, double* %6
%73 = load double, double* %20
%74 = call double @llvm.fmuladd.f64(double %72, double %73, double 0x414A8593A97AC269)
store double %74, double* %21
%75 = load double, double* %6
%76 = load double, double* %21
%77 = call double @llvm.fmuladd.f64(double %75, double %76, double 0xC1D57701A9916E2F)
store double %77, double* %5
%78 = load double, double* %4
%79 = fneg double %78
%80 = load double, double* %5
%81 = fdiv double %79, %80
store double %81, double* %2
br label %82
82: ; preds = %25, %24
%83 = load double, double* %2
ret double %83
}

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
}