#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 fabs(double);
double log(double);
double logbessel_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];
    return log(y);
  } 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];
    return log(y);
  } 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]);
    return log(y) + w + 0.5 * log(t);
  }
}


x86 assembly (clang, -O0):
<logbessel_I0>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
movaps 0xf07(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xec6(%rip),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    132c <logbessel_I0+0x21c>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  0xec9(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
cvttsd2si -0x28(%rbp),%eax
imul   $0xd,%eax,%eax
mov    %eax,-0x14(%rbp)
movslq -0x14(%rbp),%rcx
lea    0xeca(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xeb0(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xe8e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xe6c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe4a(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe28(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xe06(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xde4(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xdc2(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x9,%eax
movslq %eax,%rcx
lea    0xda0(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xa,%eax
movslq %eax,%rcx
lea    0xd7e(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xb,%eax
movslq %eax,%rcx
lea    0xd5c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xc,%eax
movslq %eax,%rcx
lea    0xd3a(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <log@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    16c3 <logbessel_I0+0x5b3>
movsd  0xcd4(%rip),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1549 <logbessel_I0+0x439>
cvttsd2si -0x20(%rbp),%eax
mov    %eax,-0x14(%rbp)
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x8,%eax
imul   $0xe,%eax,%eax
mov    %eax,-0x14(%rbp)
movslq -0x14(%rbp),%rcx
lea    0xedf(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xec5(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xea3(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xe81(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe5f(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe3d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xe1b(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xdf9(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xdd7(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x9,%eax
movslq %eax,%rcx
lea    0xdb5(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xa,%eax
movslq %eax,%rcx
lea    0xd93(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xb,%eax
movslq %eax,%rcx
lea    0xd71(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xc,%eax
movslq %eax,%rcx
lea    0xd4f(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0xd,%eax
movslq %eax,%rcx
lea    0xd2d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <log@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    16c3 <logbessel_I0+0x5b3>
movsd  0xac7(%rip),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
cvttsd2si -0x28(%rbp),%eax
imul   $0x9,%eax,%eax
mov    %eax,-0x14(%rbp)
movslq -0x14(%rbp),%rcx
lea    0xf0f(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0xef5(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x2,%eax
movslq %eax,%rcx
lea    0xed3(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x3,%eax
movslq %eax,%rcx
lea    0xeb1(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x4,%eax
movslq %eax,%rcx
lea    0xe8f(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x5,%eax
movslq %eax,%rcx
lea    0xe6d(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x6,%eax
movslq %eax,%rcx
lea    0xe4b(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x7,%eax
movslq %eax,%rcx
lea    0xe29(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
mov    -0x14(%rbp),%eax
add    $0x8,%eax
movslq %eax,%rcx
lea    0xe07(%rip),%rax
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
call   1030 <log@plt>
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
call   1030 <log@plt>
movsd  -0x38(%rbp),%xmm1
movsd  0x95a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<logbessel_I0>:
sub    $0x18,%rsp
movapd 0xee4(%rip),%xmm2
andpd  %xmm0,%xmm2
movsd  0xee8(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    11db <logbessel_I0+0xcb>
mulsd  %xmm0,%xmm0
mulsd  0xef2(%rip),%xmm0
cvttsd2si %xmm0,%eax
lea    (%rax,%rax,2),%ecx
lea    (%rax,%rcx,4),%eax
cltq
lea    0xeef(%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    $0x18,%rsp
jmp    1030 <log@plt>
movsd  0xe35(%rip),%xmm0
ucomisd %xmm2,%xmm0
jbe    12e3 <logbessel_I0+0x1d3>
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    0x103d(%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    $0x18,%rsp
jmp    1030 <log@plt>
movsd  0xd35(%rip),%xmm1
divsd  %xmm2,%xmm1
movsd  %xmm1,0x10(%rsp)
cvttsd2si %xmm1,%eax
lea    (%rax,%rax,8),%eax
cltq
lea    0x117b(%rip),%rcx
movsd  (%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x8(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x10(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x18(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x20(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x28(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x30(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x38(%rcx,%rax,8),%xmm0
mulsd  %xmm1,%xmm0
addsd  0x40(%rcx,%rax,8),%xmm0
movapd %xmm2,(%rsp)
call   1030 <log@plt>
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movsd  0x10(%rsp),%xmm0
call   1030 <log@plt>
mulsd  0xca7(%rip),%xmm0
addsd  (%rsp),%xmm0
add    $0x18,%rsp
ret

LLVM IR (-O0):
@logbessel_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]
@logbessel_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]
@logbessel_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 @logbessel_I0(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca double
store double %0, double* %3
%8 = load double, double* %3
%9 = call double @llvm.fabs.f64(double %8)
store double %9, double* %5
%10 = load double, double* %5
%11 = fcmp olt double %10, 8.500000e+00
br i1 %11, label %12, label %110
12: ; preds = %1
%13 = load double, double* %5
%14 = load double, double* %5
%15 = fmul double %13, %14
%16 = fmul double %15, 6.250000e-02
store double %16, double* %6
%17 = load double, double* %6
%18 = fptosi double %17 to i32
%19 = mul nsw i32 13, %18
store i32 %19, i32* %4
%20 = load i32, i32* %4
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %21
%23 = load double, double* %22
%24 = load double, double* %6
%25 = load i32, i32* %4
%26 = add nsw i32 %25, 1
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %27
%29 = load double, double* %28
%30 = call double @llvm.fmuladd.f64(double %23, double %24, double %29)
%31 = load double, double* %6
%32 = load i32, i32* %4
%33 = add nsw i32 %32, 2
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %34
%36 = load double, double* %35
%37 = call double @llvm.fmuladd.f64(double %30, double %31, double %36)
%38 = load double, double* %6
%39 = load i32, i32* %4
%40 = add nsw i32 %39, 3
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %41
%43 = load double, double* %42
%44 = call double @llvm.fmuladd.f64(double %37, double %38, double %43)
%45 = load double, double* %6
%46 = load i32, i32* %4
%47 = add nsw i32 %46, 4
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %48
%50 = load double, double* %49
%51 = call double @llvm.fmuladd.f64(double %44, double %45, double %50)
%52 = load double, double* %6
%53 = load i32, i32* %4
%54 = add nsw i32 %53, 5
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %55
%57 = load double, double* %56
%58 = call double @llvm.fmuladd.f64(double %51, double %52, double %57)
%59 = load double, double* %6
%60 = load i32, i32* %4
%61 = add nsw i32 %60, 6
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %62
%64 = load double, double* %63
%65 = call double @llvm.fmuladd.f64(double %58, double %59, double %64)
%66 = load double, double* %6
%67 = load i32, i32* %4
%68 = add nsw i32 %67, 7
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %69
%71 = load double, double* %70
%72 = call double @llvm.fmuladd.f64(double %65, double %66, double %71)
%73 = load double, double* %6
%74 = load i32, i32* %4
%75 = add nsw i32 %74, 8
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %76
%78 = load double, double* %77
%79 = call double @llvm.fmuladd.f64(double %72, double %73, double %78)
%80 = load double, double* %6
%81 = load i32, i32* %4
%82 = add nsw i32 %81, 9
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %83
%85 = load double, double* %84
%86 = call double @llvm.fmuladd.f64(double %79, double %80, double %85)
%87 = load double, double* %6
%88 = load i32, i32* %4
%89 = add nsw i32 %88, 10
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %90
%92 = load double, double* %91
%93 = call double @llvm.fmuladd.f64(double %86, double %87, double %92)
%94 = load double, double* %6
%95 = load i32, i32* %4
%96 = add nsw i32 %95, 11
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %97
%99 = load double, double* %98
%100 = call double @llvm.fmuladd.f64(double %93, double %94, double %99)
%101 = load double, double* %6
%102 = load i32, i32* %4
%103 = add nsw i32 %102, 12
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds [65 x double], [65 x double]* @logbessel_I0.a, i64 0, i64 %104
%106 = load double, double* %105
%107 = call double @llvm.fmuladd.f64(double %100, double %101, double %106)
store double %107, double* %7
%108 = load double, double* %7
%109 = call double @log(double %108)
store double %109, double* %2
br label %293
110: ; preds = %1
%111 = load double, double* %5
%112 = fcmp olt double %111, 1.250000e+01
br i1 %112, label %113, label %220
113: ; preds = %110
%114 = load double, double* %5
%115 = fptosi double %114 to i32
store i32 %115, i32* %4
%116 = load double, double* %5
%117 = load i32, i32* %4
%118 = sitofp i32 %117 to double
%119 = fsub double %116, %118
store double %119, double* %6
%120 = load i32, i32* %4
%121 = sub nsw i32 %120, 8
%122 = mul nsw i32 14, %121
store i32 %122, i32* %4
%123 = load i32, i32* %4
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %124
%126 = load double, double* %125
%127 = load double, double* %6
%128 = load i32, i32* %4
%129 = add nsw i32 %128, 1
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %130
%132 = load double, double* %131
%133 = call double @llvm.fmuladd.f64(double %126, double %127, double %132)
%134 = load double, double* %6
%135 = load i32, i32* %4
%136 = add nsw i32 %135, 2
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %137
%139 = load double, double* %138
%140 = call double @llvm.fmuladd.f64(double %133, double %134, double %139)
%141 = load double, double* %6
%142 = load i32, i32* %4
%143 = add nsw i32 %142, 3
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %144
%146 = load double, double* %145
%147 = call double @llvm.fmuladd.f64(double %140, double %141, double %146)
%148 = load double, double* %6
%149 = load i32, i32* %4
%150 = add nsw i32 %149, 4
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %151
%153 = load double, double* %152
%154 = call double @llvm.fmuladd.f64(double %147, double %148, double %153)
%155 = load double, double* %6
%156 = load i32, i32* %4
%157 = add nsw i32 %156, 5
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %158
%160 = load double, double* %159
%161 = call double @llvm.fmuladd.f64(double %154, double %155, double %160)
%162 = load double, double* %6
%163 = load i32, i32* %4
%164 = add nsw i32 %163, 6
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %165
%167 = load double, double* %166
%168 = call double @llvm.fmuladd.f64(double %161, double %162, double %167)
%169 = load double, double* %6
%170 = load i32, i32* %4
%171 = add nsw i32 %170, 7
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %172
%174 = load double, double* %173
%175 = call double @llvm.fmuladd.f64(double %168, double %169, double %174)
%176 = load double, double* %6
%177 = load i32, i32* %4
%178 = add nsw i32 %177, 8
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %179
%181 = load double, double* %180
%182 = call double @llvm.fmuladd.f64(double %175, double %176, double %181)
%183 = load double, double* %6
%184 = load i32, i32* %4
%185 = add nsw i32 %184, 9
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %186
%188 = load double, double* %187
%189 = call double @llvm.fmuladd.f64(double %182, double %183, double %188)
%190 = load double, double* %6
%191 = load i32, i32* %4
%192 = add nsw i32 %191, 10
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %193
%195 = load double, double* %194
%196 = call double @llvm.fmuladd.f64(double %189, double %190, double %195)
%197 = load double, double* %6
%198 = load i32, i32* %4
%199 = add nsw i32 %198, 11
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %200
%202 = load double, double* %201
%203 = call double @llvm.fmuladd.f64(double %196, double %197, double %202)
%204 = load double, double* %6
%205 = load i32, i32* %4
%206 = add nsw i32 %205, 12
%207 = sext i32 %206 to i64
%208 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %207
%209 = load double, double* %208
%210 = call double @llvm.fmuladd.f64(double %203, double %204, double %209)
%211 = load double, double* %6
%212 = load i32, i32* %4
%213 = add nsw i32 %212, 13
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %214
%216 = load double, double* %215
%217 = call double @llvm.fmuladd.f64(double %210, double %211, double %216)
store double %217, double* %7
%218 = load double, double* %7
%219 = call double @log(double %218)
store double %219, double* %2
br label %293
220: ; preds = %110
%221 = load double, double* %5
%222 = fdiv double 6.000000e+01, %221
store double %222, double* %6
%223 = load double, double* %6
%224 = fptosi double %223 to i32
%225 = mul nsw i32 9, %224
store i32 %225, i32* %4
%226 = load i32, i32* %4
%227 = sext i32 %226 to i64
%228 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %227
%229 = load double, double* %228
%230 = load double, double* %6
%231 = load i32, i32* %4
%232 = add nsw i32 %231, 1
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %233
%235 = load double, double* %234
%236 = call double @llvm.fmuladd.f64(double %229, double %230, double %235)
%237 = load double, double* %6
%238 = load i32, i32* %4
%239 = add nsw i32 %238, 2
%240 = sext i32 %239 to i64
%241 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %240
%242 = load double, double* %241
%243 = call double @llvm.fmuladd.f64(double %236, double %237, double %242)
%244 = load double, double* %6
%245 = load i32, i32* %4
%246 = add nsw i32 %245, 3
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %247
%249 = load double, double* %248
%250 = call double @llvm.fmuladd.f64(double %243, double %244, double %249)
%251 = load double, double* %6
%252 = load i32, i32* %4
%253 = add nsw i32 %252, 4
%254 = sext i32 %253 to i64
%255 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %254
%256 = load double, double* %255
%257 = call double @llvm.fmuladd.f64(double %250, double %251, double %256)
%258 = load double, double* %6
%259 = load i32, i32* %4
%260 = add nsw i32 %259, 5
%261 = sext i32 %260 to i64
%262 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %261
%263 = load double, double* %262
%264 = call double @llvm.fmuladd.f64(double %257, double %258, double %263)
%265 = load double, double* %6
%266 = load i32, i32* %4
%267 = add nsw i32 %266, 6
%268 = sext i32 %267 to i64
%269 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %268
%270 = load double, double* %269
%271 = call double @llvm.fmuladd.f64(double %264, double %265, double %270)
%272 = load double, double* %6
%273 = load i32, i32* %4
%274 = add nsw i32 %273, 7
%275 = sext i32 %274 to i64
%276 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %275
%277 = load double, double* %276
%278 = call double @llvm.fmuladd.f64(double %271, double %272, double %277)
%279 = load double, double* %6
%280 = load i32, i32* %4
%281 = add nsw i32 %280, 8
%282 = sext i32 %281 to i64
%283 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %282
%284 = load double, double* %283
%285 = call double @llvm.fmuladd.f64(double %278, double %279, double %284)
store double %285, double* %7
%286 = load double, double* %7
%287 = call double @log(double %286)
%288 = load double, double* %5
%289 = fadd double %287, %288
%290 = load double, double* %6
%291 = call double @log(double %290)
%292 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %291, double %289)
store double %292, double* %2
br label %293
293: ; preds = %220, %113, %12
%294 = load double, double* %2
ret double %294
}

LLVM IR (-O2):
@logbessel_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]
@logbessel_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]
@logbessel_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 @logbessel_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 %73
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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_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]* @logbessel_I0.a, i64 0, i64 %68
%70 = load double, double* %69
%71 = tail call double @llvm.fmuladd.f64(double %66, double %6, double %70)
%72 = tail call double @log(double %71)
br label %201
73: ; preds = %1
%74 = fcmp olt double %2, 1.250000e+01
br i1 %74, label %75, label %150
75: ; preds = %73
%76 = fptosi double %2 to i32
%77 = sitofp i32 %76 to double
%78 = fsub double %2, %77
%79 = mul i32 %76, 14
%80 = add i32 %79, -112
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %81
%83 = load double, double* %82
%84 = add i32 %79, -111
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %85
%87 = load double, double* %86
%88 = tail call double @llvm.fmuladd.f64(double %83, double %78, double %87)
%89 = add i32 %79, -110
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %90
%92 = load double, double* %91
%93 = tail call double @llvm.fmuladd.f64(double %88, double %78, double %92)
%94 = add i32 %79, -109
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %95
%97 = load double, double* %96
%98 = tail call double @llvm.fmuladd.f64(double %93, double %78, double %97)
%99 = add i32 %79, -108
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %100
%102 = load double, double* %101
%103 = tail call double @llvm.fmuladd.f64(double %98, double %78, double %102)
%104 = add i32 %79, -107
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %105
%107 = load double, double* %106
%108 = tail call double @llvm.fmuladd.f64(double %103, double %78, double %107)
%109 = add i32 %79, -106
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %110
%112 = load double, double* %111
%113 = tail call double @llvm.fmuladd.f64(double %108, double %78, double %112)
%114 = add i32 %79, -105
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %115
%117 = load double, double* %116
%118 = tail call double @llvm.fmuladd.f64(double %113, double %78, double %117)
%119 = add i32 %79, -104
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %120
%122 = load double, double* %121
%123 = tail call double @llvm.fmuladd.f64(double %118, double %78, double %122)
%124 = add i32 %79, -103
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %125
%127 = load double, double* %126
%128 = tail call double @llvm.fmuladd.f64(double %123, double %78, double %127)
%129 = add i32 %79, -102
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %130
%132 = load double, double* %131
%133 = tail call double @llvm.fmuladd.f64(double %128, double %78, double %132)
%134 = add i32 %79, -101
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %135
%137 = load double, double* %136
%138 = tail call double @llvm.fmuladd.f64(double %133, double %78, double %137)
%139 = add i32 %79, -100
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %140
%142 = load double, double* %141
%143 = tail call double @llvm.fmuladd.f64(double %138, double %78, double %142)
%144 = add i32 %79, -99
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds [70 x double], [70 x double]* @logbessel_I0.b, i64 0, i64 %145
%147 = load double, double* %146
%148 = tail call double @llvm.fmuladd.f64(double %143, double %78, double %147)
%149 = tail call double @log(double %148)
br label %201
150: ; preds = %73
%151 = fdiv double 6.000000e+01, %2
%152 = fptosi double %151 to i32
%153 = mul nsw i32 %152, 9
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %154
%156 = load double, double* %155
%157 = add nsw i32 %153, 1
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %158
%160 = load double, double* %159
%161 = tail call double @llvm.fmuladd.f64(double %156, double %151, double %160)
%162 = add nsw i32 %153, 2
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %163
%165 = load double, double* %164
%166 = tail call double @llvm.fmuladd.f64(double %161, double %151, double %165)
%167 = add nsw i32 %153, 3
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %168
%170 = load double, double* %169
%171 = tail call double @llvm.fmuladd.f64(double %166, double %151, double %170)
%172 = add nsw i32 %153, 4
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %173
%175 = load double, double* %174
%176 = tail call double @llvm.fmuladd.f64(double %171, double %151, double %175)
%177 = add nsw i32 %153, 5
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %178
%180 = load double, double* %179
%181 = tail call double @llvm.fmuladd.f64(double %176, double %151, double %180)
%182 = add nsw i32 %153, 6
%183 = sext i32 %182 to i64
%184 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %183
%185 = load double, double* %184
%186 = tail call double @llvm.fmuladd.f64(double %181, double %151, double %185)
%187 = add nsw i32 %153, 7
%188 = sext i32 %187 to i64
%189 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %188
%190 = load double, double* %189
%191 = tail call double @llvm.fmuladd.f64(double %186, double %151, double %190)
%192 = add nsw i32 %153, 8
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds [45 x double], [45 x double]* @logbessel_I0.c, i64 0, i64 %193
%195 = load double, double* %194
%196 = tail call double @llvm.fmuladd.f64(double %191, double %151, double %195)
%197 = tail call double @log(double %196)
%198 = fadd double %2, %197
%199 = tail call double @log(double %151)
%200 = tail call double @llvm.fmuladd.f64(double %199, double 5.000000e-01, double %198)
br label %201
201: ; preds = %150, %75, %4
%202 = phi double [ %72, %4 ], [ %149, %75 ], [ %200, %150 ]
ret double %202
}