#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double const exp(double);
double fabs(double);
double const sqrt(double);
double bessel_I0(double x) {
  int k;
  double w, t, y;
  const static double a[65] = {
      8.5246820682016865877e-11,  2.5966600546497407288e-9,
      7.9689994568640180274e-8,   1.9906710409667748239e-6,
      4.0312469446528002532e-5,   6.4499871606224265421e-4,
      0.0079012345761930579108,   0.071111111109207045212,
      0.444444444444724909,       1.7777777777777532045,
      4.0000000000000011182,      3.99999999999999998,
      1.0000000000000000001,      1.1520919130377195927e-10,
      2.2287613013610985225e-9,   8.1903951930694585113e-8,
      1.9821560631611544984e-6,   4.0335461940910133184e-5,
      6.4495330974432203401e-4,   0.0079013012611467520626,
      0.071111038160875566622,    0.44444450319062699316,
      1.7777777439146450067,      4.0000000132337935071,
      3.9999999968569015366,      1.0000000003426703174,
      1.5476870780515238488e-10,  1.2685004214732975355e-9,
      9.2776861851114223267e-8,   1.9063070109379044378e-6,
      4.0698004389917945832e-5,   6.4370447244298070713e-4,
      0.0079044749458444976958,   0.071105052411749363882,
      0.44445280640924755082,     1.7777694934432109713,
      4.0000055808824003386,      3.9999977081165740932,
      1.0000004333949319118,      2.0675200625006793075e-10,
      -6.1689554705125681442e-10, 1.2436765915401571654e-7,
      1.5830429403520613423e-6,   4.2947227560776583326e-5,
      6.3249861665073441312e-4,   0.0079454472840953930811,
      0.070994327785661860575,    0.44467219586283000332,
      1.7774588182255374745,      4.0003038986252717972,
      3.9998233869142057195,      1.0000472932961288324,
      2.7475684794982708655e-10,  -3.8991472076521332023e-9,
      1.9730170483976049388e-7,   5.9651531561967674521e-7,
      5.1992971474748995357e-5,   5.7327338675433770752e-4,
      0.0082293143836530412024,   0.069990934858728039037,
      0.44726764292723985087,     1.7726685170014087784,
      4.0062907863712704432,      3.9952750700487845355,
      1.0016354346654179322};
  const static double b[70] = {
      6.7852367144945531383e-8, 4.6266061382821826854e-7,
      6.9703135812354071774e-6, 7.6637663462953234134e-5,
      7.9113515222612691636e-4, 0.0073401204731103808981,
      0.060677114958668837046,  0.43994941411651569622,
      2.7420017097661750609,    14.289661921740860534,
      59.820609640320710779,    188.78998681199150629,
      399.8731367825601118,     427.56411572180478514,
      1.8042097874891098754e-7, 1.2277164312044637357e-6,
      1.8484393221474274861e-5, 2.0293995900091309208e-4,
      0.0020918539850246207459, 0.019375315654033949297,
      0.15985869016767185908,   1.1565260527420641724,
      7.1896341224206072113,    37.354773811947484532,
      155.80993164266268457,    489.5211371158540918,
      1030.9147225169564806,    1093.5883545113746958,
      4.8017305613187493564e-7, 3.261317843912380074e-6,
      4.9073137508166159639e-5, 5.3806506676487583755e-4,
      0.0055387918291051866561, 0.051223717488786549025,
      0.42190298621367914765,   3.0463625987357355872,
      18.895299447327733204,    97.915189029455461554,
      407.13940115493494659,    1274.3088990480582632,
      2670.9883037012547506,    2815.7166284662544712,
      1.2789926338424623394e-6, 8.6718263067604918916e-6,
      1.3041508821299929489e-4, 0.001428224737372747892,
      0.014684070635768789378,  0.13561403190404185755,
      1.1152592585977393953,    8.0387088559465389038,
      49.761318895895479206,    257.2684232313529138,
      1066.8543146269566231,    3328.3874581009636362,
      6948.8586598121634874,    7288.4893398212481055,
      3.409350368197032893e-6,  2.3079025203103376076e-5,
      3.4691373283901830239e-4, 0.003794994977222908545,
      0.038974209677945602145,  0.3594948380414878371,
      2.9522878893539528226,    21.246564609514287056,
      131.28727387146173141,    677.38107093296675421,
      2802.3724744545046518,    8718.5731420798254081,
      18141.348781638832286,    18948.925349296308859};
  const static double c[45] = {
      2.5568678676452702768e-15,  3.0393953792305924324e-14,
      6.3343751991094840009e-13,  1.5041298011833009649e-11,
      4.4569436918556541414e-10,  1.746393051427167951e-8,
      1.0059224011079852317e-6,   1.0729838945088577089e-4,
      0.05150322693642527738,     5.2527963991711562216e-15,
      7.202118481421005641e-15,   7.2561421229904797156e-13,
      1.482312146673104251e-11,   4.4602670450376245434e-10,
      1.7463600061788679671e-8,   1.005922609132234756e-6,
      1.0729838937545111487e-4,   0.051503226936437300716,
      1.3365917359358069908e-14,  -1.2932643065888544835e-13,
      1.7450199447905602915e-12,  1.0419051209056979788e-11,
      4.58047881980598326e-10,    1.7442405450073548966e-8,
      1.0059461453281292278e-6,   1.0729837434500161228e-4,
      0.051503226940658446941,    5.3771611477352308649e-14,
      -1.1396193006413731702e-12, 1.2858641335221653409e-11,
      -5.9802086004570057703e-11, 7.3666894305929510222e-10,
      1.6731837150730356448e-8,   1.0070831435812128922e-6,
      1.0729733111203704813e-4,   0.051503227360726294675,
      3.7819492084858931093e-14,  -4.8600496888588034879e-13,
      1.6898350504817224909e-12,  4.5884624327524255865e-11,
      1.2521615963377513729e-10,  1.8959658437754727957e-8,
      1.0020716710561353622e-6,   1.073037119856927559e-4,
      0.05150322383300230775};
  w = fabs(x);
  if (w < 8.5) {
    t = w * w * 0.0625;
    k = 13 * ((int)t);
    y = (((((((((((a[k] * t + a[k + 1]) * t + a[k + 2]) * t + a[k + 3]) * t +
                a[k + 4]) *
                   t +
               a[k + 5]) *
                  t +
              a[k + 6]) *
                 t +
             a[k + 7]) *
                t +
            a[k + 8]) *
               t +
           a[k + 9]) *
              t +
          a[k + 10]) *
             t +
         a[k + 11]) *
            t +
        a[k + 12];
  } else if (w < 12.5) {
    k = (int)w;
    t = w - k;
    k = 14 * (k - 8);
    y = ((((((((((((b[k] * t + b[k + 1]) * t + b[k + 2]) * t + b[k + 3]) * t +
                 b[k + 4]) *
                    t +
                b[k + 5]) *
                   t +
               b[k + 6]) *
                  t +
              b[k + 7]) *
                 t +
             b[k + 8]) *
                t +
            b[k + 9]) *
               t +
           b[k + 10]) *
              t +
          b[k + 11]) *
             t +
         b[k + 12]) *
            t +
        b[k + 13];
  } else {
    t = 60 / w;
    k = 9 * ((int)t);
    y = ((((((((c[k] * t + c[k + 1]) * t + c[k + 2]) * t + c[k + 3]) * t +
             c[k + 4]) *
                t +
            c[k + 5]) *
               t +
           c[k + 6]) *
              t +
          c[k + 7]) *
             t +
         c[k + 8]) *
        sqrt(t) * exp(w);
  }
  return y;
}


x86 assembly (clang, -O0):
<bessel_I0>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
movaps 0xee7(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xeb6(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    132d <bessel_I0+0x20d>
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xeb1(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
cvttsd2si -0x20(%rbp),%eax
imul   $0xd,%eax,%eax
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rcx
lea    0xeaa(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xe90(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xe6e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xe4c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe2a(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe08(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xde6(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xdc4(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xda2(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x9,%eax
movslq %eax,%rcx
lea    0xd80(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xa,%eax
movslq %eax,%rcx
lea    0xd5e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xb,%eax
movslq %eax,%rcx
lea    0xd3c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xc,%eax
movslq %eax,%rcx
lea    0xd1a(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    16b8 <bessel_I0+0x598>
movsd  0xcd3(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    153b <bessel_I0+0x41b>
cvttsd2si -0x18(%rbp),%eax
mov    %eax,-0xc(%rbp)
movsd  -0x18(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x8,%eax
imul   $0xe,%eax,%eax
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rcx
lea    0xece(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xeb4(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xe92(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xe70(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe4e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe2c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xe0a(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xde8(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xdc6(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x9,%eax
movslq %eax,%rcx
lea    0xda4(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xa,%eax
movslq %eax,%rcx
lea    0xd82(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xb,%eax
movslq %eax,%rcx
lea    0xd60(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xc,%eax
movslq %eax,%rcx
lea    0xd3e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0xd,%eax
movslq %eax,%rcx
lea    0xd1c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    16b3 <bessel_I0+0x593>
movsd  0xacd(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
cvttsd2si -0x20(%rbp),%eax
imul   $0x9,%eax,%eax
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rcx
lea    0xf0d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xef3(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xed1(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xeaf(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe8d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe6b(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xe49(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xe27(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm2
mov    -0xc(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xe05(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x20(%rbp),%xmm0
call   1040 <sqrt@plt>
movaps %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    16b8 <bessel_I0+0x598>
movsd  -0x28(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bessel_I0>:
sub    $0x28,%rsp
movapd 0xed4(%rip),%xmm2
andpd  %xmm0,%xmm2
movsd  0xed8(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    11e7 <bessel_I0+0xc7>
mulsd  %xmm0,%xmm0
mulsd  0xeda(%rip),%xmm0
cvttsd2si %xmm0,%eax
lea    (%rax,%rax,2),%ecx
lea    (%rax,%rcx,4),%eax
cltq
lea    0xecf(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x8(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x10(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x18(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x20(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x28(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x30(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x38(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x40(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x48(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x50(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x58(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x60(%rcx,%rax,8),%xmm1
movapd %xmm1,%xmm0
add    $0x28,%rsp
ret
movsd  0xe29(%rip),%xmm0
ucomisd %xmm2,%xmm0
jbe    12eb <bessel_I0+0x1cb>
cvttsd2si %xmm2,%ecx
cvttpd2dq %xmm2,%xmm0
cvtdq2pd %xmm0,%xmm0
subsd  %xmm0,%xmm2
mov    %ecx,%eax
shl    $0x4,%eax
sub    %ecx,%eax
sub    %ecx,%eax
lea    -0x70(%rax),%ecx
movslq %ecx,%rdx
lea    0x1021(%rip),%rcx
lea    -0x6f(%rax),%esi
movslq %esi,%rsi
movsd  (%rcx,%rdx,8),%xmm0
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rsi,8),%xmm0
lea    -0x6e(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x6d(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x6c(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x6b(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x6a(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x69(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x68(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x67(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x66(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x65(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
lea    -0x64(%rax),%edx
movslq %edx,%rdx
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rdx,8),%xmm0
add    $0xffffff9d,%eax
cltq
mulsd  %xmm2,%xmm0
addsd  (%rcx,%rax,8),%xmm0
add    $0x28,%rsp
ret
movsd  0xd2d(%rip),%xmm0
divsd  %xmm2,%xmm0
cvttsd2si %xmm0,%eax
lea    (%rax,%rax,8),%eax
cltq
lea    0x1169(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x8(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x10(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x18(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x20(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x28(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x30(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x38(%rcx,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
addsd  0x40(%rcx,%rax,8),%xmm1
movsd  %xmm1,0x8(%rsp)
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1372 <bessel_I0+0x252>
sqrtsd %xmm0,%xmm0
jmp    1383 <bessel_I0+0x263>
movapd %xmm2,0x10(%rsp)
call   1040 <sqrt@plt>
movapd 0x10(%rsp),%xmm2
movsd  0x8(%rsp),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rsp)
movapd %xmm2,%xmm0
call   1030 <exp@plt>
mulsd  0x8(%rsp),%xmm0
add    $0x28,%rsp
ret

LLVM IR (-O0):
@bessel_I0.a = internal constant [65 x double] [double 0x3DD76EB6330DFD24, double 0x3E264E1DA82518CB, double 0x3E75644135D83027, double 0x3EC0B2EEFA72858A, double 0x3F0522A5E734E24E, double 0x3F4522A4321B02EA, double 0x3F802E85C0D27AF8, double 0x3FB234567898A4ED, double 0x3FDC71C71C71DAD9, double 0x3FFC71C71C71C6AE, double 0x4010000000000001, double 4.000000e+00, double 1.000000e+00, double 0x3DDFAB2048BADCC8, double 0x3E232519121F312B, double 0x3E75FC658F652EEB, double 0x3EC0A0A5D1DB8ABE, double 0x3F0525BBEB537329, double 0x3F452242AFB7DF2D, double 0x3F802E8EB4198945, double 0x3FB234553F491B05, double 0x3FDC71C75B85CE34, double 0x3FFC71C7135AB894, double 0x4010000000E35AD7, double 0x400FFFFFFF940103, double 0x3FF0000000178C52, double 0x3DE5457096F0031D, double 0x3E15CAEC81A13E13, double 0x3E78E793D0761694, double 0x3EBFFB86B981D1C2, double 0x3F055664C86E9421, double 0x3F4517C8D426B770, double 0x3F803038AB135C5A, double 0x3FB233F0D2B05720, double 0x3FDC71EA2F09292A, double 0x3FFC71BE6CA2A428, double 0x401000017686D45F, double 0x400FFFFECC637C31, double 0x3FF000007456AC46, double 0x3DEC6A708440AC0A, double 0xBE0532454725531D, double 0x3E80B13D7FB623C0, double 0x3EBA8F1E1EC47F21, double 0x3F06844780ABA798, double 0x3F44B9C86FC7A4D0, double 0x3F8045B3E1E5F3F7, double 0x3FB22CAF2C0A79DA, double 0x3FDC75825EAAF796, double 0x3FFC7078A8643F75, double 0x4010004FAA4AA09B, double 0x400FFFA36764946A, double 0x3FF0003197329027, double 0x3DF2E192D68A12CC, double 0xBE30BF285E954734, double 0x3E8A7B3C2632AD25, double 0x3EA404070D24A882, double 0x3F0B4260E597C83E, double 0x3F42C8F73950C20F, double 0x3F80DA87E12B9B40, double 0x3FB1EAED083C1584, double 0x3FDCA00876BB9DB6, double 0x3FFC5CD9A9B2B7CA, double 0x401006711786EC44, double 0x400FF652C6A311B1, double 0x3FF006B2E0A67185]
@bessel_I0.b = internal constant [70 x double] [double 0x3E7236C77763E305, double 0x3E9F0C72E6024A09, double 0x3EDD3C51353C6DDD, double 0x3F1417110869934E, double 0x3F49EC85CD81EA49, double 0x3F7E10AC96176276, double 0x3FAF111220B9EA37, double 0x3FDC282196619640, double 0x4005EF9E97A82CA8, double 0x402C944E91418C09, double 0x404DE909BC97FADA, double 0x40679947926C38CB, double 0x4078FDF85E46607C, double 0x407AB9069E3504FA, double 0x3E883737B654EACE, double 0x3EB499007DE16CC8, double 0x3EF361DDD47866B9, double 0x3F2A9988F952E312, double 0x3F6122EF8E849CBD, double 0x3F93D71F6C55C342, double 0x3FC4763FE32032B4, double 0x3FF281217657FC77, double 0x401CC22F72880238, double 0x4042AD693A6FE556, double 0x406379EAF5C3A76B, double 0x407E985693DF5534, double 0x40901BA8AD04FCF9, double 0x4091165A799AE33C, double 0x3EA01CA7B7956756, double 0x3ECB5BA07214A4F4, double 0x3F09BA7C2A69D6D0, double 0x3F41A19DEEB43B02, double 0x3F76AFD81C3EE8DE, double 0x3FAA39FEBEC9AAD5, double 0x3FDB007561F7D6E4, double 0x40085EF35AAA9ED5, double 0x4032E53258366645, double 0x40587A927501CAD4, double 0x4079723AFCB49786, double 0x4093E93C500834B4, double 0x40A4DDFA02F156CF, double 0x40A5FF6EE9ED23E4, double 0x3EB5753B45D2EB9D, double 0x3EE22FA6BB777F16, double 0x3F21180113DAF1BA, double 0x3F576668A27464ED, double 0x3F8E12AE9938E52E, double 0x3FC15BCCF3F40A2C, double 0x3FF1D81A17A3D0E3, double 0x402013D1A5ACB640, double 0x4048E172E5C7D955, double 0x4070144B7628825C, double 0x4090AB6AD1741D18, double 0x40AA00C660E8806B, double 0x40BB24DBD12123A2, double 0x40BC787D455FE0E4, double 0x3ECC99862FBE4D0C, double 0x3EF8333A8918C549, double 0x3F36BC3F2317782C, double 0x3F6F16AE6A19DBFD, double 0x3FA3F46D77E88FED, double 0x3FD701F6A31E0436, double 0x40079E491CE9377D, double 0x40353F1EDBB63702, double 0x4060693158F95D8D, double 0x40852B0C6EEAD463, double 0x40A5E4BEB4F8C163, double 0x40C107495CB83C68, double 0x40D1B7565270390F, double 0x40D2813B38EC4141]
@bessel_I0.c = internal constant [45 x double] [double 0x3CE707BC63D14280, double 0x3D211C3AF957629D, double 0x3D66497F7A20A00A, double 0x3DB089BFBEF5EF1D, double 0x3DFEA0BCFEB75A4D, double 0x3E52C072DBD37442, double 0x3EB0E067606CB269, double 0x3F1C20AC4B5F1DAA, double 0x3FAA5EA186A92BDF, double 0x3CF7A80FDA82302E, double 0x3D0037BD1760E891, double 0x3D6987C07574F4CE, double 0x3DB04C567811FF08, double 0x3DFEA695B34055F1, double 0x3E52C05B9AEC5BC8, double 0x3EB0E0679AFA6C80, double 0x3F1C20AC4B0A2F1B, double 0x3FAA5EA186A932A4, double 0x3D0E18ED413481C0, double 0xBD423379C8BF1055, double 0x3D7EB2DF05337CD9, double 0x3DA6E9678649E801, double 0x3DFF7A10454669BC, double 0x3E52BA882ABDD88A, double 0x3EB0E0817BD412A3, double 0x3F1C20AC08EF66FE, double 0x3FAA5EA186B27AEF, double 0x3D2E454E4F8A83DC, double 0xBD740C639949485C, double 0x3DAC46C583B162C6, double 0xBDD070329BE66ADA, double 0x3E094FCEFD1D51C7, double 0x3E51F7365E3AA08B, double 0x3EB0E563A0629D86, double 0x3F1C209A1CBF8134, double 0x3FAA5EA18A4E381C, double 0x3D254A5CFBA431B2, double 0xBD61198B28F264A6, double 0x3D7DBA572B3F9250, double 0x3DC939AFD0F1AECF, double 0x3DE135A6E655063B, double 0x3E545B975AB38D66, double 0x3EB0CFDD7445DEFE, double 0x3F1C2107BC208F2A, double 0x3FAA5EA16C00AC0E]
define double @bessel_I0(double %0) {
%2 = alloca double
%3 = alloca i32
%4 = alloca double
%5 = alloca double
%6 = alloca double
store double %0, double* %2
%7 = load double, double* %2
%8 = call double @llvm.fabs.f64(double %7)
store double %8, double* %4
%9 = load double, double* %4
%10 = fcmp olt double %9, 8.500000e+00
br i1 %10, label %11, label %107
11: ; preds = %1
%12 = load double, double* %4
%13 = load double, double* %4
%14 = fmul double %12, %13
%15 = fmul double %14, 6.250000e-02
store double %15, double* %5
%16 = load double, double* %5
%17 = fptosi double %16 to i32
%18 = mul nsw i32 13, %17
store i32 %18, i32* %3
%19 = load i32, i32* %3
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %20
%22 = load double, double* %21
%23 = load double, double* %5
%24 = load i32, i32* %3
%25 = add nsw i32 %24, 1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %26
%28 = load double, double* %27
%29 = call double @llvm.fmuladd.f64(double %22, double %23, double %28)
%30 = load double, double* %5
%31 = load i32, i32* %3
%32 = add nsw i32 %31, 2
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %33
%35 = load double, double* %34
%36 = call double @llvm.fmuladd.f64(double %29, double %30, double %35)
%37 = load double, double* %5
%38 = load i32, i32* %3
%39 = add nsw i32 %38, 3
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %40
%42 = load double, double* %41
%43 = call double @llvm.fmuladd.f64(double %36, double %37, double %42)
%44 = load double, double* %5
%45 = load i32, i32* %3
%46 = add nsw i32 %45, 4
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %47
%49 = load double, double* %48
%50 = call double @llvm.fmuladd.f64(double %43, double %44, double %49)
%51 = load double, double* %5
%52 = load i32, i32* %3
%53 = add nsw i32 %52, 5
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %54
%56 = load double, double* %55
%57 = call double @llvm.fmuladd.f64(double %50, double %51, double %56)
%58 = load double, double* %5
%59 = load i32, i32* %3
%60 = add nsw i32 %59, 6
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %61
%63 = load double, double* %62
%64 = call double @llvm.fmuladd.f64(double %57, double %58, double %63)
%65 = load double, double* %5
%66 = load i32, i32* %3
%67 = add nsw i32 %66, 7
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %68
%70 = load double, double* %69
%71 = call double @llvm.fmuladd.f64(double %64, double %65, double %70)
%72 = load double, double* %5
%73 = load i32, i32* %3
%74 = add nsw i32 %73, 8
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %75
%77 = load double, double* %76
%78 = call double @llvm.fmuladd.f64(double %71, double %72, double %77)
%79 = load double, double* %5
%80 = load i32, i32* %3
%81 = add nsw i32 %80, 9
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %82
%84 = load double, double* %83
%85 = call double @llvm.fmuladd.f64(double %78, double %79, double %84)
%86 = load double, double* %5
%87 = load i32, i32* %3
%88 = add nsw i32 %87, 10
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %89
%91 = load double, double* %90
%92 = call double @llvm.fmuladd.f64(double %85, double %86, double %91)
%93 = load double, double* %5
%94 = load i32, i32* %3
%95 = add nsw i32 %94, 11
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %96
%98 = load double, double* %97
%99 = call double @llvm.fmuladd.f64(double %92, double %93, double %98)
%100 = load double, double* %5
%101 = load i32, i32* %3
%102 = add nsw i32 %101, 12
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %103
%105 = load double, double* %104
%106 = call double @llvm.fmuladd.f64(double %99, double %100, double %105)
store double %106, double* %6
br label %288
107: ; preds = %1
%108 = load double, double* %4
%109 = fcmp olt double %108, 1.250000e+01
br i1 %109, label %110, label %215
110: ; preds = %107
%111 = load double, double* %4
%112 = fptosi double %111 to i32
store i32 %112, i32* %3
%113 = load double, double* %4
%114 = load i32, i32* %3
%115 = sitofp i32 %114 to double
%116 = fsub double %113, %115
store double %116, double* %5
%117 = load i32, i32* %3
%118 = sub nsw i32 %117, 8
%119 = mul nsw i32 14, %118
store i32 %119, i32* %3
%120 = load i32, i32* %3
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %121
%123 = load double, double* %122
%124 = load double, double* %5
%125 = load i32, i32* %3
%126 = add nsw i32 %125, 1
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %127
%129 = load double, double* %128
%130 = call double @llvm.fmuladd.f64(double %123, double %124, double %129)
%131 = load double, double* %5
%132 = load i32, i32* %3
%133 = add nsw i32 %132, 2
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %134
%136 = load double, double* %135
%137 = call double @llvm.fmuladd.f64(double %130, double %131, double %136)
%138 = load double, double* %5
%139 = load i32, i32* %3
%140 = add nsw i32 %139, 3
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %141
%143 = load double, double* %142
%144 = call double @llvm.fmuladd.f64(double %137, double %138, double %143)
%145 = load double, double* %5
%146 = load i32, i32* %3
%147 = add nsw i32 %146, 4
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %148
%150 = load double, double* %149
%151 = call double @llvm.fmuladd.f64(double %144, double %145, double %150)
%152 = load double, double* %5
%153 = load i32, i32* %3
%154 = add nsw i32 %153, 5
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %155
%157 = load double, double* %156
%158 = call double @llvm.fmuladd.f64(double %151, double %152, double %157)
%159 = load double, double* %5
%160 = load i32, i32* %3
%161 = add nsw i32 %160, 6
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %162
%164 = load double, double* %163
%165 = call double @llvm.fmuladd.f64(double %158, double %159, double %164)
%166 = load double, double* %5
%167 = load i32, i32* %3
%168 = add nsw i32 %167, 7
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %169
%171 = load double, double* %170
%172 = call double @llvm.fmuladd.f64(double %165, double %166, double %171)
%173 = load double, double* %5
%174 = load i32, i32* %3
%175 = add nsw i32 %174, 8
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %176
%178 = load double, double* %177
%179 = call double @llvm.fmuladd.f64(double %172, double %173, double %178)
%180 = load double, double* %5
%181 = load i32, i32* %3
%182 = add nsw i32 %181, 9
%183 = sext i32 %182 to i64
%184 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %183
%185 = load double, double* %184
%186 = call double @llvm.fmuladd.f64(double %179, double %180, double %185)
%187 = load double, double* %5
%188 = load i32, i32* %3
%189 = add nsw i32 %188, 10
%190 = sext i32 %189 to i64
%191 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %190
%192 = load double, double* %191
%193 = call double @llvm.fmuladd.f64(double %186, double %187, double %192)
%194 = load double, double* %5
%195 = load i32, i32* %3
%196 = add nsw i32 %195, 11
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %197
%199 = load double, double* %198
%200 = call double @llvm.fmuladd.f64(double %193, double %194, double %199)
%201 = load double, double* %5
%202 = load i32, i32* %3
%203 = add nsw i32 %202, 12
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %204
%206 = load double, double* %205
%207 = call double @llvm.fmuladd.f64(double %200, double %201, double %206)
%208 = load double, double* %5
%209 = load i32, i32* %3
%210 = add nsw i32 %209, 13
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %211
%213 = load double, double* %212
%214 = call double @llvm.fmuladd.f64(double %207, double %208, double %213)
store double %214, double* %6
br label %287
215: ; preds = %107
%216 = load double, double* %4
%217 = fdiv double 6.000000e+01, %216
store double %217, double* %5
%218 = load double, double* %5
%219 = fptosi double %218 to i32
%220 = mul nsw i32 9, %219
store i32 %220, i32* %3
%221 = load i32, i32* %3
%222 = sext i32 %221 to i64
%223 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %222
%224 = load double, double* %223
%225 = load double, double* %5
%226 = load i32, i32* %3
%227 = add nsw i32 %226, 1
%228 = sext i32 %227 to i64
%229 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %228
%230 = load double, double* %229
%231 = call double @llvm.fmuladd.f64(double %224, double %225, double %230)
%232 = load double, double* %5
%233 = load i32, i32* %3
%234 = add nsw i32 %233, 2
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %235
%237 = load double, double* %236
%238 = call double @llvm.fmuladd.f64(double %231, double %232, double %237)
%239 = load double, double* %5
%240 = load i32, i32* %3
%241 = add nsw i32 %240, 3
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %242
%244 = load double, double* %243
%245 = call double @llvm.fmuladd.f64(double %238, double %239, double %244)
%246 = load double, double* %5
%247 = load i32, i32* %3
%248 = add nsw i32 %247, 4
%249 = sext i32 %248 to i64
%250 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %249
%251 = load double, double* %250
%252 = call double @llvm.fmuladd.f64(double %245, double %246, double %251)
%253 = load double, double* %5
%254 = load i32, i32* %3
%255 = add nsw i32 %254, 5
%256 = sext i32 %255 to i64
%257 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %256
%258 = load double, double* %257
%259 = call double @llvm.fmuladd.f64(double %252, double %253, double %258)
%260 = load double, double* %5
%261 = load i32, i32* %3
%262 = add nsw i32 %261, 6
%263 = sext i32 %262 to i64
%264 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %263
%265 = load double, double* %264
%266 = call double @llvm.fmuladd.f64(double %259, double %260, double %265)
%267 = load double, double* %5
%268 = load i32, i32* %3
%269 = add nsw i32 %268, 7
%270 = sext i32 %269 to i64
%271 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %270
%272 = load double, double* %271
%273 = call double @llvm.fmuladd.f64(double %266, double %267, double %272)
%274 = load double, double* %5
%275 = load i32, i32* %3
%276 = add nsw i32 %275, 8
%277 = sext i32 %276 to i64
%278 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %277
%279 = load double, double* %278
%280 = call double @llvm.fmuladd.f64(double %273, double %274, double %279)
%281 = load double, double* %5
%282 = call double @sqrt(double %281)
%283 = fmul double %280, %282
%284 = load double, double* %4
%285 = call double @exp(double %284)
%286 = fmul double %283, %285
store double %286, double* %6
br label %287
287: ; preds = %215, %110
br label %288
288: ; preds = %287, %11
%289 = load double, double* %6
ret double %289
}

LLVM IR (-O2):
@bessel_I0.a = internal unnamed_addr constant [65 x double] [double 0x3DD76EB6330DFD24, double 0x3E264E1DA82518CB, double 0x3E75644135D83027, double 0x3EC0B2EEFA72858A, double 0x3F0522A5E734E24E, double 0x3F4522A4321B02EA, double 0x3F802E85C0D27AF8, double 0x3FB234567898A4ED, double 0x3FDC71C71C71DAD9, double 0x3FFC71C71C71C6AE, double 0x4010000000000001, double 4.000000e+00, double 1.000000e+00, double 0x3DDFAB2048BADCC8, double 0x3E232519121F312B, double 0x3E75FC658F652EEB, double 0x3EC0A0A5D1DB8ABE, double 0x3F0525BBEB537329, double 0x3F452242AFB7DF2D, double 0x3F802E8EB4198945, double 0x3FB234553F491B05, double 0x3FDC71C75B85CE34, double 0x3FFC71C7135AB894, double 0x4010000000E35AD7, double 0x400FFFFFFF940103, double 0x3FF0000000178C52, double 0x3DE5457096F0031D, double 0x3E15CAEC81A13E13, double 0x3E78E793D0761694, double 0x3EBFFB86B981D1C2, double 0x3F055664C86E9421, double 0x3F4517C8D426B770, double 0x3F803038AB135C5A, double 0x3FB233F0D2B05720, double 0x3FDC71EA2F09292A, double 0x3FFC71BE6CA2A428, double 0x401000017686D45F, double 0x400FFFFECC637C31, double 0x3FF000007456AC46, double 0x3DEC6A708440AC0A, double 0xBE0532454725531D, double 0x3E80B13D7FB623C0, double 0x3EBA8F1E1EC47F21, double 0x3F06844780ABA798, double 0x3F44B9C86FC7A4D0, double 0x3F8045B3E1E5F3F7, double 0x3FB22CAF2C0A79DA, double 0x3FDC75825EAAF796, double 0x3FFC7078A8643F75, double 0x4010004FAA4AA09B, double 0x400FFFA36764946A, double 0x3FF0003197329027, double 0x3DF2E192D68A12CC, double 0xBE30BF285E954734, double 0x3E8A7B3C2632AD25, double 0x3EA404070D24A882, double 0x3F0B4260E597C83E, double 0x3F42C8F73950C20F, double 0x3F80DA87E12B9B40, double 0x3FB1EAED083C1584, double 0x3FDCA00876BB9DB6, double 0x3FFC5CD9A9B2B7CA, double 0x401006711786EC44, double 0x400FF652C6A311B1, double 0x3FF006B2E0A67185]
@bessel_I0.b = internal unnamed_addr constant [70 x double] [double 0x3E7236C77763E305, double 0x3E9F0C72E6024A09, double 0x3EDD3C51353C6DDD, double 0x3F1417110869934E, double 0x3F49EC85CD81EA49, double 0x3F7E10AC96176276, double 0x3FAF111220B9EA37, double 0x3FDC282196619640, double 0x4005EF9E97A82CA8, double 0x402C944E91418C09, double 0x404DE909BC97FADA, double 0x40679947926C38CB, double 0x4078FDF85E46607C, double 0x407AB9069E3504FA, double 0x3E883737B654EACE, double 0x3EB499007DE16CC8, double 0x3EF361DDD47866B9, double 0x3F2A9988F952E312, double 0x3F6122EF8E849CBD, double 0x3F93D71F6C55C342, double 0x3FC4763FE32032B4, double 0x3FF281217657FC77, double 0x401CC22F72880238, double 0x4042AD693A6FE556, double 0x406379EAF5C3A76B, double 0x407E985693DF5534, double 0x40901BA8AD04FCF9, double 0x4091165A799AE33C, double 0x3EA01CA7B7956756, double 0x3ECB5BA07214A4F4, double 0x3F09BA7C2A69D6D0, double 0x3F41A19DEEB43B02, double 0x3F76AFD81C3EE8DE, double 0x3FAA39FEBEC9AAD5, double 0x3FDB007561F7D6E4, double 0x40085EF35AAA9ED5, double 0x4032E53258366645, double 0x40587A927501CAD4, double 0x4079723AFCB49786, double 0x4093E93C500834B4, double 0x40A4DDFA02F156CF, double 0x40A5FF6EE9ED23E4, double 0x3EB5753B45D2EB9D, double 0x3EE22FA6BB777F16, double 0x3F21180113DAF1BA, double 0x3F576668A27464ED, double 0x3F8E12AE9938E52E, double 0x3FC15BCCF3F40A2C, double 0x3FF1D81A17A3D0E3, double 0x402013D1A5ACB640, double 0x4048E172E5C7D955, double 0x4070144B7628825C, double 0x4090AB6AD1741D18, double 0x40AA00C660E8806B, double 0x40BB24DBD12123A2, double 0x40BC787D455FE0E4, double 0x3ECC99862FBE4D0C, double 0x3EF8333A8918C549, double 0x3F36BC3F2317782C, double 0x3F6F16AE6A19DBFD, double 0x3FA3F46D77E88FED, double 0x3FD701F6A31E0436, double 0x40079E491CE9377D, double 0x40353F1EDBB63702, double 0x4060693158F95D8D, double 0x40852B0C6EEAD463, double 0x40A5E4BEB4F8C163, double 0x40C107495CB83C68, double 0x40D1B7565270390F, double 0x40D2813B38EC4141]
@bessel_I0.c = internal unnamed_addr constant [45 x double] [double 0x3CE707BC63D14280, double 0x3D211C3AF957629D, double 0x3D66497F7A20A00A, double 0x3DB089BFBEF5EF1D, double 0x3DFEA0BCFEB75A4D, double 0x3E52C072DBD37442, double 0x3EB0E067606CB269, double 0x3F1C20AC4B5F1DAA, double 0x3FAA5EA186A92BDF, double 0x3CF7A80FDA82302E, double 0x3D0037BD1760E891, double 0x3D6987C07574F4CE, double 0x3DB04C567811FF08, double 0x3DFEA695B34055F1, double 0x3E52C05B9AEC5BC8, double 0x3EB0E0679AFA6C80, double 0x3F1C20AC4B0A2F1B, double 0x3FAA5EA186A932A4, double 0x3D0E18ED413481C0, double 0xBD423379C8BF1055, double 0x3D7EB2DF05337CD9, double 0x3DA6E9678649E801, double 0x3DFF7A10454669BC, double 0x3E52BA882ABDD88A, double 0x3EB0E0817BD412A3, double 0x3F1C20AC08EF66FE, double 0x3FAA5EA186B27AEF, double 0x3D2E454E4F8A83DC, double 0xBD740C639949485C, double 0x3DAC46C583B162C6, double 0xBDD070329BE66ADA, double 0x3E094FCEFD1D51C7, double 0x3E51F7365E3AA08B, double 0x3EB0E563A0629D86, double 0x3F1C209A1CBF8134, double 0x3FAA5EA18A4E381C, double 0x3D254A5CFBA431B2, double 0xBD61198B28F264A6, double 0x3D7DBA572B3F9250, double 0x3DC939AFD0F1AECF, double 0x3DE135A6E655063B, double 0x3E545B975AB38D66, double 0x3EB0CFDD7445DEFE, double 0x3F1C2107BC208F2A, double 0x3FAA5EA16C00AC0E]
define double @bessel_I0(double %0) {
%2 = tail call double @llvm.fabs.f64(double %0)
%3 = fcmp olt double %2, 8.500000e+00
br i1 %3, label %4, label %72
4: ; preds = %1
%5 = fmul double %0, %0
%6 = fmul double %5, 6.250000e-02
%7 = fptosi double %6 to i32
%8 = mul nsw i32 %7, 13
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %9
%11 = load double, double* %10
%12 = add nsw i32 %8, 1
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %13
%15 = load double, double* %14
%16 = tail call double @llvm.fmuladd.f64(double %11, double %6, double %15)
%17 = add nsw i32 %8, 2
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %18
%20 = load double, double* %19
%21 = tail call double @llvm.fmuladd.f64(double %16, double %6, double %20)
%22 = add nsw i32 %8, 3
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %23
%25 = load double, double* %24
%26 = tail call double @llvm.fmuladd.f64(double %21, double %6, double %25)
%27 = add nsw i32 %8, 4
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %28
%30 = load double, double* %29
%31 = tail call double @llvm.fmuladd.f64(double %26, double %6, double %30)
%32 = add nsw i32 %8, 5
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %33
%35 = load double, double* %34
%36 = tail call double @llvm.fmuladd.f64(double %31, double %6, double %35)
%37 = add nsw i32 %8, 6
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %38
%40 = load double, double* %39
%41 = tail call double @llvm.fmuladd.f64(double %36, double %6, double %40)
%42 = add nsw i32 %8, 7
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %43
%45 = load double, double* %44
%46 = tail call double @llvm.fmuladd.f64(double %41, double %6, double %45)
%47 = add nsw i32 %8, 8
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %48
%50 = load double, double* %49
%51 = tail call double @llvm.fmuladd.f64(double %46, double %6, double %50)
%52 = add nsw i32 %8, 9
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %53
%55 = load double, double* %54
%56 = tail call double @llvm.fmuladd.f64(double %51, double %6, double %55)
%57 = add nsw i32 %8, 10
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %58
%60 = load double, double* %59
%61 = tail call double @llvm.fmuladd.f64(double %56, double %6, double %60)
%62 = add nsw i32 %8, 11
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %63
%65 = load double, double* %64
%66 = tail call double @llvm.fmuladd.f64(double %61, double %6, double %65)
%67 = add nsw i32 %8, 12
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds [65 x double], [65 x double]* @bessel_I0.a, i64 0, i64 %68
%70 = load double, double* %69
%71 = tail call double @llvm.fmuladd.f64(double %66, double %6, double %70)
br label %199
72: ; preds = %1
%73 = fcmp olt double %2, 1.250000e+01
br i1 %73, label %74, label %148
74: ; preds = %72
%75 = fptosi double %2 to i32
%76 = sitofp i32 %75 to double
%77 = fsub double %2, %76
%78 = mul i32 %75, 14
%79 = add i32 %78, -112
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %80
%82 = load double, double* %81
%83 = add i32 %78, -111
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %84
%86 = load double, double* %85
%87 = tail call double @llvm.fmuladd.f64(double %82, double %77, double %86)
%88 = add i32 %78, -110
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %89
%91 = load double, double* %90
%92 = tail call double @llvm.fmuladd.f64(double %87, double %77, double %91)
%93 = add i32 %78, -109
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %94
%96 = load double, double* %95
%97 = tail call double @llvm.fmuladd.f64(double %92, double %77, double %96)
%98 = add i32 %78, -108
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %99
%101 = load double, double* %100
%102 = tail call double @llvm.fmuladd.f64(double %97, double %77, double %101)
%103 = add i32 %78, -107
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %104
%106 = load double, double* %105
%107 = tail call double @llvm.fmuladd.f64(double %102, double %77, double %106)
%108 = add i32 %78, -106
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %109
%111 = load double, double* %110
%112 = tail call double @llvm.fmuladd.f64(double %107, double %77, double %111)
%113 = add i32 %78, -105
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %114
%116 = load double, double* %115
%117 = tail call double @llvm.fmuladd.f64(double %112, double %77, double %116)
%118 = add i32 %78, -104
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %119
%121 = load double, double* %120
%122 = tail call double @llvm.fmuladd.f64(double %117, double %77, double %121)
%123 = add i32 %78, -103
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %124
%126 = load double, double* %125
%127 = tail call double @llvm.fmuladd.f64(double %122, double %77, double %126)
%128 = add i32 %78, -102
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %129
%131 = load double, double* %130
%132 = tail call double @llvm.fmuladd.f64(double %127, double %77, double %131)
%133 = add i32 %78, -101
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %134
%136 = load double, double* %135
%137 = tail call double @llvm.fmuladd.f64(double %132, double %77, double %136)
%138 = add i32 %78, -100
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %139
%141 = load double, double* %140
%142 = tail call double @llvm.fmuladd.f64(double %137, double %77, double %141)
%143 = add i32 %78, -99
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds [70 x double], [70 x double]* @bessel_I0.b, i64 0, i64 %144
%146 = load double, double* %145
%147 = tail call double @llvm.fmuladd.f64(double %142, double %77, double %146)
br label %199
148: ; preds = %72
%149 = fdiv double 6.000000e+01, %2
%150 = fptosi double %149 to i32
%151 = mul nsw i32 %150, 9
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %152
%154 = load double, double* %153
%155 = add nsw i32 %151, 1
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %156
%158 = load double, double* %157
%159 = tail call double @llvm.fmuladd.f64(double %154, double %149, double %158)
%160 = add nsw i32 %151, 2
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %161
%163 = load double, double* %162
%164 = tail call double @llvm.fmuladd.f64(double %159, double %149, double %163)
%165 = add nsw i32 %151, 3
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %166
%168 = load double, double* %167
%169 = tail call double @llvm.fmuladd.f64(double %164, double %149, double %168)
%170 = add nsw i32 %151, 4
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %171
%173 = load double, double* %172
%174 = tail call double @llvm.fmuladd.f64(double %169, double %149, double %173)
%175 = add nsw i32 %151, 5
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %176
%178 = load double, double* %177
%179 = tail call double @llvm.fmuladd.f64(double %174, double %149, double %178)
%180 = add nsw i32 %151, 6
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %181
%183 = load double, double* %182
%184 = tail call double @llvm.fmuladd.f64(double %179, double %149, double %183)
%185 = add nsw i32 %151, 7
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %186
%188 = load double, double* %187
%189 = tail call double @llvm.fmuladd.f64(double %184, double %149, double %188)
%190 = add nsw i32 %151, 8
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds [45 x double], [45 x double]* @bessel_I0.c, i64 0, i64 %191
%193 = load double, double* %192
%194 = tail call double @llvm.fmuladd.f64(double %189, double %149, double %193)
%195 = tail call double @sqrt(double %149)
%196 = fmul double %194, %195
%197 = tail call double @exp(double %2)
%198 = fmul double %196, %197
br label %199
199: ; preds = %74, %148, %4
%200 = phi double [ %71, %4 ], [ %147, %74 ], [ %198, %148 ]
ret double %200
}