void qd_exp(const double *a, double *b) {
  const double k = ldexp(1.0, 16);
  const double inv_k = 1.0 / k;
  const double qd_e_0 = 2.718281828459045091e+00;
  const double qd_e_1 = 1.445646891729250158e-16;
  const double qd_e_2 = -2.127717108038176765e-33;
  const double qd_e_3 = 1.515630159841218954e-49;
  const double qd_log2_0 = 6.931471805599452862e-01;
  const double qd_log2_1 = 2.319046813846299558e-17;
  const double qd_log2_2 = 5.707708438416212066e-34;
  const double qd_log2_3 = -3.582432210601811423e-50;
  const double qd_eps = 1.21543267145725e-63;
  double m, tol;
  double r[4];
  double s[4];
  double p[4];
  double t[4];
  int i;
  double *inv_fac;
  double i_fac[60];
  i_fac[0] = 1.66666666666666657e-01;
  i_fac[1] = 9.25185853854297066e-18;
  i_fac[2] = 5.13581318503262866e-34;
  i_fac[3] = 2.85094902409834186e-50;
  i_fac[4] = 4.16666666666666644e-02;
  i_fac[5] = 2.31296463463574266e-18;
  i_fac[6] = 1.28395329625815716e-34;
  i_fac[7] = 7.12737256024585466e-51;
  i_fac[8] = 8.33333333333333322e-03;
  i_fac[9] = 1.15648231731787138e-19;
  i_fac[10] = 1.60494162032269652e-36;
  i_fac[11] = 2.22730392507682967e-53;
  i_fac[12] = 1.38888888888888894e-03;
  i_fac[13] = -5.30054395437357706e-20;
  i_fac[14] = -1.73868675534958776e-36;
  i_fac[15] = -1.63335621172300840e-52;
  i_fac[16] = 1.98412698412698413e-04;
  i_fac[17] = 1.72095582934207053e-22;
  i_fac[18] = 1.49269123913941271e-40;
  i_fac[19] = 1.29470326746002471e-58;
  i_fac[20] = 2.48015873015873016e-05;
  i_fac[21] = 2.15119478667758816e-23;
  i_fac[22] = 1.86586404892426588e-41;
  i_fac[23] = 1.61837908432503088e-59;
  i_fac[24] = 2.75573192239858925e-06;
  i_fac[25] = -1.85839327404647208e-22;
  i_fac[26] = 8.49175460488199287e-39;
  i_fac[27] = -5.72661640789429621e-55;
  i_fac[28] = 2.75573192239858883e-07;
  i_fac[29] = 2.37677146222502973e-23;
  i_fac[30] = -3.26318890334088294e-40;
  i_fac[31] = 1.61435111860404415e-56;
  i_fac[32] = 2.50521083854417202e-08;
  i_fac[33] = -1.44881407093591197e-24;
  i_fac[34] = 2.04267351467144546e-41;
  i_fac[35] = -8.49632672007163175e-58;
  i_fac[36] = 2.08767569878681002e-09;
  i_fac[37] = -1.20734505911325997e-25;
  i_fac[38] = 1.70222792889287100e-42;
  i_fac[39] = 1.41609532150396700e-58;
  i_fac[40] = 1.60590438368216133e-10;
  i_fac[41] = 1.25852945887520981e-26;
  i_fac[42] = -5.31334602762985031e-43;
  i_fac[43] = 3.54021472597605528e-59;
  i_fac[44] = 1.14707455977297245e-11;
  i_fac[45] = 2.06555127528307454e-28;
  i_fac[46] = 6.88907923246664603e-45;
  i_fac[47] = 5.72920002655109095e-61;
  i_fac[48] = 7.64716373181981641e-13;
  i_fac[49] = 7.03872877733453001e-30;
  i_fac[50] = -7.82753927716258345e-48;
  i_fac[51] = 1.92138649443790242e-64;
  i_fac[52] = 4.77947733238738525e-14;
  i_fac[53] = 4.39920548583408126e-31;
  i_fac[54] = -4.89221204822661465e-49;
  i_fac[55] = 1.20086655902368901e-65;
  i_fac[56] = 2.81145725434552060e-15;
  i_fac[57] = 1.65088427308614326e-31;
  i_fac[58] = -2.87777179307447918e-50;
  i_fac[59] = 4.27110689256293549e-67;
  if (a[0] <= -709.0) {
    b[0] = 0.0;
    b[1] = 0.0;
    b[2] = 0.0;
    b[3] = 0.0;
    return;
  }
  if (a[0] >= 709.0) {
    b[0] = -1.0;
    b[1] = 0.0;
    b[2] = 0.0;
    b[3] = 0.0;
    return;
  }
  if (qd_is_zero(a) == 1) {
    b[0] = 1.0;
    b[1] = 0.0;
    b[2] = 0.0;
    b[3] = 0.0;
    return;
  }
  if (qd_is_one(a) == 1) {
    b[0] = qd_e_0;
    b[1] = qd_e_1;
    b[2] = qd_e_2;
    b[3] = qd_e_3;
    return;
  }
  m = floor(a[0] / qd_log2_0 + 0.5);
  r[0] = qd_log2_0;
  r[1] = qd_log2_1;
  r[2] = qd_log2_2;
  r[3] = qd_log2_3;
  qd_mul_d(r, m, r);
  qd_sub(a, r, r);
  qd_mul_pwr2(r, inv_k, r);
  qd_sqr(r, p);
  qd_mul_pwr2(p, 0.5, s);
  qd_add(s, r, s);
  i = 0;
  tol = inv_k * qd_eps;
  do {
    qd_mul(r, p, p);
    inv_fac = &i_fac[4 * (i++)];
    qd_mul(p, inv_fac, t);
    qd_add(s, t, s);
  } while (fabs(t[0]) > tol && i < 9);
  for (i = 0; i < 16; i++) {
    qd_mul_pwr2(s, 2.0, p);
    qd_sqr(s, t);
    qd_add(p, t, s);
  }
  qd_add_d(s, 1.0, b);
  i = (int)m;
  qd_ldexp(b, i);
}


x86 assembly (clang, -O0):
<qd_exp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x300,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  0x1055(%rip),%xmm0
mov    $0x10,%edi
call   1040 <ldexp@plt>
movsd  %xmm0,-0x18(%rbp)
movsd  0x103e(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0x1024(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0x100f(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xffa(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xfe5(%rip),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xfd0(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  0xfbb(%rip),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  0xfa6(%rip),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  0xf91(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xf7c(%rip),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  0xf67(%rip),%xmm0
movsd  %xmm0,-0x2f0(%rbp)
ff
movsd  0xf4f(%rip),%xmm0
movsd  %xmm0,-0x2e8(%rbp)
ff
movsd  0xf37(%rip),%xmm0
movsd  %xmm0,-0x2e0(%rbp)
ff
movsd  0xf1f(%rip),%xmm0
movsd  %xmm0,-0x2d8(%rbp)
ff
movsd  0xf07(%rip),%xmm0
movsd  %xmm0,-0x2d0(%rbp)
ff
movsd  0xeef(%rip),%xmm0
movsd  %xmm0,-0x2c8(%rbp)
ff
movsd  0xed7(%rip),%xmm0
movsd  %xmm0,-0x2c0(%rbp)
ff
movsd  0xebf(%rip),%xmm0
movsd  %xmm0,-0x2b8(%rbp)
ff
movsd  0xea7(%rip),%xmm0
movsd  %xmm0,-0x2b0(%rbp)
movsd  0xe8f(%rip),%xmm0
movsd  %xmm0,-0x2a8(%rbp)
ff
movsd  0xe77(%rip),%xmm0
movsd  %xmm0,-0x2a0(%rbp)
ff
movsd  0xe5f(%rip),%xmm0
movsd  %xmm0,-0x298(%rbp)
ff
movsd  0xe47(%rip),%xmm0
movsd  %xmm0,-0x290(%rbp)
ff
movsd  0xe2f(%rip),%xmm0
movsd  %xmm0,-0x288(%rbp)
ff
movsd  0xe17(%rip),%xmm0
movsd  %xmm0,-0x280(%rbp)
ff
movsd  0xdff(%rip),%xmm0
movsd  %xmm0,-0x278(%rbp)
ff
movsd  0xde7(%rip),%xmm0
movsd  %xmm0,-0x270(%rbp)
ff
movsd  0xdcf(%rip),%xmm0
movsd  %xmm0,-0x268(%rbp)
ff
movsd  0xdb7(%rip),%xmm0
movsd  %xmm0,-0x260(%rbp)
ff
movsd  0xd9f(%rip),%xmm0
movsd  %xmm0,-0x258(%rbp)
ff
movsd  0xd87(%rip),%xmm0
movsd  %xmm0,-0x250(%rbp)
ff
movsd  0xd6f(%rip),%xmm0
movsd  %xmm0,-0x248(%rbp)
ff
movsd  0xd57(%rip),%xmm0
movsd  %xmm0,-0x240(%rbp)
ff
movsd  0xd3f(%rip),%xmm0
movsd  %xmm0,-0x238(%rbp)
ff
movsd  0xd27(%rip),%xmm0
movsd  %xmm0,-0x230(%rbp)
movsd  0xd0f(%rip),%xmm0
movsd  %xmm0,-0x228(%rbp)
ff
movsd  0xcf7(%rip),%xmm0
movsd  %xmm0,-0x220(%rbp)
ff
movsd  0xcdf(%rip),%xmm0
movsd  %xmm0,-0x218(%rbp)
ff
movsd  0xcc7(%rip),%xmm0
movsd  %xmm0,-0x210(%rbp)
ff
movsd  0xcaf(%rip),%xmm0
movsd  %xmm0,-0x208(%rbp)
ff
movsd  0xc97(%rip),%xmm0
movsd  %xmm0,-0x200(%rbp)
ff
movsd  0xc7f(%rip),%xmm0
movsd  %xmm0,-0x1f8(%rbp)
ff
movsd  0xc67(%rip),%xmm0
movsd  %xmm0,-0x1f0(%rbp)
ff
movsd  0xc4f(%rip),%xmm0
movsd  %xmm0,-0x1e8(%rbp)
ff
movsd  0xc37(%rip),%xmm0
movsd  %xmm0,-0x1e0(%rbp)
ff
movsd  0xc1f(%rip),%xmm0
movsd  %xmm0,-0x1d8(%rbp)
ff
movsd  0xc07(%rip),%xmm0
movsd  %xmm0,-0x1d0(%rbp)
ff
movsd  0xbef(%rip),%xmm0
movsd  %xmm0,-0x1c8(%rbp)
ff
movsd  0xbd7(%rip),%xmm0
movsd  %xmm0,-0x1c0(%rbp)
ff
movsd  0xbbf(%rip),%xmm0
movsd  %xmm0,-0x1b8(%rbp)
ff
movsd  0xba7(%rip),%xmm0
movsd  %xmm0,-0x1b0(%rbp)
movsd  0xb8f(%rip),%xmm0
movsd  %xmm0,-0x1a8(%rbp)
ff
movsd  0xb77(%rip),%xmm0
movsd  %xmm0,-0x1a0(%rbp)
ff
movsd  0xb5f(%rip),%xmm0
movsd  %xmm0,-0x198(%rbp)
ff
movsd  0xb47(%rip),%xmm0
movsd  %xmm0,-0x190(%rbp)
ff
movsd  0xb2f(%rip),%xmm0
movsd  %xmm0,-0x188(%rbp)
ff
movsd  0xb17(%rip),%xmm0
movsd  %xmm0,-0x180(%rbp)
ff
movsd  0xaff(%rip),%xmm0
movsd  %xmm0,-0x178(%rbp)
ff
movsd  0xae7(%rip),%xmm0
movsd  %xmm0,-0x170(%rbp)
ff
movsd  0xacf(%rip),%xmm0
movsd  %xmm0,-0x168(%rbp)
ff
movsd  0xab7(%rip),%xmm0
movsd  %xmm0,-0x160(%rbp)
ff
movsd  0xa9f(%rip),%xmm0
movsd  %xmm0,-0x158(%rbp)
ff
movsd  0xa87(%rip),%xmm0
movsd  %xmm0,-0x150(%rbp)
ff
movsd  0xa6f(%rip),%xmm0
movsd  %xmm0,-0x148(%rbp)
ff
movsd  0xa57(%rip),%xmm0
movsd  %xmm0,-0x140(%rbp)
ff
movsd  0xa3f(%rip),%xmm0
movsd  %xmm0,-0x138(%rbp)
ff
movsd  0xa27(%rip),%xmm0
movsd  %xmm0,-0x130(%rbp)
movsd  0xa0f(%rip),%xmm0
movsd  %xmm0,-0x128(%rbp)
ff
movsd  0x9f7(%rip),%xmm0
movsd  %xmm0,-0x120(%rbp)
ff
movsd  0x9df(%rip),%xmm0
movsd  %xmm0,-0x118(%rbp)
ff
mov    -0x8(%rbp),%rax
movsd  0x9c3(%rip),%xmm0
ucomisd (%rax),%xmm0
jb     167b <qd_exp+0x4bb>
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1a0b <qd_exp+0x84b>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xbad(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     16ce <qd_exp+0x50e>
mov    -0x10(%rbp),%rax
movsd  0xbaf(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1a0b <qd_exp+0x84b>
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   10d0 <qd_is_zero@plt>
cmp    $0x1,%eax
jne    171b <qd_exp+0x55b>
mov    -0x10(%rbp),%rax
movsd  0xb42(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1a0b <qd_exp+0x84b>
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   10b0 <qd_is_one@plt>
cmp    $0x1,%eax
jne    1777 <qd_exp+0x5b7>
mov    -0x10(%rbp),%rax
movsd  0xaed(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movsd  0xad5(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movsd  0xabc(%rip),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x10(%rbp),%rax
movsd  0xaa3(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1a0b <qd_exp+0x84b>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xa81(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xaad(%rip),%xmm1
addsd  %xmm1,%xmm0
call   10e0 <floor@plt>
movsd  %xmm0,-0x70(%rbp)
movsd  0xa5f(%rip),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0xa47(%rip),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0xa2f(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  0xa17(%rip),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
lea    -0xa0(%rbp),%rdi
movsd  -0x70(%rbp),%xmm0
lea    -0xa0(%rbp),%rsi
mov    $0x1,%al
call   1090 <qd_mul_d@plt>
mov    -0x8(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
lea    -0xa0(%rbp),%rdx
mov    $0x0,%al
call   1030 <qd_sub@plt>
lea    -0xa0(%rbp),%rdi
movsd  -0x20(%rbp),%xmm0
lea    -0xa0(%rbp),%rsi
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
lea    -0xa0(%rbp),%rdi
lea    -0xe0(%rbp),%rsi
mov    $0x0,%al
call   1060 <qd_sqr@plt>
lea    -0xe0(%rbp),%rdi
lea    -0xc0(%rbp),%rsi
movsd  0x9e7(%rip),%xmm0
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
lea    -0xc0(%rbp),%rdi
lea    -0xa0(%rbp),%rsi
lea    -0xc0(%rbp),%rdx
mov    $0x0,%al
call   1070 <qd_add@plt>
movl   $0x0,-0x104(%rbp)
movsd  0x95a(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
lea    -0xa0(%rbp),%rdi
lea    -0xe0(%rbp),%rsi
lea    -0xe0(%rbp),%rdx
mov    $0x0,%al
call   10a0 <qd_mul@plt>
mov    -0x104(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x104(%rbp)
shl    $0x2,%eax
movslq %eax,%rcx
lea    -0x2f0(%rbp),%rax
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x110(%rbp)
lea    -0xe0(%rbp),%rdi
mov    -0x110(%rbp),%rsi
lea    -0x100(%rbp),%rdx
mov    $0x0,%al
call   10a0 <qd_mul@plt>
lea    -0xc0(%rbp),%rdi
lea    -0x100(%rbp),%rsi
lea    -0xc0(%rbp),%rdx
mov    $0x0,%al
call   1070 <qd_add@plt>
movsd  -0x100(%rbp),%xmm0
ff
movaps 0x939(%rip),%xmm1
pand   %xmm1,%xmm0
xor    %eax,%eax
ucomisd -0x78(%rbp),%xmm0
mov    %al,-0x2f1(%rbp)
jbe    194e <qd_exp+0x78e>
cmpl   $0x9,-0x104(%rbp)
setl   %al
mov    %al,-0x2f1(%rbp)
mov    -0x2f1(%rbp),%al
test   $0x1,%al
jne    1898 <qd_exp+0x6d8>
movl   $0x0,-0x104(%rbp)
cmpl   $0x10,-0x104(%rbp)
jge    19d5 <qd_exp+0x815>
lea    -0xc0(%rbp),%rdi
lea    -0xe0(%rbp),%rsi
movsd  0x8bf(%rip),%xmm0
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
lea    -0xc0(%rbp),%rdi
lea    -0x100(%rbp),%rsi
mov    $0x0,%al
call   1060 <qd_sqr@plt>
lea    -0xe0(%rbp),%rdi
lea    -0x100(%rbp),%rsi
lea    -0xc0(%rbp),%rdx
mov    $0x0,%al
call   1070 <qd_add@plt>
mov    -0x104(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x104(%rbp)
jmp    1966 <qd_exp+0x7a6>
lea    -0xc0(%rbp),%rdi
mov    -0x10(%rbp),%rsi
movsd  0x848(%rip),%xmm0
mov    $0x1,%al
call   10c0 <qd_add_d@plt>
cvttsd2si -0x70(%rbp),%eax
mov    %eax,-0x104(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x104(%rbp),%esi
mov    $0x0,%al
call   1050 <qd_ldexp@plt>
add    $0x300,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<qd_exp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x288,%rsp
mov    %rsi,%rbp
mov    %rdi,%rbx
movsd  0xe21(%rip),%xmm0
mov    $0x10,%edi
call   1040 <ldexp@plt>
movaps %xmm0,%xmm2
movaps 0xe4d(%rip),%xmm0
movaps %xmm0,0x80(%rsp)
movaps 0xe4e(%rip),%xmm0
movaps %xmm0,0x90(%rsp)
movaps 0xe4f(%rip),%xmm0
movaps %xmm0,0xa0(%rsp)
movaps 0xe50(%rip),%xmm0
movaps %xmm0,0xb0(%rsp)
movaps 0xe51(%rip),%xmm0
movaps %xmm0,0xc0(%rsp)
movaps 0xe52(%rip),%xmm0
movaps %xmm0,0xd0(%rsp)
movaps 0xe53(%rip),%xmm0
movaps %xmm0,0xe0(%rsp)
movaps 0xe54(%rip),%xmm0
movaps %xmm0,0xf0(%rsp)
movaps 0xe55(%rip),%xmm0
movaps %xmm0,0x100(%rsp)
movaps 0xe56(%rip),%xmm0
movaps %xmm0,0x110(%rsp)
movaps 0xe57(%rip),%xmm0
movaps %xmm0,0x120(%rsp)
movaps 0xe58(%rip),%xmm0
movaps %xmm0,0x130(%rsp)
movaps 0xe59(%rip),%xmm0
movaps %xmm0,0x140(%rsp)
movaps 0xe5a(%rip),%xmm0
movaps %xmm0,0x150(%rsp)
movaps 0xe5b(%rip),%xmm0
movaps %xmm0,0x160(%rsp)
movaps 0xe5c(%rip),%xmm0
movaps %xmm0,0x170(%rsp)
movaps 0xe5d(%rip),%xmm0
movaps %xmm0,0x180(%rsp)
movaps 0xe5e(%rip),%xmm0
movaps %xmm0,0x190(%rsp)
movaps 0xe5f(%rip),%xmm0
movaps %xmm0,0x1a0(%rsp)
movaps 0xe60(%rip),%xmm0
movaps %xmm0,0x1b0(%rsp)
movaps 0xe61(%rip),%xmm0
movaps %xmm0,0x1c0(%rsp)
movaps 0xe62(%rip),%xmm0
movaps %xmm0,0x1d0(%rsp)
movaps 0xe63(%rip),%xmm0
movaps %xmm0,0x1e0(%rsp)
movaps 0xe64(%rip),%xmm0
movaps %xmm0,0x1f0(%rsp)
movaps 0xe65(%rip),%xmm0
movaps %xmm0,0x200(%rsp)
movaps 0xe66(%rip),%xmm0
movaps %xmm0,0x210(%rsp)
movaps 0xe67(%rip),%xmm0
movaps %xmm0,0x220(%rsp)
movaps 0xe68(%rip),%xmm0
movaps %xmm0,0x230(%rsp)
movaps 0xe69(%rip),%xmm0
movaps %xmm0,0x240(%rsp)
movaps 0xe6a(%rip),%xmm0
movaps %xmm0,0x250(%rsp)
movsd  (%rbx),%xmm0
movsd  0xc4e(%rip),%xmm1
ucomisd %xmm0,%xmm1
jae    13eb <qd_exp+0x22b>
ucomisd 0xc48(%rip),%xmm0
jae    13fb <qd_exp+0x23b>
movsd  %xmm2,0x8(%rsp)
mov    %rbx,%rdi
xor    %eax,%eax
call   10d0 <qd_is_zero@plt>
cmp    $0x1,%eax
jne    142c <qd_exp+0x26c>
movabs $0x3ff0000000000000,%rax
jmp    1405 <qd_exp+0x245>
xorpd  %xmm0,%xmm0
movupd %xmm0,0x10(%rbp)
movupd %xmm0,0x0(%rbp)
jmp    141a <qd_exp+0x25a>
movabs $0xbff0000000000000,%rax
mov    %rax,0x0(%rbp)
xorpd  %xmm0,%xmm0
movupd %xmm0,0x8(%rbp)
movq   $0x0,0x18(%rbp)
add    $0x288,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rbx,%rdi
xor    %eax,%eax
call   10b0 <qd_is_one@plt>
cmp    $0x1,%eax
jne    1455 <qd_exp+0x295>
movaps 0xe0e(%rip),%xmm0
movups %xmm0,0x0(%rbp)
movapd 0xe12(%rip),%xmm0
movupd %xmm0,0x10(%rbp)
jmp    141a <qd_exp+0x25a>
mov    %rbp,0x18(%rsp)
movsd  0xb9e(%rip),%xmm0
divsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  (%rbx),%xmm0
divsd  0xb9e(%rip),%xmm0
addsd  0xb9e(%rip),%xmm0
call   10e0 <floor@plt>
movaps 0xd92(%rip),%xmm1
movaps %xmm1,0x60(%rsp)
movapd 0xd95(%rip),%xmm1
movapd %xmm1,0x70(%rsp)
lea    0x60(%rsp),%r15
mov    %r15,%rdi
movsd  %xmm0,0x10(%rsp)
mov    %r15,%rsi
mov    $0x1,%al
call   1090 <qd_mul_d@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    %r15,%rdx
xor    %eax,%eax
call   1030 <qd_sub@plt>
mov    %r15,%rdi
movsd  0x8(%rsp),%xmm0
mov    %r15,%rsi
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
lea    0x260(%rsp),%r13
mov    %r15,%rdi
mov    %r13,%rsi
xor    %eax,%eax
call   1060 <qd_sqr@plt>
lea    0x40(%rsp),%r12
mov    %r13,%rdi
movsd  0xb1f(%rip),%xmm0
mov    %r12,%rsi
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
mov    %r12,%rdi
mov    %r15,%rsi
mov    %r12,%rdx
xor    %eax,%eax
call   1070 <qd_add@plt>
movsd  0x8(%rsp),%xmm0
mulsd  0xaff(%rip),%xmm0
lea    0x80(%rsp),%rbx
lea    0x20(%rsp),%rbp
xor    %r14d,%r14d
movsd  %xmm0,0x8(%rsp)
nop
mov    %r15,%rdi
mov    %r13,%rsi
mov    %r13,%rdx
xor    %eax,%eax
call   10a0 <qd_mul@plt>
mov    %r13,%rdi
mov    %rbx,%rsi
mov    %rbp,%rdx
xor    %eax,%eax
call   10a0 <qd_mul@plt>
mov    %r12,%rdi
mov    %rbp,%rsi
mov    %r12,%rdx
xor    %eax,%eax
call   1070 <qd_add@plt>
movsd  0x20(%rsp),%xmm0
andpd  0xcc2(%rip),%xmm0
ucomisd 0x8(%rsp),%xmm0
jbe    1597 <qd_exp+0x3d7>
lea    0x1(%r14),%rax
add    $0x20,%rbx
cmp    $0x8,%r14
mov    %rax,%r14
jb     1540 <qd_exp+0x380>
mov    $0x10,%ebp
lea    0x40(%rsp),%rbx
lea    0x260(%rsp),%r15
lea    0x20(%rsp),%r14
xchg   %ax,%ax
mov    %rbx,%rdi
movsd  0xa75(%rip),%xmm0
mov    %r15,%rsi
mov    $0x1,%al
call   1080 <qd_mul_pwr2@plt>
mov    %rbx,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1060 <qd_sqr@plt>
mov    %r15,%rdi
mov    %r14,%rsi
mov    %rbx,%rdx
xor    %eax,%eax
call   1070 <qd_add@plt>
add    $0xffffffff,%ebp
jne    15b0 <qd_exp+0x3f0>
lea    0x40(%rsp),%rdi
movsd  0xa0c(%rip),%xmm0
mov    0x18(%rsp),%rbx
mov    %rbx,%rsi
mov    $0x1,%al
call   10c0 <qd_add_d@plt>
cvttsd2si 0x10(%rsp),%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <qd_ldexp@plt>
jmp    141a <qd_exp+0x25a>

LLVM IR (-O0):
define void @qd_exp(double* %0, double* %1) {
%3 = alloca double*
%4 = alloca double*
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca [4 x double]
%19 = alloca [4 x double]
%20 = alloca [4 x double]
%21 = alloca [4 x double]
%22 = alloca i32
%23 = alloca double*
%24 = alloca [60 x double]
store double* %0, double** %3
store double* %1, double** %4
%25 = call double @ldexp(double 1.000000e+00, i32 16)
store double %25, double* %5
%26 = load double, double* %5
%27 = fdiv double 1.000000e+00, %26
store double %27, double* %6
store double 0x4005BF0A8B145769, double* %7
store double 0x3CA4D57EE2B1013A, double* %8
store double 0xB92618713A31D3E2, double* %9
store double 0x35CC5A6D2B53C26C, double* %10
store double 0x3FE62E42FEFA39EF, double* %11
store double 0x3C7ABC9E3B39803F, double* %12
store double 0x3907B57A079A1934, double* %13
store double 0xB5AACE93A4EBE5D1, double* %14
store double 0x32DFFFFFFFFFFFE1, double* %15
%28 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 0
store double 0x3FC5555555555555, double* %28
%29 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 1
store double 0x3C65555555555555, double* %29
%30 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 2
store double 0x3905555555555555, double* %30
%31 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 3
store double 0x35A5555555555555, double* %31
%32 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 4
store double 0x3FA5555555555555, double* %32
%33 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 5
store double 0x3C45555555555555, double* %33
%34 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 6
store double 0x38E5555555555555, double* %34
%35 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 7
store double 0x3585555555555555, double* %35
%36 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 8
store double 0x3F81111111111111, double* %36
%37 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 9
store double 0x3C01111111111111, double* %37
%38 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 10
store double 0x3881111111111111, double* %38
%39 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 11
store double 0x3501111111111111, double* %39
%40 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 12
store double 0x3F56C16C16C16C17, double* %40
%41 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 13
store double 0xBBEF49F49F49F49F, double* %41
%42 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 14
store double 0xB8827D27D27D27D2, double* %42
%43 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 15
store double 0xB52F49F49F49F49F, double* %43
%44 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 16
store double 0x3F2A01A01A01A01A, double* %44
%45 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 17
store double 0x3B6A01A01A01A01A, double* %45
%46 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 18
store double 0x37AA01A01A01A01A, double* %46
%47 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 19
store double 0x33EA01A01A01A01A, double* %47
%48 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 20
store double 0x3EFA01A01A01A01A, double* %48
%49 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 21
store double 0x3B3A01A01A01A01A, double* %49
%50 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 22
store double 0x377A01A01A01A01A, double* %50
%51 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 23
store double 0x33BA01A01A01A01A, double* %51
%52 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 24
store double 0x3EC71DE3A556C734, double* %52
%53 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 25
store double 0xBB6C154F8DDC6C00, double* %53
%54 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 26
store double 0x38071DE3A556C734, double* %54
%55 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 27
store double 0xB4AC154F8DDC6C00, double* %55
%56 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 28
store double 0x3E927E4FB7789F5C, double* %56
%57 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 29
store double 0x3B3CBBC05B4FA99A, double* %57
%58 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 30
store double 0xB7BC6D278883E8F5, double* %58
%59 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 31
store double 0x34595567D3A50CCE, double* %59
%60 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 32
store double 0x3E5AE64567F544E4, double* %60
%61 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 33
store double 0xBAFC062E06D1F209, double* %61
%62 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 34
store double 0x377C7880ADCBC46E, double* %62
%63 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 35
store double 0xB415553A6F0FED60, double* %63
%64 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 36
store double 0x3E21EED8EFF8D898, double* %64
%65 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 37
store double 0xBAC2AEC959E14C06, double* %65
%66 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 38
store double 0x3742FB0073DD2D9E, double* %66
%67 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 39
store double 0x33EC71D90B4AB715, double* %67
%68 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 40
store double 0x3DE6124613A86D09, double* %68
%69 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 41
store double 0x3A8F28E0CC748EBE, double* %69
%70 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 42
store double 0xB727B2C4C8A840BC, double* %70
%71 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 43
store double 0x33CC71CCA1034C07, double* %71
%72 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 44
store double 0x3DA93974A8C07C9D, double* %72
%73 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 45
store double 0x3A305D6F8A2EFD1F, double* %73
%74 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 46
store double 0x36C3AA3346236A5D, double* %74
%75 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 47
store double 0x336D75F096EA801E, double* %75
%76 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 48
store double 0x3D6AE7F3E733B81F, double* %76
%77 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 49
store double 0x39E1D8656B0EE8CB, double* %77
%78 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 50
store double 0xB626E142A138F825, double* %78
%79 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 51
store double 0x32B43C0C38CCDCC6, double* %79
%80 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 52
store double 0x3D2AE7F3E733B81F, double* %80
%81 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 53
store double 0x39A1D8656B0EE8CB, double* %81
%82 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 54
store double 0xB5E6E142A138F825, double* %82
%83 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 55
store double 0x32743C0C38CCDCC6, double* %83
%84 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 56
store double 0x3CE952C77030AD4A, double* %84
%85 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 57
store double 0x398AC981465DDC6C, double* %85
%86 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 58
store double 0xB5A588B72E53BC5F, double* %86
%87 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 59
store double 0x3227079E8909271A, double* %87
%88 = load double*, double** %3
%89 = getelementptr inbounds double, double* %88, i64 0
%90 = load double, double* %89
%91 = fcmp ole double %90, -7.090000e+02
br i1 %91, label %92, label %101
92: ; preds = %2
%93 = load double*, double** %4
%94 = getelementptr inbounds double, double* %93, i64 0
store double 0.000000e+00, double* %94
%95 = load double*, double** %4
%96 = getelementptr inbounds double, double* %95, i64 1
store double 0.000000e+00, double* %96
%97 = load double*, double** %4
%98 = getelementptr inbounds double, double* %97, i64 2
store double 0.000000e+00, double* %98
%99 = load double*, double** %4
%100 = getelementptr inbounds double, double* %99, i64 3
store double 0.000000e+00, double* %100
br label %232
101: ; preds = %2
%102 = load double*, double** %3
%103 = getelementptr inbounds double, double* %102, i64 0
%104 = load double, double* %103
%105 = fcmp oge double %104, 7.090000e+02
br i1 %105, label %106, label %115
106: ; preds = %101
%107 = load double*, double** %4
%108 = getelementptr inbounds double, double* %107, i64 0
store double -1.000000e+00, double* %108
%109 = load double*, double** %4
%110 = getelementptr inbounds double, double* %109, i64 1
store double 0.000000e+00, double* %110
%111 = load double*, double** %4
%112 = getelementptr inbounds double, double* %111, i64 2
store double 0.000000e+00, double* %112
%113 = load double*, double** %4
%114 = getelementptr inbounds double, double* %113, i64 3
store double 0.000000e+00, double* %114
br label %232
115: ; preds = %101
%116 = load double*, double** %3
%117 = call i32 (double*, ...) bitcast (i32 (...)* @qd_is_zero to i32 (double*, ...)*)(double* %116)
%118 = icmp eq i32 %117, 1
br i1 %118, label %119, label %128
119: ; preds = %115
%120 = load double*, double** %4
%121 = getelementptr inbounds double, double* %120, i64 0
store double 1.000000e+00, double* %121
%122 = load double*, double** %4
%123 = getelementptr inbounds double, double* %122, i64 1
store double 0.000000e+00, double* %123
%124 = load double*, double** %4
%125 = getelementptr inbounds double, double* %124, i64 2
store double 0.000000e+00, double* %125
%126 = load double*, double** %4
%127 = getelementptr inbounds double, double* %126, i64 3
store double 0.000000e+00, double* %127
br label %232
128: ; preds = %115
%129 = load double*, double** %3
%130 = call i32 (double*, ...) bitcast (i32 (...)* @qd_is_one to i32 (double*, ...)*)(double* %129)
%131 = icmp eq i32 %130, 1
br i1 %131, label %132, label %141
132: ; preds = %128
%133 = load double*, double** %4
%134 = getelementptr inbounds double, double* %133, i64 0
store double 0x4005BF0A8B145769, double* %134
%135 = load double*, double** %4
%136 = getelementptr inbounds double, double* %135, i64 1
store double 0x3CA4D57EE2B1013A, double* %136
%137 = load double*, double** %4
%138 = getelementptr inbounds double, double* %137, i64 2
store double 0xB92618713A31D3E2, double* %138
%139 = load double*, double** %4
%140 = getelementptr inbounds double, double* %139, i64 3
store double 0x35CC5A6D2B53C26C, double* %140
br label %232
141: ; preds = %128
%142 = load double*, double** %3
%143 = getelementptr inbounds double, double* %142, i64 0
%144 = load double, double* %143
%145 = fdiv double %144, 0x3FE62E42FEFA39EF
%146 = fadd double %145, 5.000000e-01
%147 = call double @llvm.floor.f64(double %146)
store double %147, double* %16
%148 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
store double 0x3FE62E42FEFA39EF, double* %148
%149 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 1
store double 0x3C7ABC9E3B39803F, double* %149
%150 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 2
store double 0x3907B57A079A1934, double* %150
%151 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 3
store double 0xB5AACE93A4EBE5D1, double* %151
%152 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%153 = load double, double* %16
%154 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%155 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_d to i32 (double*, double, double*, ...)*)(double* %152, double %153, double* %154)
%156 = load double*, double** %3
%157 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%158 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%159 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_sub to i32 (double*, double*, double*, ...)*)(double* %156, double* %157, double* %158)
%160 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%161 = load double, double* %6
%162 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%163 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %160, double %161, double* %162)
%164 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%165 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%166 = call i32 (double*, double*, ...) bitcast (i32 (...)* @qd_sqr to i32 (double*, double*, ...)*)(double* %164, double* %165)
%167 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%168 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%169 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %167, double 5.000000e-01, double* %168)
%170 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%171 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%172 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%173 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %170, double* %171, double* %172)
store i32 0, i32* %22
%174 = load double, double* %6
%175 = fmul double %174, 0x32DFFFFFFFFFFFE1
store double %175, double* %17
br label %176
176: ; preds = %203, %141
%177 = getelementptr inbounds [4 x double], [4 x double]* %18, i64 0, i64 0
%178 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%179 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%180 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_mul to i32 (double*, double*, double*, ...)*)(double* %177, double* %178, double* %179)
%181 = load i32, i32* %22
%182 = add nsw i32 %181, 1
store i32 %182, i32* %22
%183 = mul nsw i32 4, %181
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds [60 x double], [60 x double]* %24, i64 0, i64 %184
store double* %185, double** %23
%186 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%187 = load double*, double** %23
%188 = getelementptr inbounds [4 x double], [4 x double]* %21, i64 0, i64 0
%189 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_mul to i32 (double*, double*, double*, ...)*)(double* %186, double* %187, double* %188)
%190 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%191 = getelementptr inbounds [4 x double], [4 x double]* %21, i64 0, i64 0
%192 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%193 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %190, double* %191, double* %192)
br label %194
194: ; preds = %176
%195 = getelementptr inbounds [4 x double], [4 x double]* %21, i64 0, i64 0
%196 = load double, double* %195
%197 = call double @llvm.fabs.f64(double %196)
%198 = load double, double* %17
%199 = fcmp ogt double %197, %198
br i1 %199, label %200, label %203
200: ; preds = %194
%201 = load i32, i32* %22
%202 = icmp slt i32 %201, 9
br label %203
203: ; preds = %200, %194
%204 = phi i1 [ false, %194 ], [ %202, %200 ]
br i1 %204, label %176, label %205
205: ; preds = %203
store i32 0, i32* %22
br label %206
206: ; preds = %220, %205
%207 = load i32, i32* %22
%208 = icmp slt i32 %207, 16
br i1 %208, label %209, label %223
209: ; preds = %206
%210 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%211 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%212 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %210, double 2.000000e+00, double* %211)
%213 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%214 = getelementptr inbounds [4 x double], [4 x double]* %21, i64 0, i64 0
%215 = call i32 (double*, double*, ...) bitcast (i32 (...)* @qd_sqr to i32 (double*, double*, ...)*)(double* %213, double* %214)
%216 = getelementptr inbounds [4 x double], [4 x double]* %20, i64 0, i64 0
%217 = getelementptr inbounds [4 x double], [4 x double]* %21, i64 0, i64 0
%218 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%219 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %216, double* %217, double* %218)
br label %220
220: ; preds = %209
%221 = load i32, i32* %22
%222 = add nsw i32 %221, 1
store i32 %222, i32* %22
br label %206
223: ; preds = %206
%224 = getelementptr inbounds [4 x double], [4 x double]* %19, i64 0, i64 0
%225 = load double*, double** %4
%226 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_add_d to i32 (double*, double, double*, ...)*)(double* %224, double 1.000000e+00, double* %225)
%227 = load double, double* %16
%228 = fptosi double %227 to i32
store i32 %228, i32* %22
%229 = load double*, double** %4
%230 = load i32, i32* %22
%231 = call i32 (double*, i32, ...) bitcast (i32 (...)* @qd_ldexp to i32 (double*, i32, ...)*)(double* %229, i32 %230)
br label %232
232: ; preds = %223, %132, %119, %106, %92
ret void
}

LLVM IR (-O2):
define void @qd_exp(double* %0, double* %1) {
%3 = alloca [4 x double]
%4 = alloca [4 x double]
%5 = alloca [4 x double]
%6 = alloca [4 x double]
%7 = alloca [60 x double]
%8 = tail call double @ldexp(double 1.000000e+00, i32 16)
%9 = fdiv double 1.000000e+00, %8
%10 = bitcast [4 x double]* %3 to i8*
%11 = bitcast [4 x double]* %4 to i8*
%12 = bitcast [4 x double]* %5 to i8*
%13 = bitcast [4 x double]* %6 to i8*
%14 = bitcast [60 x double]* %7 to i8*
%15 = bitcast [60 x double]* %7 to <2 x double>*
store <2 x double> <double 0x3FC5555555555555, double 0x3C65555555555555>, <2 x double>* %15
%16 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 2
%17 = bitcast double* %16 to <2 x double>*
store <2 x double> <double 0x3905555555555555, double 0x35A5555555555555>, <2 x double>* %17
%18 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 4
%19 = bitcast double* %18 to <2 x double>*
store <2 x double> <double 0x3FA5555555555555, double 0x3C45555555555555>, <2 x double>* %19
%20 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 6
%21 = bitcast double* %20 to <2 x double>*
store <2 x double> <double 0x38E5555555555555, double 0x3585555555555555>, <2 x double>* %21
%22 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 8
%23 = bitcast double* %22 to <2 x double>*
store <2 x double> <double 0x3F81111111111111, double 0x3C01111111111111>, <2 x double>* %23
%24 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 10
%25 = bitcast double* %24 to <2 x double>*
store <2 x double> <double 0x3881111111111111, double 0x3501111111111111>, <2 x double>* %25
%26 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 12
%27 = bitcast double* %26 to <2 x double>*
store <2 x double> <double 0x3F56C16C16C16C17, double 0xBBEF49F49F49F49F>, <2 x double>* %27
%28 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 14
%29 = bitcast double* %28 to <2 x double>*
store <2 x double> <double 0xB8827D27D27D27D2, double 0xB52F49F49F49F49F>, <2 x double>* %29
%30 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 16
%31 = bitcast double* %30 to <2 x double>*
store <2 x double> <double 0x3F2A01A01A01A01A, double 0x3B6A01A01A01A01A>, <2 x double>* %31
%32 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 18
%33 = bitcast double* %32 to <2 x double>*
store <2 x double> <double 0x37AA01A01A01A01A, double 0x33EA01A01A01A01A>, <2 x double>* %33
%34 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 20
%35 = bitcast double* %34 to <2 x double>*
store <2 x double> <double 0x3EFA01A01A01A01A, double 0x3B3A01A01A01A01A>, <2 x double>* %35
%36 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 22
%37 = bitcast double* %36 to <2 x double>*
store <2 x double> <double 0x377A01A01A01A01A, double 0x33BA01A01A01A01A>, <2 x double>* %37
%38 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 24
%39 = bitcast double* %38 to <2 x double>*
store <2 x double> <double 0x3EC71DE3A556C734, double 0xBB6C154F8DDC6C00>, <2 x double>* %39
%40 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 26
%41 = bitcast double* %40 to <2 x double>*
store <2 x double> <double 0x38071DE3A556C734, double 0xB4AC154F8DDC6C00>, <2 x double>* %41
%42 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 28
%43 = bitcast double* %42 to <2 x double>*
store <2 x double> <double 0x3E927E4FB7789F5C, double 0x3B3CBBC05B4FA99A>, <2 x double>* %43
%44 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 30
%45 = bitcast double* %44 to <2 x double>*
store <2 x double> <double 0xB7BC6D278883E8F5, double 0x34595567D3A50CCE>, <2 x double>* %45
%46 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 32
%47 = bitcast double* %46 to <2 x double>*
store <2 x double> <double 0x3E5AE64567F544E4, double 0xBAFC062E06D1F209>, <2 x double>* %47
%48 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 34
%49 = bitcast double* %48 to <2 x double>*
store <2 x double> <double 0x377C7880ADCBC46E, double 0xB415553A6F0FED60>, <2 x double>* %49
%50 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 36
%51 = bitcast double* %50 to <2 x double>*
store <2 x double> <double 0x3E21EED8EFF8D898, double 0xBAC2AEC959E14C06>, <2 x double>* %51
%52 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 38
%53 = bitcast double* %52 to <2 x double>*
store <2 x double> <double 0x3742FB0073DD2D9E, double 0x33EC71D90B4AB715>, <2 x double>* %53
%54 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 40
%55 = bitcast double* %54 to <2 x double>*
store <2 x double> <double 0x3DE6124613A86D09, double 0x3A8F28E0CC748EBE>, <2 x double>* %55
%56 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 42
%57 = bitcast double* %56 to <2 x double>*
store <2 x double> <double 0xB727B2C4C8A840BC, double 0x33CC71CCA1034C07>, <2 x double>* %57
%58 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 44
%59 = bitcast double* %58 to <2 x double>*
store <2 x double> <double 0x3DA93974A8C07C9D, double 0x3A305D6F8A2EFD1F>, <2 x double>* %59
%60 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 46
%61 = bitcast double* %60 to <2 x double>*
store <2 x double> <double 0x36C3AA3346236A5D, double 0x336D75F096EA801E>, <2 x double>* %61
%62 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 48
%63 = bitcast double* %62 to <2 x double>*
store <2 x double> <double 0x3D6AE7F3E733B81F, double 0x39E1D8656B0EE8CB>, <2 x double>* %63
%64 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 50
%65 = bitcast double* %64 to <2 x double>*
store <2 x double> <double 0xB626E142A138F825, double 0x32B43C0C38CCDCC6>, <2 x double>* %65
%66 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 52
%67 = bitcast double* %66 to <2 x double>*
store <2 x double> <double 0x3D2AE7F3E733B81F, double 0x39A1D8656B0EE8CB>, <2 x double>* %67
%68 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 54
%69 = bitcast double* %68 to <2 x double>*
store <2 x double> <double 0xB5E6E142A138F825, double 0x32743C0C38CCDCC6>, <2 x double>* %69
%70 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 56
%71 = bitcast double* %70 to <2 x double>*
store <2 x double> <double 0x3CE952C77030AD4A, double 0x398AC981465DDC6C>, <2 x double>* %71
%72 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 58
%73 = bitcast double* %72 to <2 x double>*
store <2 x double> <double 0xB5A588B72E53BC5F, double 0x3227079E8909271A>, <2 x double>* %73
%74 = load double, double* %0
%75 = fcmp ugt double %74, -7.090000e+02
br i1 %75, label %78, label %76
76: ; preds = %2
%77 = bitcast double* %1 to i8*
br label %139
78: ; preds = %2
%79 = fcmp ult double %74, 7.090000e+02
br i1 %79, label %83, label %80
80: ; preds = %78
store double -1.000000e+00, double* %1
%81 = getelementptr inbounds double, double* %1, i64 1
%82 = bitcast double* %81 to i8*
br label %139
83: ; preds = %78
%84 = tail call i32 (double*, ...) bitcast (i32 (...)* @qd_is_zero to i32 (double*, ...)*)(double* %0)
%85 = icmp eq i32 %84, 1
br i1 %85, label %86, label %89
86: ; preds = %83
store double 1.000000e+00, double* %1
%87 = getelementptr inbounds double, double* %1, i64 1
%88 = bitcast double* %87 to i8*
br label %139
89: ; preds = %83
%90 = tail call i32 (double*, ...) bitcast (i32 (...)* @qd_is_one to i32 (double*, ...)*)(double* %0)
%91 = icmp eq i32 %90, 1
br i1 %91, label %92, label %96
92: ; preds = %89
%93 = bitcast double* %1 to <2 x double>*
store <2 x double> <double 0x4005BF0A8B145769, double 0x3CA4D57EE2B1013A>, <2 x double>* %93
%94 = getelementptr inbounds double, double* %1, i64 2
%95 = bitcast double* %94 to <2 x double>*
store <2 x double> <double 0xB92618713A31D3E2, double 0x35CC5A6D2B53C26C>, <2 x double>* %95
br label %139
96: ; preds = %89
%97 = load double, double* %0
%98 = fdiv double %97, 0x3FE62E42FEFA39EF
%99 = fadd double %98, 5.000000e-01
%100 = tail call double @llvm.floor.f64(double %99)
%101 = getelementptr inbounds [4 x double], [4 x double]* %3, i64 0, i64 0
%102 = bitcast [4 x double]* %3 to <2 x double>*
store <2 x double> <double 0x3FE62E42FEFA39EF, double 0x3C7ABC9E3B39803F>, <2 x double>* %102
%103 = getelementptr inbounds [4 x double], [4 x double]* %3, i64 0, i64 2
%104 = bitcast double* %103 to <2 x double>*
store <2 x double> <double 0x3907B57A079A1934, double 0xB5AACE93A4EBE5D1>, <2 x double>* %104
%105 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_d to i32 (double*, double, double*, ...)*)(double* %101, double %100, double* %101)
%106 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_sub to i32 (double*, double*, double*, ...)*)(double* %0, double* %101, double* %101)
%107 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %101, double %9, double* %101)
%108 = getelementptr inbounds [4 x double], [4 x double]* %5, i64 0, i64 0
%109 = call i32 (double*, double*, ...) bitcast (i32 (...)* @qd_sqr to i32 (double*, double*, ...)*)(double* %101, double* %108)
%110 = getelementptr inbounds [4 x double], [4 x double]* %4, i64 0, i64 0
%111 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %108, double 5.000000e-01, double* %110)
%112 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %110, double* %101, double* %110)
%113 = fmul double %9, 0x32DFFFFFFFFFFFE1
%114 = getelementptr inbounds [4 x double], [4 x double]* %6, i64 0, i64 0
br label %115
115: ; preds = %115, %96
%116 = phi i64 [ %118, %115 ], [ 0, %96 ]
%117 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_mul to i32 (double*, double*, double*, ...)*)(double* %101, double* %108, double* %108)
%118 = add nuw nsw i64 %116, 1
%119 = shl nuw nsw i64 %116, 2
%120 = getelementptr inbounds [60 x double], [60 x double]* %7, i64 0, i64 %119
%121 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_mul to i32 (double*, double*, double*, ...)*)(double* %108, double* %120, double* %114)
%122 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %110, double* %114, double* %110)
%123 = load double, double* %114
%124 = call double @llvm.fabs.f64(double %123)
%125 = fcmp ogt double %124, %113
%126 = icmp ult i64 %116, 8
%127 = select i1 %125, i1 %126, i1 false
br i1 %127, label %115, label %128
128: ; preds = %115, %128
%129 = phi i32 [ %133, %128 ], [ 0, %115 ]
%130 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_mul_pwr2 to i32 (double*, double, double*, ...)*)(double* %110, double 2.000000e+00, double* %108)
%131 = call i32 (double*, double*, ...) bitcast (i32 (...)* @qd_sqr to i32 (double*, double*, ...)*)(double* %110, double* %114)
%132 = call i32 (double*, double*, double*, ...) bitcast (i32 (...)* @qd_add to i32 (double*, double*, double*, ...)*)(double* %108, double* %114, double* %110)
%133 = add nuw nsw i32 %129, 1
%134 = icmp eq i32 %133, 16
br i1 %134, label %135, label %128
135: ; preds = %128
%136 = call i32 (double*, double, double*, ...) bitcast (i32 (...)* @qd_add_d to i32 (double*, double, double*, ...)*)(double* %110, double 1.000000e+00, double* %1)
%137 = fptosi double %100 to i32
%138 = call i32 (double*, i32, ...) bitcast (i32 (...)* @qd_ldexp to i32 (double*, i32, ...)*)(double* %1, i32 %137)
br label %139
139: ; preds = %135, %92, %86, %80, %76
ret void
}