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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ isdigitx(char, int);
double strtodx(char *string, char **endPtr, int radix) {
  int sign = 0, expSign = 0, fracSz, fracOff, i;
  double fraction, dblExp, *powTab;
  register char *p;
  register char c;
  int exp = 0;
  int fracExp = 0;
  int mantSize;
  int decPt;
  char *pExp;
  static int maxExponent = 307;
  static double powersOf10[] = {
      1e1, 1e2, 1e4, 1e8, 1e16, 1e32,
  };
  static double powersOf2[] = {
      2, 4, 16, 256, 65536, 4.294967296e9, 1.8446744073709551616e19,
  };
  static double powersOf8[] = {
      8, 64, 4096, 2.81474976710656e14, 7.9228162514264337593e28,
  };
  static double powersOf16[] = {
      16,
      256,
      65536,
      1.8446744073709551616e19,
  };
  p = string;
  while (*p == ' ' || *p == '\t')
    ++p;
  if (*p == '-') {
    sign = 1;
    ++p;
  } else if (*p == '+')
    ++p;
  decPt = -1;
  for (mantSize = 0;; ++mantSize) {
    c = *p;
    if (!isdigitx(c, radix)) {
      if (c != '.' || decPt >= 0)
        break;
      decPt = mantSize;
    }
    ++p;
  }
  pExp = p;
  p -= mantSize;
  if (decPt < 0)
    decPt = mantSize;
  else
    --mantSize;
  switch (radix) {
  default:
  case 10:
    fracSz = 9;
    fracOff = 1000000000;
    powTab = powersOf10;
    break;
  case 2:
    fracSz = 30;
    fracOff = 1073741824;
    powTab = powersOf2;
    break;
  case 8:
    fracSz = 10;
    fracOff = 1073741824;
    powTab = powersOf8;
    break;
  case 16:
    fracSz = 7;
    fracOff = 268435456;
    powTab = powersOf16;
    break;
  }
  if (mantSize > 2 * fracSz)
    mantSize = 2 * fracSz;
  fracExp = decPt - mantSize;
  if (mantSize == 0) {
    fraction = 0.0;
    p = string;
    goto done;
  } else {
    int frac1, frac2;
    for (frac1 = 0; mantSize > fracSz; --mantSize) {
      c = *p++;
      if (c == '.')
        c = *p++;
      frac1 = frac1 * radix + (c - '0');
    }
    for (frac2 = 0; mantSize > 0; --mantSize) {
      c = *p++;
      if (c == '.')
        c = *p++;
      frac2 = frac2 * radix + (c - '0');
    }
    fraction = (double)fracOff * frac1 + frac2;
  }
  p = pExp;
  if (*p == 'E' || *p == 'e' || *p == 'S' || *p == 's' || *p == 'F' ||
      *p == 'f' || *p == 'D' || *p == 'd' || *p == 'L' || *p == 'l') {
    ++p;
    if (*p == '-') {
      expSign = 1;
      ++p;
    } else if (*p == '+')
      ++p;
    while (isdigitx(*p, radix))
      exp = exp * radix + (*p++ - '0');
  }
  if (expSign)
    exp = fracExp - exp;
  else
    exp = fracExp + exp;
  if (exp < 0) {
    expSign = 1;
    exp = -exp;
  } else
    expSign = 0;
  if (exp > maxExponent)
    exp = maxExponent;
  dblExp = 1.0;
  for (i = 0; exp; exp >>= 1, ++i)
    if (exp & 01)
      dblExp *= powTab[i];
  if (expSign)
    fraction /= dblExp;
  else
    fraction *= dblExp;
done:
  if (endPtr)
    *endPtr = p;
  return sign ? -fraction : fraction;
}


x86 assembly (clang, -O0):
<strtodx>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x71(%rbp)
je     116f <strtodx+0x5f>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
test   $0x1,%al
jne    117f <strtodx+0x6f>
jmp    1190 <strtodx+0x80>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    114a <strtodx+0x3a>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    11b8 <strtodx+0xa8>
movl   $0x1,-0x18(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    11d9 <strtodx+0xc9>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    11d4 <strtodx+0xc4>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    11d9 <strtodx+0xc9>
movl   $0xffffffff,-0x5c(%rbp)
movl   $0x0,-0x58(%rbp)
mov    -0x48(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
mov    -0x14(%rbp),%esi
movsbl %al,%edi
call   1030 <isdigitx@plt>
cmp    $0x0,%rax
jne    122a <strtodx+0x11a>
movsbl -0x49(%rbp),%eax
cmp    $0x2e,%eax
jne    121f <strtodx+0x10f>
cmpl   $0x0,-0x5c(%rbp)
jl     1224 <strtodx+0x114>
jmp    1244 <strtodx+0x134>
mov    -0x58(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    11e7 <strtodx+0xd7>
mov    -0x48(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x58(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
cmpl   $0x0,-0x5c(%rbp)
jge    1277 <strtodx+0x167>
mov    -0x58(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    1280 <strtodx+0x170>
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
mov    -0x14(%rbp),%eax
add    $0xfffffffe,%eax
mov    %eax,%ecx
mov    %rcx,-0x80(%rbp)
sub    $0xe,%eax
ja     12a9 <strtodx+0x199>
mov    -0x80(%rbp),%rax
lea    0xd68(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    12ae <strtodx+0x19e>
movl   $0x9,-0x20(%rbp)
movl   $0x3b9aca00,-0x24(%rbp)
lea    0x2d7d(%rip),%rax
mov    %rax,-0x40(%rbp)
jmp    1321 <strtodx+0x211>
movl   $0x1e,-0x20(%rbp)
movl   $0x40000000,-0x24(%rbp)
lea    0x2d8f(%rip),%rax
mov    %rax,-0x40(%rbp)
jmp    1321 <strtodx+0x211>
movl   $0xa,-0x20(%rbp)
movl   $0x40000000,-0x24(%rbp)
lea    0x2db1(%rip),%rax
mov    %rax,-0x40(%rbp)
jmp    1321 <strtodx+0x211>
movl   $0x7,-0x20(%rbp)
movl   $0x10000000,-0x24(%rbp)
lea    0x2dc3(%rip),%rax
mov    %rax,-0x40(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x20(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jle    133b <strtodx+0x22b>
mov    -0x20(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x58(%rbp)
mov    -0x5c(%rbp),%eax
sub    -0x58(%rbp),%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x0,-0x58(%rbp)
jne    1363 <strtodx+0x253>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    168b <strtodx+0x57b>
movl   $0x0,-0x6c(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x20(%rbp),%eax
jle    13cc <strtodx+0x2bc>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x49(%rbp)
movsbl -0x49(%rbp),%eax
cmp    $0x2e,%eax
jne    13ab <strtodx+0x29b>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x49(%rbp)
mov    -0x6c(%rbp),%eax
imul   -0x14(%rbp),%eax
movsbl -0x49(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
jmp    136a <strtodx+0x25a>
movl   $0x0,-0x70(%rbp)
cmpl   $0x0,-0x58(%rbp)
jle    1433 <strtodx+0x323>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x49(%rbp)
movsbl -0x49(%rbp),%eax
cmp    $0x2e,%eax
jne    1412 <strtodx+0x302>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x49(%rbp)
mov    -0x70(%rbp),%eax
imul   -0x14(%rbp),%eax
movsbl -0x49(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x70(%rbp)
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
jmp    13d3 <strtodx+0x2c3>
cvtsi2sdl -0x24(%rbp),%xmm0
cvtsi2sdl -0x6c(%rbp),%xmm2
cvtsi2sdl -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x53,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x73,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x46,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x44,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x64,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x4c,%eax
je     14f7 <strtodx+0x3e7>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6c,%eax
jne    1597 <strtodx+0x487>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    152b <strtodx+0x41b>
movl   $0x1,-0x1c(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    154c <strtodx+0x43c>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1547 <strtodx+0x437>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    154c <strtodx+0x43c>
jmp    1551 <strtodx+0x441>
mov    -0x48(%rbp),%rax
mov    (%rax),%al
mov    -0x14(%rbp),%esi
movsbl %al,%edi
call   1030 <isdigitx@plt>
cmp    $0x0,%rax
je     1592 <strtodx+0x482>
mov    -0x50(%rbp),%eax
imul   -0x14(%rbp),%eax
mov    -0x48(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x50(%rbp)
jmp    1551 <strtodx+0x441>
jmp    1597 <strtodx+0x487>
cmpl   $0x0,-0x1c(%rbp)
je     15af <strtodx+0x49f>
mov    -0x54(%rbp),%eax
sub    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    15b8 <strtodx+0x4a8>
mov    -0x54(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x0,-0x50(%rbp)
jge    15d6 <strtodx+0x4c6>
movl   $0x1,-0x1c(%rbp)
xor    %eax,%eax
sub    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    15dd <strtodx+0x4cd>
movl   $0x0,-0x1c(%rbp)
mov    -0x50(%rbp),%eax
cmp    0x2a4a(%rip),%eax
jle    15f5 <strtodx+0x4e5>
mov    0x2a3e(%rip),%eax
mov    %eax,-0x50(%rbp)
movsd  0xa03(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x0,-0x50(%rbp)
je     1655 <strtodx+0x545>
mov    -0x50(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1639 <strtodx+0x529>
mov    -0x40(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    163e <strtodx+0x52e>
mov    -0x50(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x50(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1609 <strtodx+0x4f9>
cmpl   $0x0,-0x1c(%rbp)
je     1677 <strtodx+0x567>
movsd  -0x38(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1686 <strtodx+0x576>
movsd  -0x38(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    168b <strtodx+0x57b>
cmpq   $0x0,-0x10(%rbp)
je     16a1 <strtodx+0x591>
mov    -0x48(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
cmpl   $0x0,-0x18(%rbp)
je     16d4 <strtodx+0x5c4>
movsd  -0x30(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
jmp    16e1 <strtodx+0x5d1>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x88(%rbp),%xmm0
ff
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strtodx>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %edx,%r12d
mov    %rdi,%r15
lea    0xf05(%rip),%rax
mov    %rdi,0x18(%rsp)
mov    %rsi,0x10(%rsp)
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%r15),%ecx
add    $0xf7,%cl
cmp    $0x24,%cl
ja     1162 <strtodx+0x52>
movzbl %cl,%ecx
movslq (%rax,%rcx,4),%rcx
add    %rax,%rcx
jmp    *%rcx
add    $0x1,%r15
jmp    1140 <strtodx+0x30>
add    $0x1,%r15
mov    $0x1,%al
mov    %eax,0xc(%rsp)
jmp    1176 <strtodx+0x66>
add    $0x1,%r15
movl   $0x0,0xc(%rsp)
mov    $0xffffffff,%ebp
xor    %r14d,%r14d
jmp    1184 <strtodx+0x74>
add    $0x1,%r14
movzbl (%r15,%r14,1),%ebx
movsbl %bl,%edi
mov    %r12d,%esi
call   1030 <isdigitx@plt>
test   %rax,%rax
jne    1180 <strtodx+0x70>
cmp    $0x2e,%bl
jne    11a7 <strtodx+0x97>
test   %ebp,%ebp
jns    11a7 <strtodx+0x97>
mov    %r14d,%ebp
jmp    1180 <strtodx+0x70>
mov    %ebp,%esi
not    %esi
sar    $0x1f,%esi
lea    (%rsi,%r14,1),%rdi
test   %ebp,%ebp
mov    %r14d,%r11d
cmovns %ebp,%r11d
lea    -0x2(%r12),%eax
ror    %eax
cmp    $0x7,%eax
je     11e6 <strtodx+0xd6>
cmp    $0x3,%eax
je     11fc <strtodx+0xec>
test   %eax,%eax
jne    1212 <strtodx+0x102>
lea    0xf29(%rip),%r13
movsd  0xe29(%rip),%xmm0
mov    $0x1e,%eax
jmp    1226 <strtodx+0x116>
lea    0xf83(%rip),%r13
movsd  0xe1b(%rip),%xmm0
mov    $0x7,%eax
jmp    1226 <strtodx+0x116>
lea    0xf3d(%rip),%r13
movsd  0xdfd(%rip),%xmm0
mov    $0xa,%eax
jmp    1226 <strtodx+0x116>
lea    0xeb7(%rip),%r13
movsd  0xddf(%rip),%xmm0
mov    $0x9,%eax
lea    (%rax,%rax,1),%ecx
cmp    %ecx,%edi
mov    %edi,%ebp
cmovg  %ecx,%ebp
test   %ebp,%ebp
je     126d <strtodx+0x15d>
lea    (%r15,%r14,1),%r10
mov    %ebp,%r8d
sub    %eax,%r8d
jle    128e <strtodx+0x17e>
lea    0x1(%rax),%edx
cmp    %edx,%ebp
jne    12a8 <strtodx+0x198>
xor    %edi,%edi
mov    %r15,%rdx
test   $0x1,%r8b
je     1326 <strtodx+0x216>
mov    (%rdx),%cl
cmp    $0x2e,%cl
jne    1316 <strtodx+0x206>
mov    0x1(%rdx),%cl
add    $0x2,%rdx
jmp    131a <strtodx+0x20a>
xorpd  %xmm0,%xmm0
mov    0x10(%rsp),%rdx
mov    0x18(%rsp),%rbx
mov    0xc(%rsp),%r15d
test   %rdx,%rdx
jne    148a <strtodx+0x37a>
jmp    148d <strtodx+0x37d>
xorpd  %xmm1,%xmm1
mov    %ebp,%eax
mov    %r15,%rdx
xorpd  %xmm2,%xmm2
test   %edi,%edi
jg     132a <strtodx+0x21a>
jmp    1371 <strtodx+0x261>
add    %r14d,%esi
cmp    %esi,%ecx
cmovl  %ecx,%esi
sub    %eax,%esi
and    $0xfffffffe,%esi
xor    %edi,%edi
mov    %r15,%rdx
jmp    12e6 <strtodx+0x1d6>
nopl   0x0(%rax)
movzbl 0x1(%rdx),%ecx
add    $0x2,%rdx
movsbl %r9b,%ebx
add    %ebx,%edi
add    $0xffffffd0,%edi
imul   %r12d,%edi
movsbl %cl,%ecx
add    %ecx,%edi
add    $0xffffffd0,%edi
add    $0xfffffffe,%esi
je     124c <strtodx+0x13c>
movzbl (%rdx),%r9d
cmp    $0x2e,%r9b
jne    1300 <strtodx+0x1f0>
movzbl 0x1(%rdx),%r9d
add    $0x2,%rdx
jmp    1304 <strtodx+0x1f4>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdx
imul   %r12d,%edi
movzbl (%rdx),%ecx
cmp    $0x2e,%cl
je     12c0 <strtodx+0x1b0>
add    $0x1,%rdx
jmp    12c8 <strtodx+0x1b8>
add    $0x1,%rdx
imul   %r12d,%edi
movsbl %cl,%ecx
add    %ecx,%edi
add    $0xffffffd0,%edi
cvtsi2sd %edi,%xmm1
add    $0x1,%eax
xor    %esi,%esi
jmp    135c <strtodx+0x24c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl 0x1(%rdx),%ecx
add    $0x2,%rdx
imul   %r12d,%esi
movsbl %cl,%ecx
add    %ecx,%esi
add    $0xffffffd0,%esi
add    $0xffffffff,%eax
cmp    $0x1,%eax
jle    136a <strtodx+0x25a>
movzbl (%rdx),%ecx
cmp    $0x2e,%cl
je     1340 <strtodx+0x230>
add    $0x1,%rdx
jmp    1348 <strtodx+0x238>
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
sub    %ebp,%r11d
mov    (%r10),%al
add    $0xbc,%al
cmp    $0x2f,%al
ja     14d6 <strtodx+0x3c6>
movzbl %al,%eax
movabs $0x810700008107,%rcx
bt     %rax,%rcx
jae    14d6 <strtodx+0x3c6>
mov    0x1(%r15,%r14,1),%al
cmp    $0x2b,%al
movapd %xmm0,0x30(%rsp)
mov    %r11d,0x18(%rsp)
movsd  %xmm1,0x28(%rsp)
movsd  %xmm2,0x20(%rsp)
je     13c9 <strtodx+0x2b9>
cmp    $0x2d,%al
jne    13d3 <strtodx+0x2c3>
lea    (%r15,%r14,1),%rbx
add    $0x2,%rbx
xor    %r14d,%r14d
jmp    13de <strtodx+0x2ce>
lea    (%r15,%r14,1),%rbx
add    $0x2,%rbx
jmp    13db <strtodx+0x2cb>
lea    (%r15,%r14,1),%rbx
add    $0x1,%rbx
mov    $0x1,%r14b
mov    0xc(%rsp),%r15d
movsbl (%rbx),%edi
mov    %r12d,%esi
call   1030 <isdigitx@plt>
xor    %ebp,%ebp
test   %rax,%rax
je     1424 <strtodx+0x314>
mov    %rbx,%rcx
nopl   0x0(%rax,%rax,1)
imul   %r12d,%ebp
lea    0x1(%rcx),%rbx
movsbl (%rcx),%eax
add    %eax,%ebp
add    $0xffffffd0,%ebp
movsbl 0x1(%rcx),%edi
mov    %r12d,%esi
call   1030 <isdigitx@plt>
mov    %rbx,%rcx
test   %rax,%rax
jne    1400 <strtodx+0x2f0>
test   %r14b,%r14b
je     1432 <strtodx+0x322>
add    0x18(%rsp),%ebp
mov    %ebp,%r11d
jmp    143a <strtodx+0x32a>
mov    0x18(%rsp),%r11d
sub    %ebp,%r11d
mov    0x10(%rsp),%rdx
movapd 0x30(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movsd  0x20(%rsp),%xmm2
mulsd  %xmm1,%xmm0
mov    %r11d,%ecx
neg    %ecx
cmovs  %r11d,%ecx
cmp    $0x133,%ecx
mov    $0x133,%eax
cmovl  %ecx,%eax
movsd  0xba4(%rip),%xmm1
test   %eax,%eax
jne    14bf <strtodx+0x3af>
addsd  %xmm2,%xmm0
test   %r11d,%r11d
js     14cb <strtodx+0x3bb>
mulsd  %xmm1,%xmm0
test   %rdx,%rdx
je     148d <strtodx+0x37d>
mov    %rbx,(%rdx)
test   %r15b,%r15b
jne    149a <strtodx+0x38a>
xorpd  0xb86(%rip),%xmm0
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
nopl   0x0(%rax)
mov    %eax,%ecx
shr    %ecx
add    $0x8,%r13
cmp    $0x1,%eax
mov    %ecx,%eax
jbe    1478 <strtodx+0x368>
test   $0x1,%al
je     14b0 <strtodx+0x3a0>
mulsd  0x0(%r13),%xmm1
jmp    14b0 <strtodx+0x3a0>
divsd  %xmm1,%xmm0
test   %rdx,%rdx
jne    148a <strtodx+0x37a>
jmp    148d <strtodx+0x37d>
mov    0x10(%rsp),%rdx
mov    %r10,%rbx
mov    0xc(%rsp),%r15d
jmp    1451 <strtodx+0x341>

LLVM IR (-O0):
@strtodx.maxExponent = internal global i32 307
@strtodx.powersOf10 = internal global [6 x double] [double 1.000000e+01, double 1.000000e+02, double 1.000000e+04, double 1.000000e+08, double 1.000000e+16, double 1.000000e+32]
@strtodx.powersOf2 = internal global [7 x double] [double 2.000000e+00, double 4.000000e+00, double 1.600000e+01, double 2.560000e+02, double 6.553600e+04, double 0x41F0000000000000, double 0x43F0000000000000]
@strtodx.powersOf8 = internal global [5 x double] [double 8.000000e+00, double 6.400000e+01, double 4.096000e+03, double 0x42F0000000000000, double 0x45F0000000000000]
@strtodx.powersOf16 = internal global [4 x double] [double 1.600000e+01, double 2.560000e+02, double 6.553600e+04, double 0x43F0000000000000]
define double @strtodx(i8* %0, i8** %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i8**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca double
%13 = alloca double
%14 = alloca double*
%15 = alloca i8*
%16 = alloca i8
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i8*
%22 = alloca i32
%23 = alloca i32
store i8* %0, i8** %4
store i8** %1, i8*** %5
store i32 %2, i32* %6
store i32 0, i32* %7
store i32 0, i32* %8
store i32 0, i32* %17
store i32 0, i32* %18
%24 = load i8*, i8** %4
store i8* %24, i8** %15
br label %25
25: ; preds = %37, %3
%26 = load i8*, i8** %15
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 32
br i1 %29, label %35, label %30
30: ; preds = %25
%31 = load i8*, i8** %15
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 9
br label %35
35: ; preds = %30, %25
%36 = phi i1 [ true, %25 ], [ %34, %30 ]
br i1 %36, label %37, label %40
37: ; preds = %35
%38 = load i8*, i8** %15
%39 = getelementptr inbounds i8, i8* %38, i32 1
store i8* %39, i8** %15
br label %25
40: ; preds = %35
%41 = load i8*, i8** %15
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 45
br i1 %44, label %45, label %48
45: ; preds = %40
store i32 1, i32* %7
%46 = load i8*, i8** %15
%47 = getelementptr inbounds i8, i8* %46, i32 1
store i8* %47, i8** %15
br label %57
48: ; preds = %40
%49 = load i8*, i8** %15
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 43
br i1 %52, label %53, label %56
53: ; preds = %48
%54 = load i8*, i8** %15
%55 = getelementptr inbounds i8, i8* %54, i32 1
store i8* %55, i8** %15
br label %56
56: ; preds = %53, %48
br label %57
57: ; preds = %56, %45
store i32 -1, i32* %20
store i32 0, i32* %19
br label %58
58: ; preds = %78, %57
%59 = load i8*, i8** %15
%60 = load i8, i8* %59
store i8 %60, i8* %16
%61 = load i8, i8* %16
%62 = load i32, i32* %6
%63 = call i64 @isdigitx(i8 signext %61, i32 %62)
%64 = icmp ne i64 %63, 0
br i1 %64, label %75, label %65
65: ; preds = %58
%66 = load i8, i8* %16
%67 = sext i8 %66 to i32
%68 = icmp ne i32 %67, 46
br i1 %68, label %72, label %69
69: ; preds = %65
%70 = load i32, i32* %20
%71 = icmp sge i32 %70, 0
br i1 %71, label %72, label %73
72: ; preds = %69, %65
br label %81
73: ; preds = %69
%74 = load i32, i32* %19
store i32 %74, i32* %20
br label %75
75: ; preds = %73, %58
%76 = load i8*, i8** %15
%77 = getelementptr inbounds i8, i8* %76, i32 1
store i8* %77, i8** %15
br label %78
78: ; preds = %75
%79 = load i32, i32* %19
%80 = add nsw i32 %79, 1
store i32 %80, i32* %19
br label %58
81: ; preds = %72
%82 = load i8*, i8** %15
store i8* %82, i8** %21
%83 = load i32, i32* %19
%84 = load i8*, i8** %15
%85 = sext i32 %83 to i64
%86 = sub i64 0, %85
%87 = getelementptr inbounds i8, i8* %84, i64 %86
store i8* %87, i8** %15
%88 = load i32, i32* %20
%89 = icmp slt i32 %88, 0
br i1 %89, label %90, label %92
90: ; preds = %81
%91 = load i32, i32* %19
store i32 %91, i32* %20
br label %95
92: ; preds = %81
%93 = load i32, i32* %19
%94 = add nsw i32 %93, -1
store i32 %94, i32* %19
br label %95
95: ; preds = %92, %90
%96 = load i32, i32* %6
switch i32 %96, label %97 [
i32 10, label %98
i32 2, label %99
i32 8, label %100
i32 16, label %101
]
97: ; preds = %95
br label %98
98: ; preds = %95, %97
store i32 9, i32* %9
store i32 1000000000, i32* %10
store double* getelementptr inbounds ([6 x double], [6 x double]* @strtodx.powersOf10, i64 0, i64 0), double** %14
br label %102
99: ; preds = %95
store i32 30, i32* %9
store i32 1073741824, i32* %10
store double* getelementptr inbounds ([7 x double], [7 x double]* @strtodx.powersOf2, i64 0, i64 0), double** %14
br label %102
100: ; preds = %95
store i32 10, i32* %9
store i32 1073741824, i32* %10
store double* getelementptr inbounds ([5 x double], [5 x double]* @strtodx.powersOf8, i64 0, i64 0), double** %14
br label %102
101: ; preds = %95
store i32 7, i32* %9
store i32 268435456, i32* %10
store double* getelementptr inbounds ([4 x double], [4 x double]* @strtodx.powersOf16, i64 0, i64 0), double** %14
br label %102
102: ; preds = %101, %100, %99, %98
%103 = load i32, i32* %19
%104 = load i32, i32* %9
%105 = mul nsw i32 2, %104
%106 = icmp sgt i32 %103, %105
br i1 %106, label %107, label %110
107: ; preds = %102
%108 = load i32, i32* %9
%109 = mul nsw i32 2, %108
store i32 %109, i32* %19
br label %110
110: ; preds = %107, %102
%111 = load i32, i32* %20
%112 = load i32, i32* %19
%113 = sub nsw i32 %111, %112
store i32 %113, i32* %18
%114 = load i32, i32* %19
%115 = icmp eq i32 %114, 0
br i1 %115, label %116, label %118
116: ; preds = %110
store double 0.000000e+00, double* %12
%117 = load i8*, i8** %4
store i8* %117, i8** %15
br label %325
118: ; preds = %110
store i32 0, i32* %22
br label %119
119: ; preds = %142, %118
%120 = load i32, i32* %19
%121 = load i32, i32* %9
%122 = icmp sgt i32 %120, %121
br i1 %122, label %123, label %145
123: ; preds = %119
%124 = load i8*, i8** %15
%125 = getelementptr inbounds i8, i8* %124, i32 1
store i8* %125, i8** %15
%126 = load i8, i8* %124
store i8 %126, i8* %16
%127 = load i8, i8* %16
%128 = sext i8 %127 to i32
%129 = icmp eq i32 %128, 46
br i1 %129, label %130, label %134
130: ; preds = %123
%131 = load i8*, i8** %15
%132 = getelementptr inbounds i8, i8* %131, i32 1
store i8* %132, i8** %15
%133 = load i8, i8* %131
store i8 %133, i8* %16
br label %134
134: ; preds = %130, %123
%135 = load i32, i32* %22
%136 = load i32, i32* %6
%137 = mul nsw i32 %135, %136
%138 = load i8, i8* %16
%139 = sext i8 %138 to i32
%140 = sub nsw i32 %139, 48
%141 = add nsw i32 %137, %140
store i32 %141, i32* %22
br label %142
142: ; preds = %134
%143 = load i32, i32* %19
%144 = add nsw i32 %143, -1
store i32 %144, i32* %19
br label %119
145: ; preds = %119
store i32 0, i32* %23
br label %146
146: ; preds = %168, %145
%147 = load i32, i32* %19
%148 = icmp sgt i32 %147, 0
br i1 %148, label %149, label %171
149: ; preds = %146
%150 = load i8*, i8** %15
%151 = getelementptr inbounds i8, i8* %150, i32 1
store i8* %151, i8** %15
%152 = load i8, i8* %150
store i8 %152, i8* %16
%153 = load i8, i8* %16
%154 = sext i8 %153 to i32
%155 = icmp eq i32 %154, 46
br i1 %155, label %156, label %160
156: ; preds = %149
%157 = load i8*, i8** %15
%158 = getelementptr inbounds i8, i8* %157, i32 1
store i8* %158, i8** %15
%159 = load i8, i8* %157
store i8 %159, i8* %16
br label %160
160: ; preds = %156, %149
%161 = load i32, i32* %23
%162 = load i32, i32* %6
%163 = mul nsw i32 %161, %162
%164 = load i8, i8* %16
%165 = sext i8 %164 to i32
%166 = sub nsw i32 %165, 48
%167 = add nsw i32 %163, %166
store i32 %167, i32* %23
br label %168
168: ; preds = %160
%169 = load i32, i32* %19
%170 = add nsw i32 %169, -1
store i32 %170, i32* %19
br label %146
171: ; preds = %146
%172 = load i32, i32* %10
%173 = sitofp i32 %172 to double
%174 = load i32, i32* %22
%175 = sitofp i32 %174 to double
%176 = load i32, i32* %23
%177 = sitofp i32 %176 to double
%178 = call double @llvm.fmuladd.f64(double %173, double %175, double %177)
store double %178, double* %12
br label %179
179: ; preds = %171
%180 = load i8*, i8** %21
store i8* %180, i8** %15
%181 = load i8*, i8** %15
%182 = load i8, i8* %181
%183 = sext i8 %182 to i32
%184 = icmp eq i32 %183, 69
br i1 %184, label %230, label %185
185: ; preds = %179
%186 = load i8*, i8** %15
%187 = load i8, i8* %186
%188 = sext i8 %187 to i32
%189 = icmp eq i32 %188, 101
br i1 %189, label %230, label %190
190: ; preds = %185
%191 = load i8*, i8** %15
%192 = load i8, i8* %191
%193 = sext i8 %192 to i32
%194 = icmp eq i32 %193, 83
br i1 %194, label %230, label %195
195: ; preds = %190
%196 = load i8*, i8** %15
%197 = load i8, i8* %196
%198 = sext i8 %197 to i32
%199 = icmp eq i32 %198, 115
br i1 %199, label %230, label %200
200: ; preds = %195
%201 = load i8*, i8** %15
%202 = load i8, i8* %201
%203 = sext i8 %202 to i32
%204 = icmp eq i32 %203, 70
br i1 %204, label %230, label %205
205: ; preds = %200
%206 = load i8*, i8** %15
%207 = load i8, i8* %206
%208 = sext i8 %207 to i32
%209 = icmp eq i32 %208, 102
br i1 %209, label %230, label %210
210: ; preds = %205
%211 = load i8*, i8** %15
%212 = load i8, i8* %211
%213 = sext i8 %212 to i32
%214 = icmp eq i32 %213, 68
br i1 %214, label %230, label %215
215: ; preds = %210
%216 = load i8*, i8** %15
%217 = load i8, i8* %216
%218 = sext i8 %217 to i32
%219 = icmp eq i32 %218, 100
br i1 %219, label %230, label %220
220: ; preds = %215
%221 = load i8*, i8** %15
%222 = load i8, i8* %221
%223 = sext i8 %222 to i32
%224 = icmp eq i32 %223, 76
br i1 %224, label %230, label %225
225: ; preds = %220
%226 = load i8*, i8** %15
%227 = load i8, i8* %226
%228 = sext i8 %227 to i32
%229 = icmp eq i32 %228, 108
br i1 %229, label %230, label %267
230: ; preds = %225, %220, %215, %210, %205, %200, %195, %190, %185, %179
%231 = load i8*, i8** %15
%232 = getelementptr inbounds i8, i8* %231, i32 1
store i8* %232, i8** %15
%233 = load i8*, i8** %15
%234 = load i8, i8* %233
%235 = sext i8 %234 to i32
%236 = icmp eq i32 %235, 45
br i1 %236, label %237, label %240
237: ; preds = %230
store i32 1, i32* %8
%238 = load i8*, i8** %15
%239 = getelementptr inbounds i8, i8* %238, i32 1
store i8* %239, i8** %15
br label %249
240: ; preds = %230
%241 = load i8*, i8** %15
%242 = load i8, i8* %241
%243 = sext i8 %242 to i32
%244 = icmp eq i32 %243, 43
br i1 %244, label %245, label %248
245: ; preds = %240
%246 = load i8*, i8** %15
%247 = getelementptr inbounds i8, i8* %246, i32 1
store i8* %247, i8** %15
br label %248
248: ; preds = %245, %240
br label %249
249: ; preds = %248, %237
br label %250
250: ; preds = %256, %249
%251 = load i8*, i8** %15
%252 = load i8, i8* %251
%253 = load i32, i32* %6
%254 = call i64 @isdigitx(i8 signext %252, i32 %253)
%255 = icmp ne i64 %254, 0
br i1 %255, label %256, label %266
256: ; preds = %250
%257 = load i32, i32* %17
%258 = load i32, i32* %6
%259 = mul nsw i32 %257, %258
%260 = load i8*, i8** %15
%261 = getelementptr inbounds i8, i8* %260, i32 1
store i8* %261, i8** %15
%262 = load i8, i8* %260
%263 = sext i8 %262 to i32
%264 = sub nsw i32 %263, 48
%265 = add nsw i32 %259, %264
store i32 %265, i32* %17
br label %250
266: ; preds = %250
br label %267
267: ; preds = %266, %225
%268 = load i32, i32* %8
%269 = icmp ne i32 %268, 0
br i1 %269, label %270, label %274
270: ; preds = %267
%271 = load i32, i32* %18
%272 = load i32, i32* %17
%273 = sub nsw i32 %271, %272
store i32 %273, i32* %17
br label %278
274: ; preds = %267
%275 = load i32, i32* %18
%276 = load i32, i32* %17
%277 = add nsw i32 %275, %276
store i32 %277, i32* %17
br label %278
278: ; preds = %274, %270
%279 = load i32, i32* %17
%280 = icmp slt i32 %279, 0
br i1 %280, label %281, label %284
281: ; preds = %278
store i32 1, i32* %8
%282 = load i32, i32* %17
%283 = sub nsw i32 0, %282
store i32 %283, i32* %17
br label %285
284: ; preds = %278
store i32 0, i32* %8
br label %285
285: ; preds = %284, %281
%286 = load i32, i32* %17
%287 = load i32, i32* @strtodx.maxExponent
%288 = icmp sgt i32 %286, %287
br i1 %288, label %289, label %291
289: ; preds = %285
%290 = load i32, i32* @strtodx.maxExponent
store i32 %290, i32* %17
br label %291
291: ; preds = %289, %285
store double 1.000000e+00, double* %13
store i32 0, i32* %11
br label %292
292: ; preds = %308, %291
%293 = load i32, i32* %17
%294 = icmp ne i32 %293, 0
br i1 %294, label %295, label %313
295: ; preds = %292
%296 = load i32, i32* %17
%297 = and i32 %296, 1
%298 = icmp ne i32 %297, 0
br i1 %298, label %299, label %307
299: ; preds = %295
%300 = load double*, double** %14
%301 = load i32, i32* %11
%302 = sext i32 %301 to i64
%303 = getelementptr inbounds double, double* %300, i64 %302
%304 = load double, double* %303
%305 = load double, double* %13
%306 = fmul double %305, %304
store double %306, double* %13
br label %307
307: ; preds = %299, %295
br label %308
308: ; preds = %307
%309 = load i32, i32* %17
%310 = ashr i32 %309, 1
store i32 %310, i32* %17
%311 = load i32, i32* %11
%312 = add nsw i32 %311, 1
store i32 %312, i32* %11
br label %292
313: ; preds = %292
%314 = load i32, i32* %8
%315 = icmp ne i32 %314, 0
br i1 %315, label %316, label %320
316: ; preds = %313
%317 = load double, double* %13
%318 = load double, double* %12
%319 = fdiv double %318, %317
store double %319, double* %12
br label %324
320: ; preds = %313
%321 = load double, double* %13
%322 = load double, double* %12
%323 = fmul double %322, %321
store double %323, double* %12
br label %324
324: ; preds = %320, %316
br label %325
325: ; preds = %324, %116
%326 = load i8**, i8*** %5
%327 = icmp ne i8** %326, null
br i1 %327, label %328, label %331
328: ; preds = %325
%329 = load i8*, i8** %15
%330 = load i8**, i8*** %5
store i8* %329, i8** %330
br label %331
331: ; preds = %328, %325
%332 = load i32, i32* %7
%333 = icmp ne i32 %332, 0
br i1 %333, label %334, label %337
334: ; preds = %331
%335 = load double, double* %12
%336 = fneg double %335
br label %339
337: ; preds = %331
%338 = load double, double* %12
br label %339
339: ; preds = %337, %334
%340 = phi double [ %336, %334 ], [ %338, %337 ]
ret double %340
}

LLVM IR (-O2):
@strtodx.powersOf10 = internal unnamed_addr constant [6 x double] [double 1.000000e+01, double 1.000000e+02, double 1.000000e+04, double 1.000000e+08, double 1.000000e+16, double 1.000000e+32]
@strtodx.powersOf2 = internal unnamed_addr constant [7 x double] [double 2.000000e+00, double 4.000000e+00, double 1.600000e+01, double 2.560000e+02, double 6.553600e+04, double 0x41F0000000000000, double 0x43F0000000000000]
@strtodx.powersOf8 = internal unnamed_addr constant [5 x double] [double 8.000000e+00, double 6.400000e+01, double 4.096000e+03, double 0x42F0000000000000, double 0x45F0000000000000]
@strtodx.powersOf16 = internal unnamed_addr constant [4 x double] [double 1.600000e+01, double 2.560000e+02, double 6.553600e+04, double 0x43F0000000000000]
define double @strtodx(i8* %0, i8** writeonly %1, i32 %2) {
br label %4
4: ; preds = %7, %3
%5 = phi i8* [ %0, %3 ], [ %8, %7 ]
%6 = load i8, i8* %5
switch i8 %6, label %13 [
i8 32, label %7
i8 9, label %7
i8 45, label %9
i8 43, label %11
]
7: ; preds = %4, %4
%8 = getelementptr inbounds i8, i8* %5, i64 1
br label %4
9: ; preds = %4
%10 = getelementptr inbounds i8, i8* %5, i64 1
br label %13
11: ; preds = %4
%12 = getelementptr inbounds i8, i8* %5, i64 1
br label %13
13: ; preds = %4, %11, %9
%14 = phi i8* [ %10, %9 ], [ %12, %11 ], [ %5, %4 ]
%15 = phi i1 [ false, %9 ], [ true, %11 ], [ true, %4 ]
br label %16
16: ; preds = %27, %13
%17 = phi i8* [ %14, %13 ], [ %29, %27 ]
%18 = phi i32 [ 0, %13 ], [ %30, %27 ]
%19 = phi i32 [ -1, %13 ], [ %28, %27 ]
%20 = load i8, i8* %17
%21 = tail call i64 @isdigitx(i8 signext %20, i32 %2)
%22 = icmp eq i64 %21, 0
br i1 %22, label %23, label %27
23: ; preds = %16
%24 = icmp ne i8 %20, 46
%25 = icmp sgt i32 %19, -1
%26 = select i1 %24, i1 true, i1 %25
br i1 %26, label %31, label %27
27: ; preds = %23, %16
%28 = phi i32 [ %19, %16 ], [ %18, %23 ]
%29 = getelementptr inbounds i8, i8* %17, i64 1
%30 = add nuw nsw i32 %18, 1
br label %16
31: ; preds = %23
%32 = zext i32 %18 to i64
%33 = sub nsw i64 0, %32
%34 = getelementptr inbounds i8, i8* %17, i64 %33
%35 = icmp slt i32 %19, 0
%36 = xor i1 %35, true
%37 = sext i1 %36 to i32
%38 = add nsw i32 %18, %37
%39 = select i1 %35, i32 %18, i32 %19
%40 = add i32 %2, -2
%41 = tail call i32 @llvm.fshl.i32(i32 %40, i32 %40, i32 31)
switch i32 %41, label %45 [
i32 7, label %44
i32 0, label %42
i32 3, label %43
]
42: ; preds = %31
br label %45
43: ; preds = %31
br label %45
44: ; preds = %31
br label %45
45: ; preds = %31, %44, %43, %42
%46 = phi i32 [ 10, %43 ], [ 30, %42 ], [ 7, %44 ], [ 9, %31 ]
%47 = phi double [ 0x41D0000000000000, %43 ], [ 0x41D0000000000000, %42 ], [ 0x41B0000000000000, %44 ], [ 1.000000e+09, %31 ]
%48 = phi double* [ getelementptr inbounds ([5 x double], [5 x double]* @strtodx.powersOf8, i64 0, i64 0), %43 ], [ getelementptr inbounds ([7 x double], [7 x double]* @strtodx.powersOf2, i64 0, i64 0), %42 ], [ getelementptr inbounds ([4 x double], [4 x double]* @strtodx.powersOf16, i64 0, i64 0), %44 ], [ getelementptr inbounds ([6 x double], [6 x double]* @strtodx.powersOf10, i64 0, i64 0), %31 ]
%49 = shl nuw nsw i32 %46, 1
%50 = icmp sgt i32 %38, %49
%51 = select i1 %50, i32 %49, i32 %38
%52 = sub nsw i32 %39, %51
%53 = icmp eq i32 %51, 0
br i1 %53, label %214, label %54
54: ; preds = %45
%55 = icmp sgt i32 %51, %46
br i1 %55, label %56, label %87
56: ; preds = %54
%57 = sub i32 %51, %46
%58 = add nuw nsw i32 %46, 1
%59 = and i32 %57, 1
%60 = icmp eq i32 %51, %58
br i1 %60, label %63, label %61
61: ; preds = %56
%62 = and i32 %57, -2
br label %93
63: ; preds = %116, %56
%64 = phi i8* [ undef, %56 ], [ %117, %116 ]
%65 = phi i32 [ undef, %56 ], [ %122, %116 ]
%66 = phi i32 [ 0, %56 ], [ %122, %116 ]
%67 = phi i8* [ %34, %56 ], [ %117, %116 ]
%68 = icmp eq i32 %59, 0
br i1 %68, label %83, label %69
69: ; preds = %63
%70 = getelementptr inbounds i8, i8* %67, i64 1
%71 = load i8, i8* %67
%72 = icmp eq i8 %71, 46
br i1 %72, label %73, label %76
73: ; preds = %69
%74 = getelementptr inbounds i8, i8* %67, i64 2
%75 = load i8, i8* %70
br label %76
76: ; preds = %73, %69
%77 = phi i8* [ %74, %73 ], [ %70, %69 ]
%78 = phi i8 [ %75, %73 ], [ %71, %69 ]
%79 = mul nsw i32 %66, %2
%80 = sext i8 %78 to i32
%81 = add i32 %79, -48
%82 = add i32 %81, %80
br label %83
83: ; preds = %63, %76
%84 = phi i8* [ %64, %63 ], [ %77, %76 ]
%85 = phi i32 [ %65, %63 ], [ %82, %76 ]
%86 = sitofp i32 %85 to double
br label %89
87: ; preds = %54
%88 = icmp sgt i32 %38, 0
br i1 %88, label %89, label %146
89: ; preds = %83, %87
%90 = phi double [ %86, %83 ], [ 0.000000e+00, %87 ]
%91 = phi i32 [ %46, %83 ], [ %51, %87 ]
%92 = phi i8* [ %84, %83 ], [ %34, %87 ]
br label %125
93: ; preds = %116, %61
%94 = phi i32 [ 0, %61 ], [ %122, %116 ]
%95 = phi i8* [ %34, %61 ], [ %117, %116 ]
%96 = phi i32 [ 0, %61 ], [ %123, %116 ]
%97 = getelementptr inbounds i8, i8* %95, i64 1
%98 = load i8, i8* %95
%99 = icmp eq i8 %98, 46
br i1 %99, label %100, label %103
100: ; preds = %93
%101 = getelementptr inbounds i8, i8* %95, i64 2
%102 = load i8, i8* %97
br label %103
103: ; preds = %100, %93
%104 = phi i8* [ %101, %100 ], [ %97, %93 ]
%105 = phi i8 [ %102, %100 ], [ %98, %93 ]
%106 = mul nsw i32 %94, %2
%107 = sext i8 %105 to i32
%108 = add i32 %106, -48
%109 = add i32 %108, %107
%110 = getelementptr inbounds i8, i8* %104, i64 1
%111 = load i8, i8* %104
%112 = icmp eq i8 %111, 46
br i1 %112, label %113, label %116
113: ; preds = %103
%114 = getelementptr inbounds i8, i8* %104, i64 2
%115 = load i8, i8* %110
br label %116
116: ; preds = %113, %103
%117 = phi i8* [ %114, %113 ], [ %110, %103 ]
%118 = phi i8 [ %115, %113 ], [ %111, %103 ]
%119 = mul nsw i32 %109, %2
%120 = sext i8 %118 to i32
%121 = add i32 %119, -48
%122 = add i32 %121, %120
%123 = add i32 %96, 2
%124 = icmp eq i32 %123, %62
br i1 %124, label %63, label %93
125: ; preds = %89, %135
%126 = phi i32 [ %141, %135 ], [ 0, %89 ]
%127 = phi i32 [ %142, %135 ], [ %91, %89 ]
%128 = phi i8* [ %136, %135 ], [ %92, %89 ]
%129 = getelementptr inbounds i8, i8* %128, i64 1
%130 = load i8, i8* %128
%131 = icmp eq i8 %130, 46
br i1 %131, label %132, label %135
132: ; preds = %125
%133 = getelementptr inbounds i8, i8* %128, i64 2
%134 = load i8, i8* %129
br label %135
135: ; preds = %132, %125
%136 = phi i8* [ %133, %132 ], [ %129, %125 ]
%137 = phi i8 [ %134, %132 ], [ %130, %125 ]
%138 = mul nsw i32 %126, %2
%139 = sext i8 %137 to i32
%140 = add i32 %138, -48
%141 = add i32 %140, %139
%142 = add nsw i32 %127, -1
%143 = icmp sgt i32 %127, 1
br i1 %143, label %125, label %144
144: ; preds = %135
%145 = sitofp i32 %141 to double
br label %146
146: ; preds = %144, %87
%147 = phi double [ 0.000000e+00, %87 ], [ %90, %144 ]
%148 = phi double [ 0.000000e+00, %87 ], [ %145, %144 ]
%149 = tail call double @llvm.fmuladd.f64(double %47, double %147, double %148)
%150 = load i8, i8* %17
switch i8 %150, label %181 [
i8 69, label %151
i8 101, label %151
i8 83, label %151
i8 115, label %151
i8 70, label %151
i8 102, label %151
i8 68, label %151
i8 100, label %151
i8 76, label %151
i8 108, label %151
]
151: ; preds = %146, %146, %146, %146, %146, %146, %146, %146, %146, %146
%152 = getelementptr inbounds i8, i8* %17, i64 1
%153 = load i8, i8* %152
switch i8 %153, label %158 [
i8 45, label %154
i8 43, label %156
]
154: ; preds = %151
%155 = getelementptr inbounds i8, i8* %17, i64 2
br label %158
156: ; preds = %151
%157 = getelementptr inbounds i8, i8* %17, i64 2
br label %158
158: ; preds = %151, %156, %154
%159 = phi i1 [ true, %151 ], [ true, %156 ], [ false, %154 ]
%160 = phi i8* [ %152, %151 ], [ %157, %156 ], [ %155, %154 ]
%161 = load i8, i8* %160
%162 = tail call i64 @isdigitx(i8 signext %161, i32 %2)
%163 = icmp eq i64 %162, 0
br i1 %163, label %176, label %164
164: ; preds = %158, %164
%165 = phi i32 [ %172, %164 ], [ 0, %158 ]
%166 = phi i8* [ %168, %164 ], [ %160, %158 ]
%167 = mul nsw i32 %165, %2
%168 = getelementptr inbounds i8, i8* %166, i64 1
%169 = load i8, i8* %166
%170 = sext i8 %169 to i32
%171 = add i32 %167, -48
%172 = add i32 %171, %170
%173 = load i8, i8* %168
%174 = tail call i64 @isdigitx(i8 signext %173, i32 %2)
%175 = icmp eq i64 %174, 0
br i1 %175, label %176, label %164
176: ; preds = %164, %158
%177 = phi i8* [ %160, %158 ], [ %168, %164 ]
%178 = phi i32 [ 0, %158 ], [ %172, %164 ]
%179 = sub nsw i32 %52, %178
%180 = add nsw i32 %178, %52
br i1 %159, label %181, label %184
181: ; preds = %146, %176
%182 = phi i32 [ %180, %176 ], [ %52, %146 ]
%183 = phi i8* [ %177, %176 ], [ %17, %146 ]
br label %184
184: ; preds = %176, %181
%185 = phi i8* [ %183, %181 ], [ %177, %176 ]
%186 = phi i32 [ %182, %181 ], [ %179, %176 ]
%187 = icmp slt i32 %186, 0
%188 = sub nsw i32 0, %186
%189 = select i1 %187, i32 %188, i32 %186
%190 = icmp slt i32 %189, 307
%191 = select i1 %190, i32 %189, i32 307
%192 = icmp eq i32 %191, 0
br i1 %192, label %208, label %193
193: ; preds = %184, %203
%194 = phi i64 [ %206, %203 ], [ 0, %184 ]
%195 = phi i32 [ %205, %203 ], [ %191, %184 ]
%196 = phi double [ %204, %203 ], [ 1.000000e+00, %184 ]
%197 = and i32 %195, 1
%198 = icmp eq i32 %197, 0
br i1 %198, label %203, label %199
199: ; preds = %193
%200 = getelementptr inbounds double, double* %48, i64 %194
%201 = load double, double* %200
%202 = fmul double %196, %201
br label %203
203: ; preds = %193, %199
%204 = phi double [ %202, %199 ], [ %196, %193 ]
%205 = lshr i32 %195, 1
%206 = add nuw nsw i64 %194, 1
%207 = icmp ult i32 %195, 2
br i1 %207, label %208, label %193
208: ; preds = %203, %184
%209 = phi double [ 1.000000e+00, %184 ], [ %204, %203 ]
br i1 %187, label %210, label %212
210: ; preds = %208
%211 = fdiv double %149, %209
br label %214
212: ; preds = %208
%213 = fmul double %149, %209
br label %214
214: ; preds = %45, %210, %212
%215 = phi double [ %211, %210 ], [ %213, %212 ], [ 0.000000e+00, %45 ]
%216 = phi i8* [ %185, %210 ], [ %185, %212 ], [ %0, %45 ]
%217 = icmp eq i8** %1, null
br i1 %217, label %219, label %218
218: ; preds = %214
store i8* %216, i8** %1
br label %219
219: ; preds = %218, %214
%220 = fneg double %215
%221 = select i1 %15, double %215, double %220
ret double %221
}