void __amd_remainder_piby2d2f(unsigned long long ux, double *r, int *region) {
  unsigned long long u, carry, mask, mant, highbitsrr;
  double dx;
  unsigned long long res[500];
  int first, last, i, rexp, xexp, resexp, ltb, determ;
  static const double piby2 = 1.57079632679489655800e+00;
  const int bitsper = 10;
  static unsigned long long pibits[] = {
      0,   0,   0,   0,   0,   0,    162, 998,  54,  915,  580, 84,  671, 777,
      855, 839, 851, 311, 448, 877,  553, 358,  316, 270,  260, 127, 593, 398,
      701, 942, 965, 390, 882, 283,  570, 265,  221, 184,  6,   292, 750, 642,
      465, 584, 463, 903, 491, 114,  786, 617,  830, 930,  35,  381, 302, 749,
      72,  314, 412, 448, 619, 279,  894, 260,  921, 117,  569, 525, 307, 637,
      156, 529, 504, 751, 505, 160,  945, 1022, 151, 1023, 480, 358, 15,  956,
      753, 98,  858, 41,  721, 987,  310, 507,  242, 498,  777, 733, 244, 399,
      870, 633, 510, 651, 373, 158,  940, 506,  997, 965,  947, 833, 825, 990,
      165, 164, 746, 431, 949, 1004, 287, 565,  464, 533,  515, 193, 111, 798};
  xexp = (int)(((ux & 0x7ff0000000000000) >> 52) - 1023);
  ux = (ux & 0x000fffffffffffff) | 0x0010000000000000;
  mask = 1;
  mask = (mask << bitsper) - 1;
  first = xexp / bitsper;
  resexp = xexp - first * bitsper;
  last = first + 180 / bitsper;
  res[19] = 0;
  u = pibits[last] * ux;
  res[18] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 1] * ux + carry;
  res[17] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 2] * ux + carry;
  res[16] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 3] * ux + carry;
  res[15] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 4] * ux + carry;
  res[14] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 5] * ux + carry;
  res[13] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 6] * ux + carry;
  res[12] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 7] * ux + carry;
  res[11] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 8] * ux + carry;
  res[10] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 9] * ux + carry;
  res[9] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 10] * ux + carry;
  res[8] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 11] * ux + carry;
  res[7] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 12] * ux + carry;
  res[6] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 13] * ux + carry;
  res[5] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 14] * ux + carry;
  res[4] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 15] * ux + carry;
  res[3] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 16] * ux + carry;
  res[2] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 17] * ux + carry;
  res[1] = u & mask;
  carry = u >> bitsper;
  u = pibits[last - 18] * ux + carry;
  res[0] = u & mask;
  ltb = (int)((((res[0] << bitsper) | res[1]) >> (bitsper - 1 - resexp)) & 7);
  determ = ltb & 1;
  i = 1;
  if (determ) {
    *region = ((ltb >> 1) + 1) & 3;
    mant = 1;
    mant = ~(res[1]) & ((mant << (bitsper - resexp)) - 1);
    while (mant < 0x0020000000000000) {
      i++;
      mant = (mant << bitsper) | (~(res[i]) & mask);
    }
    highbitsrr = ~(res[i + 1]) << (64 - bitsper);
  } else {
    *region = (ltb >> 1);
    mant = 1;
    mant = res[1] & ((mant << (bitsper - resexp)) - 1);
    while (mant < 0x0020000000000000) {
      i++;
      mant = (mant << bitsper) | res[i];
    }
    highbitsrr = res[i + 1] << (64 - bitsper);
  }
  rexp = 52 + resexp - i * bitsper;
  while (mant >= 0x0020000000000000) {
    rexp++;
    highbitsrr = (highbitsrr >> 1) | ((mant & 1) << 63);
    mant >>= 1;
  }
  u = ((unsigned long long)rexp + 1023) << 52;
  ux = (mant & 0x000fffffffffffff) | u;
  if (determ)
    ux |= 0x8000000000000000;
  {
    volatile union {
      double d;
      unsigned long long i;
    } _bitsy;
    _bitsy.i = (ux);
    dx = _bitsy.d;
  };
  *r = dx * piby2;
  return;
}


x86 assembly (clang, -O0):
<__amd_remainder_piby2d2f>:
push   %rbp
mov    %rsp,%rbp
sub    $0xfa0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0xa,-0x1014(%rbp)
movabs $0x7ff0000000000000,%rax
and    -0x8(%rbp),%rax
shr    $0x34,%rax
sub    $0x3ff,%rax
mov    %eax,-0x1004(%rbp)
movabs $0xfffffffffffff,%rax
and    -0x8(%rbp),%rax
movabs $0x10000000000000,%rcx
or     %rcx,%rax
mov    %rax,-0x8(%rbp)
movq   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%rax
shl    $0xa,%rax
sub    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x1004(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0xff4(%rbp)
mov    -0x1004(%rbp),%eax
imul   $0xa,-0xff4(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x1008(%rbp)
mov    -0xff4(%rbp),%eax
add    $0x12,%eax
mov    %eax,-0xff8(%rbp)
movq   $0x0,-0xf58(%rbp)
movslq -0xff8(%rbp),%rcx
lea    0x2e69(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf60(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    0x2e2e(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf68(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x2,%eax
movslq %eax,%rcx
lea    0x2def(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf70(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x3,%eax
movslq %eax,%rcx
lea    0x2db0(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf78(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x4,%eax
movslq %eax,%rcx
lea    0x2d71(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf80(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x5,%eax
movslq %eax,%rcx
lea    0x2d32(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf88(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x6,%eax
movslq %eax,%rcx
lea    0x2cf3(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf90(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x7,%eax
movslq %eax,%rcx
lea    0x2cb4(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xf98(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x8,%eax
movslq %eax,%rcx
lea    0x2c75(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfa0(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x9,%eax
movslq %eax,%rcx
lea    0x2c36(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfa8(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xa,%eax
movslq %eax,%rcx
lea    0x2bf7(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfb0(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xb,%eax
movslq %eax,%rcx
lea    0x2bb8(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfb8(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xc,%eax
movslq %eax,%rcx
lea    0x2b79(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfc0(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xd,%eax
movslq %eax,%rcx
lea    0x2b3a(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfc8(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xe,%eax
movslq %eax,%rcx
lea    0x2afb(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfd0(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0xf,%eax
movslq %eax,%rcx
lea    0x2abc(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfd8(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x10,%eax
movslq %eax,%rcx
lea    0x2a7d(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfe0(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x11,%eax
movslq %eax,%rcx
lea    0x2a3e(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xfe8(%rbp)
mov    -0x20(%rbp),%rax
shr    $0xa,%rax
mov    %rax,-0x28(%rbp)
mov    -0xff8(%rbp),%eax
sub    $0x12,%eax
movslq %eax,%rcx
lea    0x29ff(%rip),%rax
mov    (%rax,%rcx,8),%rax
imul   -0x8(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
and    -0x30(%rbp),%rax
mov    %rax,-0xff0(%rbp)
mov    -0xff0(%rbp),%rax
shl    $0xa,%rax
or     -0xfe8(%rbp),%rax
mov    $0x9,%ecx
sub    -0x1008(%rbp),%ecx
mov    %ecx,%ecx
shr    %cl,%rax
and    $0x7,%rax
mov    %eax,-0x100c(%rbp)
mov    -0x100c(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x1010(%rbp)
movl   $0x1,-0xffc(%rbp)
cmpl   $0x0,-0x1010(%rbp)
je     175f <__amd_remainder_piby2d2f+0x65f>
mov    -0x100c(%rbp),%ecx
sar    $0x1,%ecx
add    $0x1,%ecx
and    $0x3,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movq   $0x1,-0x38(%rbp)
mov    -0xfe8(%rbp),%rax
xor    $0xffffffffffffffff,%rax
mov    -0x38(%rbp),%rdx
mov    $0xa,%ecx
sub    -0x1008(%rbp),%ecx
mov    %ecx,%ecx
shl    %cl,%rdx
mov    %rdx,%rcx
sub    $0x1,%rcx
and    %rcx,%rax
mov    %rax,-0x38(%rbp)
movabs $0x20000000000000,%rax
cmp    %rax,-0x38(%rbp)
jae    173b <__amd_remainder_piby2d2f+0x63b>
mov    -0xffc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xffc(%rbp)
mov    -0x38(%rbp),%rax
shl    $0xa,%rax
movslq -0xffc(%rbp),%rcx
mov    -0xff0(%rbp,%rcx,8),%rcx
ff
xor    $0xffffffffffffffff,%rcx
and    -0x30(%rbp),%rcx
or     %rcx,%rax
mov    %rax,-0x38(%rbp)
jmp    16ed <__amd_remainder_piby2d2f+0x5ed>
mov    -0xffc(%rbp),%eax
add    $0x1,%eax
cltq
mov    -0xff0(%rbp,%rax,8),%rax
ff
xor    $0xffffffffffffffff,%rax
shl    $0x36,%rax
mov    %rax,-0x40(%rbp)
jmp    17fd <__amd_remainder_piby2d2f+0x6fd>
mov    -0x100c(%rbp),%ecx
sar    $0x1,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movq   $0x1,-0x38(%rbp)
mov    -0xfe8(%rbp),%rax
mov    -0x38(%rbp),%rdx
mov    $0xa,%ecx
sub    -0x1008(%rbp),%ecx
mov    %ecx,%ecx
shl    %cl,%rdx
mov    %rdx,%rcx
sub    $0x1,%rcx
and    %rcx,%rax
mov    %rax,-0x38(%rbp)
movabs $0x20000000000000,%rax
cmp    %rax,-0x38(%rbp)
jae    17e2 <__amd_remainder_piby2d2f+0x6e2>
mov    -0xffc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xffc(%rbp)
mov    -0x38(%rbp),%rax
shl    $0xa,%rax
movslq -0xffc(%rbp),%rcx
or     -0xff0(%rbp,%rcx,8),%rax
ff
mov    %rax,-0x38(%rbp)
jmp    179f <__amd_remainder_piby2d2f+0x69f>
mov    -0xffc(%rbp),%eax
add    $0x1,%eax
cltq
mov    -0xff0(%rbp,%rax,8),%rax
ff
shl    $0x36,%rax
mov    %rax,-0x40(%rbp)
mov    -0x1008(%rbp),%eax
add    $0x34,%eax
imul   $0xa,-0xffc(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x1000(%rbp)
movabs $0x20000000000000,%rax
cmp    %rax,-0x38(%rbp)
jb     1864 <__amd_remainder_piby2d2f+0x764>
mov    -0x1000(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1000(%rbp)
mov    -0x40(%rbp),%rax
shr    $0x1,%rax
mov    -0x38(%rbp),%rcx
and    $0x1,%rcx
shl    $0x3f,%rcx
or     %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x38(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1815 <__amd_remainder_piby2d2f+0x715>
movslq -0x1000(%rbp),%rax
add    $0x3ff,%rax
shl    $0x34,%rax
mov    %rax,-0x20(%rbp)
movabs $0xfffffffffffff,%rax
and    -0x38(%rbp),%rax
or     -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
cmpl   $0x0,-0x1010(%rbp)
je     18ae <__amd_remainder_piby2d2f+0x7ae>
movabs $0x8000000000000000,%rax
or     -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x1020(%rbp)
movsd  -0x1020(%rbp),%xmm0
ff
movsd  %xmm0,-0x48(%rbp)
movsd  0x732(%rip),%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0xfa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__amd_remainder_piby2d2f>:
push   %rbx
sub    $0xf30,%rsp
movabs $0xfffffffffffff,%r8
mov    %rdi,%r11
shr    $0x34,%r11
and    $0x7ff,%r11d
add    $0xfffffc01,%r11d
mov    %rdi,%rax
and    %r8,%rax
lea    (%rax,%r8,1),%r9
add    $0x1,%r9
imul   $0x6667,%r11d,%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
sar    $0x12,%eax
add    %ecx,%eax
movswl %ax,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%r11d
movq   $0x0,0x28(%rsp)
lea    0xeaf(%rip),%r10
movswq %ax,%rcx
mov    0x90(%r10,%rcx,8),%rax
imul   %r9,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,0x20(%rsp)
shr    $0xa,%rax
mov    0x88(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,0x18(%rsp)
shr    $0xa,%rbx
mov    0x80(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,0x10(%rsp)
shr    $0xa,%rax
mov    0x78(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,0x8(%rsp)
shr    $0xa,%rbx
mov    0x70(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,(%rsp)
shr    $0xa,%rax
mov    0x68(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x8(%rsp)
shr    $0xa,%rbx
mov    0x60(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x10(%rsp)
shr    $0xa,%rax
mov    0x58(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x18(%rsp)
shr    $0xa,%rbx
mov    0x50(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x20(%rsp)
shr    $0xa,%rax
mov    0x48(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x28(%rsp)
shr    $0xa,%rbx
mov    0x40(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x30(%rsp)
shr    $0xa,%rax
mov    0x38(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x38(%rsp)
shr    $0xa,%rbx
mov    0x30(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x40(%rsp)
shr    $0xa,%rax
mov    0x28(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x48(%rsp)
shr    $0xa,%rbx
mov    0x20(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x50(%rsp)
shr    $0xa,%rax
mov    0x18(%r10,%rcx,8),%rbx
imul   %r9,%rbx
add    %rax,%rbx
mov    %ebx,%eax
and    $0x3ff,%eax
mov    %rax,-0x58(%rsp)
shr    $0xa,%rbx
mov    0x10(%r10,%rcx,8),%rax
imul   %r9,%rax
add    %rbx,%rax
mov    %eax,%ebx
and    $0x3ff,%ebx
mov    %rbx,-0x60(%rsp)
shr    $0xa,%rax
imul   0x8(%r10,%rcx,8),%r9
add    %rax,%r9
mov    %r9d,%eax
and    $0x3ff,%eax
imul   (%r10,%rcx,8),%edi
mov    %rax,-0x68(%rsp)
shr    $0xa,%r9d
add    %edi,%r9d
and    $0x3ff,%r9d
mov    %r9,-0x70(%rsp)
shl    $0xa,%r9
or     %rax,%r9
mov    $0x9,%cl
sub    %r11b,%cl
mov    %r9,%r10
shr    %cl,%r10
movzbl %cl,%edi
mov    %r10d,%ecx
shr    %ecx
bt     %rdi,%r9
jb     13e4 <__amd_remainder_piby2d2f+0x2e4>
and    $0x3,%ecx
mov    %ecx,(%rdx)
mov    $0xa,%cl
sub    %r11b,%cl
mov    $0xffffffffffffffff,%rdx
shl    %cl,%rdx
movabs $0x20000000000000,%rdi
not    %edx
and    %edx,%eax
mov    $0x1,%ecx
mov    %rax,%rdx
nopw   0x0(%rax,%rax,1)
shl    $0xa,%rdx
or     -0x68(%rsp,%rcx,8),%rdx
add    $0x1,%rcx
cmp    %rdi,%rdx
jb     13d0 <__amd_remainder_piby2d2f+0x2d0>
jmp    1445 <__amd_remainder_piby2d2f+0x345>
add    $0x1,%ecx
and    $0x3,%ecx
mov    %ecx,(%rdx)
mov    $0xa,%cl
sub    %r11b,%cl
mov    $0xffffffffffffffff,%rdx
shl    %cl,%rdx
or     %rdx,%rax
not    %rax
shr    $0x35,%rdx
cmp    $0x7ff,%edx
jb     1456 <__amd_remainder_piby2d2f+0x356>
mov    $0x1,%ecx
movabs $0x20000000000000,%rdi
nopl   0x0(%rax)
shl    $0xa,%rax
mov    -0x68(%rsp,%rcx,8),%rdx
add    $0x1,%rcx
and    $0x3ff,%edx
or     %rax,%rdx
xor    $0x3ff,%rdx
mov    %rdx,%rax
cmp    %rdi,%rdx
jb     1420 <__amd_remainder_piby2d2f+0x320>
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%eax
sub    %eax,%r11d
add    $0x34,%r11d
mov    %rdx,%rax
jmp    1460 <__amd_remainder_piby2d2f+0x360>
add    $0x2a,%r11d
nopw   0x0(%rax,%rax,1)
mov    %rax,%rcx
add    $0x1,%r11d
shr    %rax
shr    $0x36,%rcx
jne    1460 <__amd_remainder_piby2d2f+0x360>
shl    $0x34,%r11
and    %r8,%rax
or     %r11,%rax
movabs $0x3ff0000000000000,%rcx
add    %rax,%rcx
movabs $0x8000000000000000,%rax
or     %rcx,%rax
test   $0x1,%r10b
cmove  %rcx,%rax
mov    %rax,-0x78(%rsp)
movsd  -0x78(%rsp),%xmm0
mulsd  0xb51(%rip),%xmm0
movsd  %xmm0,(%rsi)
add    $0xf30,%rsp
pop    %rbx
ret

LLVM IR (-O0):
%union.anon = type { double }
@__amd_remainder_piby2d2f.piby2 = internal constant double 0x3FF921FB54442D18
@__amd_remainder_piby2d2f.pibits = internal global [126 x i64] [i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 162, i64 998, i64 54, i64 915, i64 580, i64 84, i64 671, i64 777, i64 855, i64 839, i64 851, i64 311, i64 448, i64 877, i64 553, i64 358, i64 316, i64 270, i64 260, i64 127, i64 593, i64 398, i64 701, i64 942, i64 965, i64 390, i64 882, i64 283, i64 570, i64 265, i64 221, i64 184, i64 6, i64 292, i64 750, i64 642, i64 465, i64 584, i64 463, i64 903, i64 491, i64 114, i64 786, i64 617, i64 830, i64 930, i64 35, i64 381, i64 302, i64 749, i64 72, i64 314, i64 412, i64 448, i64 619, i64 279, i64 894, i64 260, i64 921, i64 117, i64 569, i64 525, i64 307, i64 637, i64 156, i64 529, i64 504, i64 751, i64 505, i64 160, i64 945, i64 1022, i64 151, i64 1023, i64 480, i64 358, i64 15, i64 956, i64 753, i64 98, i64 858, i64 41, i64 721, i64 987, i64 310, i64 507, i64 242, i64 498, i64 777, i64 733, i64 244, i64 399, i64 870, i64 633, i64 510, i64 651, i64 373, i64 158, i64 940, i64 506, i64 997, i64 965, i64 947, i64 833, i64 825, i64 990, i64 165, i64 164, i64 746, i64 431, i64 949, i64 1004, i64 287, i64 565, i64 464, i64 533, i64 515, i64 193, i64 111, i64 798]
define void @__amd_remainder_piby2d2f(i64 %0, double* %1, i32* %2) {
%4 = alloca i64
%5 = alloca double*
%6 = alloca i32*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca double
%13 = alloca [500 x i64]
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca %union.anon
store i64 %0, i64* %4
store double* %1, double** %5
store i32* %2, i32** %6
store i32 10, i32* %22
%24 = load i64, i64* %4
%25 = and i64 %24, 9218868437227405312
%26 = lshr i64 %25, 52
%27 = sub i64 %26, 1023
%28 = trunc i64 %27 to i32
store i32 %28, i32* %18
%29 = load i64, i64* %4
%30 = and i64 %29, 4503599627370495
%31 = or i64 %30, 4503599627370496
store i64 %31, i64* %4
store i64 1, i64* %9
%32 = load i64, i64* %9
%33 = shl i64 %32, 10
%34 = sub i64 %33, 1
store i64 %34, i64* %9
%35 = load i32, i32* %18
%36 = sdiv i32 %35, 10
store i32 %36, i32* %14
%37 = load i32, i32* %18
%38 = load i32, i32* %14
%39 = mul nsw i32 %38, 10
%40 = sub nsw i32 %37, %39
store i32 %40, i32* %19
%41 = load i32, i32* %14
%42 = add nsw i32 %41, 18
store i32 %42, i32* %15
%43 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 19
store i64 0, i64* %43
%44 = load i32, i32* %15
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %45
%47 = load i64, i64* %46
%48 = load i64, i64* %4
%49 = mul i64 %47, %48
store i64 %49, i64* %7
%50 = load i64, i64* %7
%51 = load i64, i64* %9
%52 = and i64 %50, %51
%53 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 18
store i64 %52, i64* %53
%54 = load i64, i64* %7
%55 = lshr i64 %54, 10
store i64 %55, i64* %8
%56 = load i32, i32* %15
%57 = sub nsw i32 %56, 1
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %58
%60 = load i64, i64* %59
%61 = load i64, i64* %4
%62 = mul i64 %60, %61
%63 = load i64, i64* %8
%64 = add i64 %62, %63
store i64 %64, i64* %7
%65 = load i64, i64* %7
%66 = load i64, i64* %9
%67 = and i64 %65, %66
%68 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 17
store i64 %67, i64* %68
%69 = load i64, i64* %7
%70 = lshr i64 %69, 10
store i64 %70, i64* %8
%71 = load i32, i32* %15
%72 = sub nsw i32 %71, 2
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %73
%75 = load i64, i64* %74
%76 = load i64, i64* %4
%77 = mul i64 %75, %76
%78 = load i64, i64* %8
%79 = add i64 %77, %78
store i64 %79, i64* %7
%80 = load i64, i64* %7
%81 = load i64, i64* %9
%82 = and i64 %80, %81
%83 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 16
store i64 %82, i64* %83
%84 = load i64, i64* %7
%85 = lshr i64 %84, 10
store i64 %85, i64* %8
%86 = load i32, i32* %15
%87 = sub nsw i32 %86, 3
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %88
%90 = load i64, i64* %89
%91 = load i64, i64* %4
%92 = mul i64 %90, %91
%93 = load i64, i64* %8
%94 = add i64 %92, %93
store i64 %94, i64* %7
%95 = load i64, i64* %7
%96 = load i64, i64* %9
%97 = and i64 %95, %96
%98 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 15
store i64 %97, i64* %98
%99 = load i64, i64* %7
%100 = lshr i64 %99, 10
store i64 %100, i64* %8
%101 = load i32, i32* %15
%102 = sub nsw i32 %101, 4
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %103
%105 = load i64, i64* %104
%106 = load i64, i64* %4
%107 = mul i64 %105, %106
%108 = load i64, i64* %8
%109 = add i64 %107, %108
store i64 %109, i64* %7
%110 = load i64, i64* %7
%111 = load i64, i64* %9
%112 = and i64 %110, %111
%113 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 14
store i64 %112, i64* %113
%114 = load i64, i64* %7
%115 = lshr i64 %114, 10
store i64 %115, i64* %8
%116 = load i32, i32* %15
%117 = sub nsw i32 %116, 5
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %118
%120 = load i64, i64* %119
%121 = load i64, i64* %4
%122 = mul i64 %120, %121
%123 = load i64, i64* %8
%124 = add i64 %122, %123
store i64 %124, i64* %7
%125 = load i64, i64* %7
%126 = load i64, i64* %9
%127 = and i64 %125, %126
%128 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 13
store i64 %127, i64* %128
%129 = load i64, i64* %7
%130 = lshr i64 %129, 10
store i64 %130, i64* %8
%131 = load i32, i32* %15
%132 = sub nsw i32 %131, 6
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %133
%135 = load i64, i64* %134
%136 = load i64, i64* %4
%137 = mul i64 %135, %136
%138 = load i64, i64* %8
%139 = add i64 %137, %138
store i64 %139, i64* %7
%140 = load i64, i64* %7
%141 = load i64, i64* %9
%142 = and i64 %140, %141
%143 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 12
store i64 %142, i64* %143
%144 = load i64, i64* %7
%145 = lshr i64 %144, 10
store i64 %145, i64* %8
%146 = load i32, i32* %15
%147 = sub nsw i32 %146, 7
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %148
%150 = load i64, i64* %149
%151 = load i64, i64* %4
%152 = mul i64 %150, %151
%153 = load i64, i64* %8
%154 = add i64 %152, %153
store i64 %154, i64* %7
%155 = load i64, i64* %7
%156 = load i64, i64* %9
%157 = and i64 %155, %156
%158 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 11
store i64 %157, i64* %158
%159 = load i64, i64* %7
%160 = lshr i64 %159, 10
store i64 %160, i64* %8
%161 = load i32, i32* %15
%162 = sub nsw i32 %161, 8
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %163
%165 = load i64, i64* %164
%166 = load i64, i64* %4
%167 = mul i64 %165, %166
%168 = load i64, i64* %8
%169 = add i64 %167, %168
store i64 %169, i64* %7
%170 = load i64, i64* %7
%171 = load i64, i64* %9
%172 = and i64 %170, %171
%173 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 10
store i64 %172, i64* %173
%174 = load i64, i64* %7
%175 = lshr i64 %174, 10
store i64 %175, i64* %8
%176 = load i32, i32* %15
%177 = sub nsw i32 %176, 9
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %178
%180 = load i64, i64* %179
%181 = load i64, i64* %4
%182 = mul i64 %180, %181
%183 = load i64, i64* %8
%184 = add i64 %182, %183
store i64 %184, i64* %7
%185 = load i64, i64* %7
%186 = load i64, i64* %9
%187 = and i64 %185, %186
%188 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 9
store i64 %187, i64* %188
%189 = load i64, i64* %7
%190 = lshr i64 %189, 10
store i64 %190, i64* %8
%191 = load i32, i32* %15
%192 = sub nsw i32 %191, 10
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %193
%195 = load i64, i64* %194
%196 = load i64, i64* %4
%197 = mul i64 %195, %196
%198 = load i64, i64* %8
%199 = add i64 %197, %198
store i64 %199, i64* %7
%200 = load i64, i64* %7
%201 = load i64, i64* %9
%202 = and i64 %200, %201
%203 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 8
store i64 %202, i64* %203
%204 = load i64, i64* %7
%205 = lshr i64 %204, 10
store i64 %205, i64* %8
%206 = load i32, i32* %15
%207 = sub nsw i32 %206, 11
%208 = sext i32 %207 to i64
%209 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %208
%210 = load i64, i64* %209
%211 = load i64, i64* %4
%212 = mul i64 %210, %211
%213 = load i64, i64* %8
%214 = add i64 %212, %213
store i64 %214, i64* %7
%215 = load i64, i64* %7
%216 = load i64, i64* %9
%217 = and i64 %215, %216
%218 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 7
store i64 %217, i64* %218
%219 = load i64, i64* %7
%220 = lshr i64 %219, 10
store i64 %220, i64* %8
%221 = load i32, i32* %15
%222 = sub nsw i32 %221, 12
%223 = sext i32 %222 to i64
%224 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %223
%225 = load i64, i64* %224
%226 = load i64, i64* %4
%227 = mul i64 %225, %226
%228 = load i64, i64* %8
%229 = add i64 %227, %228
store i64 %229, i64* %7
%230 = load i64, i64* %7
%231 = load i64, i64* %9
%232 = and i64 %230, %231
%233 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 6
store i64 %232, i64* %233
%234 = load i64, i64* %7
%235 = lshr i64 %234, 10
store i64 %235, i64* %8
%236 = load i32, i32* %15
%237 = sub nsw i32 %236, 13
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %238
%240 = load i64, i64* %239
%241 = load i64, i64* %4
%242 = mul i64 %240, %241
%243 = load i64, i64* %8
%244 = add i64 %242, %243
store i64 %244, i64* %7
%245 = load i64, i64* %7
%246 = load i64, i64* %9
%247 = and i64 %245, %246
%248 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 5
store i64 %247, i64* %248
%249 = load i64, i64* %7
%250 = lshr i64 %249, 10
store i64 %250, i64* %8
%251 = load i32, i32* %15
%252 = sub nsw i32 %251, 14
%253 = sext i32 %252 to i64
%254 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %253
%255 = load i64, i64* %254
%256 = load i64, i64* %4
%257 = mul i64 %255, %256
%258 = load i64, i64* %8
%259 = add i64 %257, %258
store i64 %259, i64* %7
%260 = load i64, i64* %7
%261 = load i64, i64* %9
%262 = and i64 %260, %261
%263 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 4
store i64 %262, i64* %263
%264 = load i64, i64* %7
%265 = lshr i64 %264, 10
store i64 %265, i64* %8
%266 = load i32, i32* %15
%267 = sub nsw i32 %266, 15
%268 = sext i32 %267 to i64
%269 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %268
%270 = load i64, i64* %269
%271 = load i64, i64* %4
%272 = mul i64 %270, %271
%273 = load i64, i64* %8
%274 = add i64 %272, %273
store i64 %274, i64* %7
%275 = load i64, i64* %7
%276 = load i64, i64* %9
%277 = and i64 %275, %276
%278 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 3
store i64 %277, i64* %278
%279 = load i64, i64* %7
%280 = lshr i64 %279, 10
store i64 %280, i64* %8
%281 = load i32, i32* %15
%282 = sub nsw i32 %281, 16
%283 = sext i32 %282 to i64
%284 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %283
%285 = load i64, i64* %284
%286 = load i64, i64* %4
%287 = mul i64 %285, %286
%288 = load i64, i64* %8
%289 = add i64 %287, %288
store i64 %289, i64* %7
%290 = load i64, i64* %7
%291 = load i64, i64* %9
%292 = and i64 %290, %291
%293 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 2
store i64 %292, i64* %293
%294 = load i64, i64* %7
%295 = lshr i64 %294, 10
store i64 %295, i64* %8
%296 = load i32, i32* %15
%297 = sub nsw i32 %296, 17
%298 = sext i32 %297 to i64
%299 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %298
%300 = load i64, i64* %299
%301 = load i64, i64* %4
%302 = mul i64 %300, %301
%303 = load i64, i64* %8
%304 = add i64 %302, %303
store i64 %304, i64* %7
%305 = load i64, i64* %7
%306 = load i64, i64* %9
%307 = and i64 %305, %306
%308 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 1
store i64 %307, i64* %308
%309 = load i64, i64* %7
%310 = lshr i64 %309, 10
store i64 %310, i64* %8
%311 = load i32, i32* %15
%312 = sub nsw i32 %311, 18
%313 = sext i32 %312 to i64
%314 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %313
%315 = load i64, i64* %314
%316 = load i64, i64* %4
%317 = mul i64 %315, %316
%318 = load i64, i64* %8
%319 = add i64 %317, %318
store i64 %319, i64* %7
%320 = load i64, i64* %7
%321 = load i64, i64* %9
%322 = and i64 %320, %321
%323 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 0
store i64 %322, i64* %323
%324 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 0
%325 = load i64, i64* %324
%326 = shl i64 %325, 10
%327 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 1
%328 = load i64, i64* %327
%329 = or i64 %326, %328
%330 = load i32, i32* %19
%331 = sub nsw i32 9, %330
%332 = zext i32 %331 to i64
%333 = lshr i64 %329, %332
%334 = and i64 %333, 7
%335 = trunc i64 %334 to i32
store i32 %335, i32* %20
%336 = load i32, i32* %20
%337 = and i32 %336, 1
store i32 %337, i32* %21
store i32 1, i32* %16
%338 = load i32, i32* %21
%339 = icmp ne i32 %338, 0
br i1 %339, label %340, label %380
340: ; preds = %3
%341 = load i32, i32* %20
%342 = ashr i32 %341, 1
%343 = add nsw i32 %342, 1
%344 = and i32 %343, 3
%345 = load i32*, i32** %6
store i32 %344, i32* %345
store i64 1, i64* %10
%346 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 1
%347 = load i64, i64* %346
%348 = xor i64 %347, -1
%349 = load i64, i64* %10
%350 = load i32, i32* %19
%351 = sub nsw i32 10, %350
%352 = zext i32 %351 to i64
%353 = shl i64 %349, %352
%354 = sub i64 %353, 1
%355 = and i64 %348, %354
store i64 %355, i64* %10
br label %356
356: ; preds = %359, %340
%357 = load i64, i64* %10
%358 = icmp ult i64 %357, 9007199254740992
br i1 %358, label %359, label %372
359: ; preds = %356
%360 = load i32, i32* %16
%361 = add nsw i32 %360, 1
store i32 %361, i32* %16
%362 = load i64, i64* %10
%363 = shl i64 %362, 10
%364 = load i32, i32* %16
%365 = sext i32 %364 to i64
%366 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 %365
%367 = load i64, i64* %366
%368 = xor i64 %367, -1
%369 = load i64, i64* %9
%370 = and i64 %368, %369
%371 = or i64 %363, %370
store i64 %371, i64* %10
br label %356
372: ; preds = %356
%373 = load i32, i32* %16
%374 = add nsw i32 %373, 1
%375 = sext i32 %374 to i64
%376 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 %375
%377 = load i64, i64* %376
%378 = xor i64 %377, -1
%379 = shl i64 %378, 54
store i64 %379, i64* %11
br label %413
380: ; preds = %3
%381 = load i32, i32* %20
%382 = ashr i32 %381, 1
%383 = load i32*, i32** %6
store i32 %382, i32* %383
store i64 1, i64* %10
%384 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 1
%385 = load i64, i64* %384
%386 = load i64, i64* %10
%387 = load i32, i32* %19
%388 = sub nsw i32 10, %387
%389 = zext i32 %388 to i64
%390 = shl i64 %386, %389
%391 = sub i64 %390, 1
%392 = and i64 %385, %391
store i64 %392, i64* %10
br label %393
393: ; preds = %396, %380
%394 = load i64, i64* %10
%395 = icmp ult i64 %394, 9007199254740992
br i1 %395, label %396, label %406
396: ; preds = %393
%397 = load i32, i32* %16
%398 = add nsw i32 %397, 1
store i32 %398, i32* %16
%399 = load i64, i64* %10
%400 = shl i64 %399, 10
%401 = load i32, i32* %16
%402 = sext i32 %401 to i64
%403 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 %402
%404 = load i64, i64* %403
%405 = or i64 %400, %404
store i64 %405, i64* %10
br label %393
406: ; preds = %393
%407 = load i32, i32* %16
%408 = add nsw i32 %407, 1
%409 = sext i32 %408 to i64
%410 = getelementptr inbounds [500 x i64], [500 x i64]* %13, i64 0, i64 %409
%411 = load i64, i64* %410
%412 = shl i64 %411, 54
store i64 %412, i64* %11
br label %413
413: ; preds = %406, %372
%414 = load i32, i32* %19
%415 = add nsw i32 52, %414
%416 = load i32, i32* %16
%417 = mul nsw i32 %416, 10
%418 = sub nsw i32 %415, %417
store i32 %418, i32* %17
br label %419
419: ; preds = %422, %413
%420 = load i64, i64* %10
%421 = icmp uge i64 %420, 9007199254740992
br i1 %421, label %422, label %433
422: ; preds = %419
%423 = load i32, i32* %17
%424 = add nsw i32 %423, 1
store i32 %424, i32* %17
%425 = load i64, i64* %11
%426 = lshr i64 %425, 1
%427 = load i64, i64* %10
%428 = and i64 %427, 1
%429 = shl i64 %428, 63
%430 = or i64 %426, %429
store i64 %430, i64* %11
%431 = load i64, i64* %10
%432 = lshr i64 %431, 1
store i64 %432, i64* %10
br label %419
433: ; preds = %419
%434 = load i32, i32* %17
%435 = sext i32 %434 to i64
%436 = add i64 %435, 1023
%437 = shl i64 %436, 52
store i64 %437, i64* %7
%438 = load i64, i64* %10
%439 = and i64 %438, 4503599627370495
%440 = load i64, i64* %7
%441 = or i64 %439, %440
store i64 %441, i64* %4
%442 = load i32, i32* %21
%443 = icmp ne i32 %442, 0
br i1 %443, label %444, label %447
444: ; preds = %433
%445 = load i64, i64* %4
%446 = or i64 %445, -9223372036854775808
store i64 %446, i64* %4
br label %447
447: ; preds = %444, %433
%448 = load i64, i64* %4
%449 = bitcast %union.anon* %23 to i64*
store volatile i64 %448, i64* %449
%450 = bitcast %union.anon* %23 to double*
%451 = load volatile double, double* %450
store double %451, double* %12
%452 = load double, double* %12
%453 = fmul double %452, 0x3FF921FB54442D18
%454 = load double*, double** %5
store double %453, double* %454
ret void
}

LLVM IR (-O2):
@__amd_remainder_piby2d2f.pibits = internal unnamed_addr constant [126 x i64] [i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 162, i64 998, i64 54, i64 915, i64 580, i64 84, i64 671, i64 777, i64 855, i64 839, i64 851, i64 311, i64 448, i64 877, i64 553, i64 358, i64 316, i64 270, i64 260, i64 127, i64 593, i64 398, i64 701, i64 942, i64 965, i64 390, i64 882, i64 283, i64 570, i64 265, i64 221, i64 184, i64 6, i64 292, i64 750, i64 642, i64 465, i64 584, i64 463, i64 903, i64 491, i64 114, i64 786, i64 617, i64 830, i64 930, i64 35, i64 381, i64 302, i64 749, i64 72, i64 314, i64 412, i64 448, i64 619, i64 279, i64 894, i64 260, i64 921, i64 117, i64 569, i64 525, i64 307, i64 637, i64 156, i64 529, i64 504, i64 751, i64 505, i64 160, i64 945, i64 1022, i64 151, i64 1023, i64 480, i64 358, i64 15, i64 956, i64 753, i64 98, i64 858, i64 41, i64 721, i64 987, i64 310, i64 507, i64 242, i64 498, i64 777, i64 733, i64 244, i64 399, i64 870, i64 633, i64 510, i64 651, i64 373, i64 158, i64 940, i64 506, i64 997, i64 965, i64 947, i64 833, i64 825, i64 990, i64 165, i64 164, i64 746, i64 431, i64 949, i64 1004, i64 287, i64 565, i64 464, i64 533, i64 515, i64 193, i64 111, i64 798]
define void @__amd_remainder_piby2d2f(i64 %0, double* nocapture writeonly %1, i32* nocapture writeonly %2) {
%4 = alloca [500 x i64]
%5 = alloca double
%6 = bitcast [500 x i64]* %4 to i8*
%7 = lshr i64 %0, 52
%8 = trunc i64 %7 to i32
%9 = and i32 %8, 2047
%10 = add nsw i32 %9, -1023
%11 = and i64 %0, 4503599627370495
%12 = or i64 %11, 4503599627370496
%13 = trunc i32 %10 to i16
%14 = sdiv i16 %13, 10
%15 = sext i16 %14 to i32
%16 = mul nsw i32 %15, -10
%17 = add nsw i32 %16, %10
%18 = add nsw i32 %15, 18
%19 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 19
store i64 0, i64* %19
%20 = sext i32 %18 to i64
%21 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %20
%22 = load i64, i64* %21
%23 = mul i64 %22, %12
%24 = and i64 %23, 1023
%25 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 18
store i64 %24, i64* %25
%26 = lshr i64 %23, 10
%27 = add nsw i32 %15, 17
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %28
%30 = load i64, i64* %29
%31 = mul i64 %30, %12
%32 = add i64 %31, %26
%33 = and i64 %32, 1023
%34 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 17
store i64 %33, i64* %34
%35 = lshr i64 %32, 10
%36 = add nsw i32 %15, 16
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %37
%39 = load i64, i64* %38
%40 = mul i64 %39, %12
%41 = add i64 %40, %35
%42 = and i64 %41, 1023
%43 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 16
store i64 %42, i64* %43
%44 = lshr i64 %41, 10
%45 = add nsw i32 %15, 15
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %46
%48 = load i64, i64* %47
%49 = mul i64 %48, %12
%50 = add i64 %49, %44
%51 = and i64 %50, 1023
%52 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 15
store i64 %51, i64* %52
%53 = lshr i64 %50, 10
%54 = add nsw i32 %15, 14
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %55
%57 = load i64, i64* %56
%58 = mul i64 %57, %12
%59 = add i64 %58, %53
%60 = and i64 %59, 1023
%61 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 14
store i64 %60, i64* %61
%62 = lshr i64 %59, 10
%63 = add nsw i32 %15, 13
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %64
%66 = load i64, i64* %65
%67 = mul i64 %66, %12
%68 = add i64 %67, %62
%69 = and i64 %68, 1023
%70 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 13
store i64 %69, i64* %70
%71 = lshr i64 %68, 10
%72 = add nsw i32 %15, 12
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %73
%75 = load i64, i64* %74
%76 = mul i64 %75, %12
%77 = add i64 %76, %71
%78 = and i64 %77, 1023
%79 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 12
store i64 %78, i64* %79
%80 = lshr i64 %77, 10
%81 = add nsw i32 %15, 11
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %82
%84 = load i64, i64* %83
%85 = mul i64 %84, %12
%86 = add i64 %85, %80
%87 = and i64 %86, 1023
%88 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 11
store i64 %87, i64* %88
%89 = lshr i64 %86, 10
%90 = add nsw i32 %15, 10
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %91
%93 = load i64, i64* %92
%94 = mul i64 %93, %12
%95 = add i64 %94, %89
%96 = and i64 %95, 1023
%97 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 10
store i64 %96, i64* %97
%98 = lshr i64 %95, 10
%99 = add nsw i32 %15, 9
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %100
%102 = load i64, i64* %101
%103 = mul i64 %102, %12
%104 = add i64 %103, %98
%105 = and i64 %104, 1023
%106 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 9
store i64 %105, i64* %106
%107 = lshr i64 %104, 10
%108 = add nsw i32 %15, 8
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %109
%111 = load i64, i64* %110
%112 = mul i64 %111, %12
%113 = add i64 %112, %107
%114 = and i64 %113, 1023
%115 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 8
store i64 %114, i64* %115
%116 = lshr i64 %113, 10
%117 = add nsw i32 %15, 7
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %118
%120 = load i64, i64* %119
%121 = mul i64 %120, %12
%122 = add i64 %121, %116
%123 = and i64 %122, 1023
%124 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 7
store i64 %123, i64* %124
%125 = lshr i64 %122, 10
%126 = add nsw i32 %15, 6
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %127
%129 = load i64, i64* %128
%130 = mul i64 %129, %12
%131 = add i64 %130, %125
%132 = and i64 %131, 1023
%133 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 6
store i64 %132, i64* %133
%134 = lshr i64 %131, 10
%135 = add nsw i32 %15, 5
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %136
%138 = load i64, i64* %137
%139 = mul i64 %138, %12
%140 = add i64 %139, %134
%141 = and i64 %140, 1023
%142 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 5
store i64 %141, i64* %142
%143 = lshr i64 %140, 10
%144 = add nsw i32 %15, 4
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %145
%147 = load i64, i64* %146
%148 = mul i64 %147, %12
%149 = add i64 %148, %143
%150 = and i64 %149, 1023
%151 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 4
store i64 %150, i64* %151
%152 = lshr i64 %149, 10
%153 = add nsw i32 %15, 3
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %154
%156 = load i64, i64* %155
%157 = mul i64 %156, %12
%158 = add i64 %157, %152
%159 = and i64 %158, 1023
%160 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 3
store i64 %159, i64* %160
%161 = lshr i64 %158, 10
%162 = add nsw i32 %15, 2
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %163
%165 = load i64, i64* %164
%166 = mul i64 %165, %12
%167 = add i64 %166, %161
%168 = and i64 %167, 1023
%169 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 2
store i64 %168, i64* %169
%170 = lshr i64 %167, 10
%171 = add nsw i32 %15, 1
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %172
%174 = load i64, i64* %173
%175 = mul i64 %174, %12
%176 = add i64 %175, %170
%177 = and i64 %176, 1023
%178 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 1
store i64 %177, i64* %178
%179 = lshr i64 %176, 10
%180 = sext i16 %14 to i64
%181 = getelementptr inbounds [126 x i64], [126 x i64]* @__amd_remainder_piby2d2f.pibits, i64 0, i64 %180
%182 = load i64, i64* %181
%183 = mul i64 %182, %12
%184 = add i64 %183, %179
%185 = and i64 %184, 1023
%186 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 0
store i64 %185, i64* %186
%187 = shl nuw nsw i64 %185, 10
%188 = or i64 %187, %177
%189 = sub nsw i32 9, %17
%190 = zext i32 %189 to i64
%191 = lshr i64 %188, %190
%192 = trunc i64 %191 to i32
%193 = and i32 %192, 1
%194 = icmp eq i32 %193, 0
%195 = lshr i32 %192, 1
br i1 %194, label %216, label %196
196: ; preds = %3
%197 = add nuw i32 %195, 1
%198 = and i32 %197, 3
store i32 %198, i32* %2
%199 = sub nsw i32 10, %17
%200 = zext i32 %199 to i64
%201 = shl nsw i64 -1, %200
%202 = or i64 %177, %201
%203 = xor i64 %202, -1
%204 = icmp ugt i64 %202, -9007199254740993
br i1 %204, label %205, label %239
205: ; preds = %196, %205
%206 = phi i64 [ %208, %205 ], [ 1, %196 ]
%207 = phi i64 [ %214, %205 ], [ %203, %196 ]
%208 = add nuw nsw i64 %206, 1
%209 = shl nuw nsw i64 %207, 10
%210 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 %208
%211 = load i64, i64* %210
%212 = and i64 %211, 1023
%213 = or i64 %212, %209
%214 = xor i64 %213, 1023
%215 = icmp ult i64 %214, 9007199254740992
br i1 %215, label %205, label %232
216: ; preds = %3
%217 = and i32 %195, 3
store i32 %217, i32* %2
%218 = sub nsw i32 10, %17
%219 = zext i32 %218 to i64
%220 = shl nsw i64 -1, %219
%221 = xor i64 %220, -1
%222 = and i64 %177, %221
br label %223
223: ; preds = %223, %216
%224 = phi i64 [ 1, %216 ], [ %226, %223 ]
%225 = phi i64 [ %222, %216 ], [ %230, %223 ]
%226 = add nuw nsw i64 %224, 1
%227 = shl nuw nsw i64 %225, 10
%228 = getelementptr inbounds [500 x i64], [500 x i64]* %4, i64 0, i64 %226
%229 = load i64, i64* %228
%230 = or i64 %229, %227
%231 = icmp ult i64 %230, 9007199254740992
br i1 %231, label %223, label %232
232: ; preds = %205, %223
%233 = phi i64 [ %226, %223 ], [ %208, %205 ]
%234 = phi i64 [ %230, %223 ], [ %214, %205 ]
%235 = trunc i64 %233 to i32
%236 = add nsw i32 %17, 52
%237 = mul i32 %235, -10
%238 = add i32 %236, %237
br label %241
239: ; preds = %196
%240 = add nsw i32 %17, 42
br label %241
241: ; preds = %239, %232
%242 = phi i64 [ %203, %239 ], [ %234, %232 ]
%243 = phi i32 [ %240, %239 ], [ %238, %232 ]
br label %244
244: ; preds = %241, %244
%245 = phi i64 [ %248, %244 ], [ %242, %241 ]
%246 = phi i32 [ %247, %244 ], [ %243, %241 ]
%247 = add nsw i32 %246, 1
%248 = lshr i64 %245, 1
%249 = icmp ugt i64 %245, 18014398509481983
br i1 %249, label %244, label %250
250: ; preds = %244
%251 = zext i32 %247 to i64
%252 = shl i64 %251, 52
%253 = add i64 %252, 4607182418800017408
%254 = and i64 %248, 4503599627370495
%255 = or i64 %254, %253
%256 = or i64 %255, -9223372036854775808
%257 = select i1 %194, i64 %255, i64 %256
%258 = bitcast double* %5 to i8*
%259 = bitcast i64 %257 to double
store volatile double %259, double* %5
%260 = load volatile double, double* %5
%261 = fmul double %260, 0x3FF921FB54442D18
store double %261, double* %1
ret void
}