#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 */
typedef int uint8_t;
typedef int uint64_t;

/* Variables and functions */
int INT_MAX;
int UINT64_MAX;
double atod_guts(int, int);
scalar_t__ isdigit(char);
scalar_t__ isspace(char);
double emyg_strtod(const char *nptr, char **endptr) {
  const char *cp = nptr;
  double res;
  uint64_t mant;
  int minus = 0;
  int dadp = 0;
  int expt = 0;
  int expm = 0;
  char c;
  while (isspace(c = *cp++))
    ;
  if ('-' == c) {
    minus = 1;
    c = *cp++;
  } else if ('+' == c) {
    c = *cp++;
  } else {
  }
  if (('n' == c || 'N' == c) && ('a' == cp[0] || 'A' == cp[0]) &&
      ('n' == cp[1] || 'N' == cp[1])) {
    if ('.' == cp[2] && '0' == cp[3])
      cp = &cp[4];
    else
      cp = &cp[2];
    res = 0.0 / 0.0;
  } else if (('i' == c || 'I' == c) && ('n' == cp[0] || 'N' == cp[0]) &&
             ('f' == cp[1] || 'F' == cp[1])) {
    if ('.' == cp[2] && '0' == cp[3])
      cp = &cp[4];
    else
      cp = &cp[2];
    res = 1.0 / 0.0;
  } else if ('.' == c) {
    mant = 0;
    goto after_dp;
  } else if (isdigit(c)) {
    mant = c - '0';
    while (isdigit(c = *cp++)) {
      uint8_t d = c - '0';
      if (mant <= (UINT64_MAX / 10))
        mant *= 10;
      else {
        if (0 == d)
          expt += 1;
        else {
          ;
          goto no_conv;
        }
      }
      if (mant <= (UINT64_MAX - d))
        mant += d;
      else {
        ;
        goto no_conv;
      }
    }
    if ('.' == c) {
    after_dp:
      while (isdigit(c = *cp++)) {
        uint8_t d = c - '0';
        if (mant <= (UINT64_MAX / 10))
          mant *= 10;
        else {
          if (0 == d) {
            continue;
          } else {
            ;
            continue;
          }
        }
        if (mant <= (UINT64_MAX - d))
          mant += d;
        else {
          ;
          continue;
        }
        dadp++;
      }
    }
    if ('e' == c || 'E' == c) {
      c = *cp++;
      if ('-' == c) {
        expm = 1;
        c = *cp++;
      } else if ('+' == c) {
        c = *cp++;
      } else {
      }
      if (isdigit(c)) {
        expt += c - '0';
        while (isdigit(c = *cp++)) {
          uint8_t d = c - '0';
          if (expt <= (INT_MAX / 10))
            expt *= 10;
          else {
            ;
            goto no_conv;
          }
          if (expt <= (INT_MAX - d))
            expt += d;
          else {
            ;
            goto no_conv;
          }
        }
      } else {
        c = *--cp;
        if (('-' == c) || ('+' == c))
          --cp;
        res = 0.0;
      }
    }
    if (expm)
      expt = -expt;
    res = atod_guts(mant, expt - dadp);
  } else {
  no_conv:
    cp = nptr + 1;
    res = 0.0;
  }
  if (NULL != endptr)
    *endptr = (char *)--cp;
  return minus ? -res : res;
}


x86 assembly (clang, -O0):
<emyg_strtod>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
movsbl %al,%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
je     118f <emyg_strtod+0x5f>
jmp    1164 <emyg_strtod+0x34>
movsbl -0x35(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
jne    11c0 <emyg_strtod+0x90>
movl   $0x1,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
jmp    11f4 <emyg_strtod+0xc4>
movsbl -0x35(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
jne    11ea <emyg_strtod+0xba>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
jmp    11ef <emyg_strtod+0xbf>
jmp    11ef <emyg_strtod+0xbf>
jmp    11f4 <emyg_strtod+0xc4>
movsbl -0x35(%rbp),%ecx
mov    $0x6e,%eax
cmp    %ecx,%eax
je     1216 <emyg_strtod+0xe6>
movsbl -0x35(%rbp),%ecx
mov    $0x4e,%eax
cmp    %ecx,%eax
jne    12c1 <emyg_strtod+0x191>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
je     123e <emyg_strtod+0x10e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jne    12c1 <emyg_strtod+0x191>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x6e,%eax
cmp    %ecx,%eax
je     1268 <emyg_strtod+0x138>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x4e,%eax
cmp    %ecx,%eax
jne    12c1 <emyg_strtod+0x191>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%ecx
mov    $0x2e,%eax
cmp    %ecx,%eax
jne    12a3 <emyg_strtod+0x173>
mov    -0x18(%rbp),%rax
movsbl 0x3(%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jne    12a3 <emyg_strtod+0x173>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    12af <emyg_strtod+0x17f>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
movsd  0xd51(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    173d <emyg_strtod+0x60d>
movsbl -0x35(%rbp),%ecx
mov    $0x69,%eax
cmp    %ecx,%eax
je     12e3 <emyg_strtod+0x1b3>
movsbl -0x35(%rbp),%ecx
mov    $0x49,%eax
cmp    %ecx,%eax
jne    138e <emyg_strtod+0x25e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x6e,%eax
cmp    %ecx,%eax
je     130b <emyg_strtod+0x1db>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x4e,%eax
cmp    %ecx,%eax
jne    138e <emyg_strtod+0x25e>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x66,%eax
cmp    %ecx,%eax
je     1335 <emyg_strtod+0x205>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x46,%eax
cmp    %ecx,%eax
jne    138e <emyg_strtod+0x25e>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%ecx
mov    $0x2e,%eax
cmp    %ecx,%eax
jne    1370 <emyg_strtod+0x240>
mov    -0x18(%rbp),%rax
movsbl 0x3(%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jne    1370 <emyg_strtod+0x240>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    137c <emyg_strtod+0x24c>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
movsd  0xc7c(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1738 <emyg_strtod+0x608>
movsbl -0x35(%rbp),%ecx
mov    $0x2e,%eax
cmp    %ecx,%eax
jne    13ab <emyg_strtod+0x27b>
movl   $0x0,-0x24(%rbp)
jmp    1490 <emyg_strtod+0x360>
movsbl -0x35(%rbp),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1715 <emyg_strtod+0x5e5>
movsbl -0x35(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
movsbl %al,%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     147a <emyg_strtod+0x34a>
movsbl -0x35(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    0x2bcb(%rip),%rax
mov    (%rax),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x48(%rbp),%eax
cmp    %ecx,%eax
jg     1428 <emyg_strtod+0x2f8>
imul   $0xa,-0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    144b <emyg_strtod+0x31b>
xor    %eax,%eax
cmp    -0x3c(%rbp),%eax
jne    1441 <emyg_strtod+0x311>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1446 <emyg_strtod+0x316>
jmp    171a <emyg_strtod+0x5ea>
jmp    144b <emyg_strtod+0x31b>
mov    -0x24(%rbp),%eax
mov    0x2b7b(%rip),%rcx
mov    (%rcx),%ecx
sub    -0x3c(%rbp),%ecx
cmp    %ecx,%eax
jg     1470 <emyg_strtod+0x340>
mov    -0x3c(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1475 <emyg_strtod+0x345>
jmp    171a <emyg_strtod+0x5ea>
jmp    13c8 <emyg_strtod+0x298>
movsbl -0x35(%rbp),%ecx
mov    $0x2e,%eax
cmp    %ecx,%eax
jne    1547 <emyg_strtod+0x417>
jmp    1490 <emyg_strtod+0x360>
jmp    1495 <emyg_strtod+0x365>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
movsbl %al,%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1542 <emyg_strtod+0x412>
movsbl -0x35(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    0x2afe(%rip),%rax
mov    (%rax),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
cmp    %ecx,%eax
jg     14f5 <emyg_strtod+0x3c5>
imul   $0xa,-0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    150a <emyg_strtod+0x3da>
xor    %eax,%eax
cmp    -0x40(%rbp),%eax
jne    1505 <emyg_strtod+0x3d5>
jmp    1495 <emyg_strtod+0x365>
jmp    1495 <emyg_strtod+0x365>
mov    -0x24(%rbp),%eax
mov    0x2abc(%rip),%rcx
mov    (%rcx),%ecx
sub    -0x40(%rbp),%ecx
cmp    %ecx,%eax
jg     152f <emyg_strtod+0x3ff>
mov    -0x40(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    1534 <emyg_strtod+0x404>
jmp    1495 <emyg_strtod+0x365>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1495 <emyg_strtod+0x365>
jmp    1547 <emyg_strtod+0x417>
movsbl -0x35(%rbp),%ecx
mov    $0x65,%eax
cmp    %ecx,%eax
je     1569 <emyg_strtod+0x439>
movsbl -0x35(%rbp),%ecx
mov    $0x45,%eax
cmp    %ecx,%eax
jne    16eb <emyg_strtod+0x5bb>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
movsbl -0x35(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
jne    15ae <emyg_strtod+0x47e>
movl   $0x1,-0x34(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
jmp    15e2 <emyg_strtod+0x4b2>
movsbl -0x35(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
jne    15d8 <emyg_strtod+0x4a8>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
jmp    15dd <emyg_strtod+0x4ad>
jmp    15dd <emyg_strtod+0x4ad>
jmp    15e2 <emyg_strtod+0x4b2>
movsbl -0x35(%rbp),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     169b <emyg_strtod+0x56b>
movsbl -0x35(%rbp),%eax
sub    $0x30,%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x35(%rbp)
movsbl %al,%edi
call   1040 <isdigit@plt>
cmp    $0x0,%rax
je     1696 <emyg_strtod+0x566>
movsbl -0x35(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x44(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    0x29a9(%rip),%rax
mov    (%rax),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x50(%rbp),%eax
cmp    %ecx,%eax
jg     1662 <emyg_strtod+0x532>
imul   $0xa,-0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1667 <emyg_strtod+0x537>
jmp    171a <emyg_strtod+0x5ea>
mov    -0x30(%rbp),%eax
mov    0x2977(%rip),%rcx
mov    (%rcx),%ecx
sub    -0x44(%rbp),%ecx
cmp    %ecx,%eax
jg     168c <emyg_strtod+0x55c>
mov    -0x44(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1691 <emyg_strtod+0x561>
jmp    171a <emyg_strtod+0x5ea>
jmp    1602 <emyg_strtod+0x4d2>
jmp    16e6 <emyg_strtod+0x5b6>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
mov    -0x1(%rax),%al
mov    %al,-0x35(%rbp)
movsbl -0x35(%rbp),%ecx
mov    $0x2d,%eax
cmp    %ecx,%eax
je     16d2 <emyg_strtod+0x5a2>
movsbl -0x35(%rbp),%ecx
mov    $0x2b,%eax
cmp    %ecx,%eax
jne    16de <emyg_strtod+0x5ae>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    16eb <emyg_strtod+0x5bb>
cmpl   $0x0,-0x34(%rbp)
je     16fd <emyg_strtod+0x5cd>
xor    %eax,%eax
sub    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%edi
mov    -0x30(%rbp),%esi
sub    -0x2c(%rbp),%esi
call   1030 <atod_guts@plt>
movsd  %xmm0,-0x20(%rbp)
jmp    172e <emyg_strtod+0x5fe>
jmp    171a <emyg_strtod+0x5ea>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1733 <emyg_strtod+0x603>
jmp    1738 <emyg_strtod+0x608>
jmp    173d <emyg_strtod+0x60d>
xor    %eax,%eax
cmp    -0x10(%rbp),%rax
je     175c <emyg_strtod+0x62c>
mov    -0x18(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
cmpl   $0x0,-0x28(%rbp)
je     178c <emyg_strtod+0x65c>
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1796 <emyg_strtod+0x666>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<emyg_strtod>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rsi,0x10(%rsp)
mov    %rdi,%r15
mov    %rdi,0x20(%rsp)
nopl   0x0(%rax,%rax,1)
movzbl (%r15),%ebx
add    $0x1,%r15
movsbl %bl,%edi
call   1050 <isspace@plt>
test   %rax,%rax
jne    1150 <emyg_strtod+0x20>
cmp    $0x2b,%bl
je     1173 <emyg_strtod+0x43>
cmp    $0x2d,%bl
jne    117f <emyg_strtod+0x4f>
xor    %ebp,%ebp
jmp    1176 <emyg_strtod+0x46>
mov    $0x1,%bpl
mov    (%r15),%bl
add    $0x1,%r15
jmp    1182 <emyg_strtod+0x52>
mov    $0x1,%bpl
mov    %ebx,%eax
and    $0xdf,%al
cmp    $0x49,%al
je     11af <emyg_strtod+0x7f>
cmp    $0x4e,%al
jne    11f9 <emyg_strtod+0xc9>
mov    (%r15),%al
or     $0x20,%al
cmp    $0x61,%al
jne    1209 <emyg_strtod+0xd9>
mov    0x1(%r15),%al
or     $0x20,%al
cmp    $0x6e,%al
jne    1209 <emyg_strtod+0xd9>
lea    0x2(%r15),%rdx
movsd  0xe5b(%rip),%xmm0
jmp    11ce <emyg_strtod+0x9e>
mov    (%r15),%al
or     $0x20,%al
cmp    $0x6e,%al
jne    1209 <emyg_strtod+0xd9>
mov    0x1(%r15),%al
or     $0x20,%al
cmp    $0x66,%al
jne    1209 <emyg_strtod+0xd9>
lea    0x2(%r15),%rdx
movsd  0xe32(%rip),%xmm0
cmpb   $0x2e,0x2(%r15)
mov    0x10(%rsp),%rcx
jne    13ff <emyg_strtod+0x2cf>
lea    0x4(%r15),%rax
cmpb   $0x30,0x3(%r15)
cmove  %rax,%rdx
test   %rcx,%rcx
jne    1404 <emyg_strtod+0x2d4>
jmp    140b <emyg_strtod+0x2db>
xor    %r13d,%r13d
cmp    $0x2e,%bl
jne    1209 <emyg_strtod+0xd9>
xor    %r12d,%r12d
jmp    12af <emyg_strtod+0x17f>
mov    %ebp,0xc(%rsp)
movsbl %bl,%r13d
mov    %r13d,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     13ea <emyg_strtod+0x2ba>
add    $0xffffffd0,%r13d
add    $0x1,%r15
xor    %r12d,%r12d
mov    0x2d9c(%rip),%rbx
jmp    125d <emyg_strtod+0x12d>
cs nopw 0x0(%rax,%rax,1)
add    %r13d,%r13d
lea    0x0(%r13,%r13,4),%r13d
sub    %ebp,%eax
add    %r13d,%ebp
add    $0x1,%r15
cmp    %eax,%r13d
mov    %ebp,%r13d
jg     13ea <emyg_strtod+0x2ba>
movzbl -0x1(%r15),%r14d
movsbl %r14b,%ebp
mov    %ebp,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     129f <emyg_strtod+0x16f>
add    $0xffffffd0,%ebp
movslq (%rbx),%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x22,%rcx
add    %edx,%ecx
cmp    %ecx,%r13d
jle    1240 <emyg_strtod+0x110>
test   %ebp,%ebp
jne    13ea <emyg_strtod+0x2ba>
add    $0x1,%r12d
jmp    1248 <emyg_strtod+0x118>
xor    %ebx,%ebx
cmp    $0x2e,%r14b
mov    0xc(%rsp),%ebp
jne    133c <emyg_strtod+0x20c>
mov    (%r15),%r14b
add    $0x1,%r15
movsbl %r14b,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     133a <emyg_strtod+0x20a>
mov    %ebp,0xc(%rsp)
xor    %ebx,%ebx
mov    0x2cff(%rip),%rbp
jmp    12f6 <emyg_strtod+0x1c6>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%r15),%r14d
add    $0x1,%r15
movsbl %r14b,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     1334 <emyg_strtod+0x204>
movslq 0x0(%rbp),%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x22,%rcx
add    %edx,%ecx
cmp    %ecx,%r13d
jg     12e0 <emyg_strtod+0x1b0>
movsbl %r14b,%ecx
add    $0xffffffd0,%ecx
add    %r13d,%r13d
lea    0x0(%r13,%r13,4),%r13d
sub    %ecx,%eax
cmp    %eax,%r13d
jg     12e0 <emyg_strtod+0x1b0>
add    %r13d,%ecx
add    $0x1,%ebx
mov    %ecx,%r13d
jmp    12e0 <emyg_strtod+0x1b0>
mov    0xc(%rsp),%ebp
jmp    133c <emyg_strtod+0x20c>
xor    %ebx,%ebx
and    $0xdf,%r14b
cmp    $0x45,%r14b
jne    1456 <emyg_strtod+0x326>
mov    (%r15),%al
cmp    $0x2d,%al
mov    %ebp,0xc(%rsp)
je     135e <emyg_strtod+0x22e>
cmp    $0x2b,%al
jne    136b <emyg_strtod+0x23b>
mov    $0x1,%r14b
jmp    1361 <emyg_strtod+0x231>
xor    %r14d,%r14d
mov    0x1(%r15),%al
add    $0x2,%r15
jmp    1372 <emyg_strtod+0x242>
add    $0x1,%r15
mov    $0x1,%r14b
movsbl %al,%ebp
mov    %ebp,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     1426 <emyg_strtod+0x2f6>
mov    %r14d,0x1c(%rsp)
mov    %ebx,%r14d
add    %ebp,%r12d
add    $0xffffffd0,%r12d
add    $0x1,%r15
mov    0x2c49(%rip),%rbx
nop
movsbl -0x1(%r15),%ebp
mov    %ebp,%edi
call   1040 <isdigit@plt>
test   %rax,%rax
je     1438 <emyg_strtod+0x308>
movslq (%rbx),%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x22,%rcx
add    %edx,%ecx
cmp    %ecx,%r12d
jg     13ea <emyg_strtod+0x2ba>
add    $0xffffffd0,%ebp
add    %r12d,%r12d
lea    (%r12,%r12,4),%ecx
sub    %ebp,%eax
add    %ecx,%ebp
add    $0x1,%r15
mov    %ebp,%r12d
cmp    %eax,%ecx
jle    13a0 <emyg_strtod+0x270>
mov    0x20(%rsp),%rdx
add    $0x1,%rdx
xorps  %xmm0,%xmm0
mov    0x10(%rsp),%rcx
mov    0xc(%rsp),%ebp
test   %rcx,%rcx
je     140b <emyg_strtod+0x2db>
add    $0xffffffffffffffff,%rdx
mov    %rdx,(%rcx)
test   %bpl,%bpl
jne    1417 <emyg_strtod+0x2e7>
xorps  0xbf9(%rip),%xmm0
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    -0x1(%r15),%al
cmp    $0x2d,%al
je     1432 <emyg_strtod+0x302>
cmp    $0x2b,%al
jne    1446 <emyg_strtod+0x316>
add    $0xfffffffffffffffe,%r15
jmp    144a <emyg_strtod+0x31a>
mov    0xc(%rsp),%ebp
mov    %r14d,%ebx
mov    0x1c(%rsp),%r14d
jmp    144e <emyg_strtod+0x31e>
add    $0xffffffffffffffff,%r15
mov    0xc(%rsp),%ebp
test   %r14b,%r14b
jne    1456 <emyg_strtod+0x326>
neg    %r12d
sub    %ebx,%r12d
mov    %r13d,%edi
mov    %r12d,%esi
call   1030 <atod_guts@plt>
mov    %r15,%rdx
mov    0x10(%rsp),%rcx
test   %rcx,%rcx
jne    1404 <emyg_strtod+0x2d4>
jmp    140b <emyg_strtod+0x2db>

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

LLVM IR (-O2):
@UINT64_MAX = global i32 0
@INT_MAX = global i32 0
define double @emyg_strtod(i8* %0, i8** writeonly %1) {
br label %3
3: ; preds = %3, %2
%4 = phi i8* [ %0, %2 ], [ %5, %3 ]
%5 = getelementptr inbounds i8, i8* %4, i64 1
%6 = load i8, i8* %4
%7 = tail call i64 @isspace(i8 signext %6)
%8 = icmp eq i64 %7, 0
br i1 %8, label %9, label %3
9: ; preds = %3
switch i8 %6, label %15 [
i8 45, label %11
i8 43, label %10
]
10: ; preds = %9
br label %11
11: ; preds = %9, %10
%12 = phi i1 [ true, %10 ], [ false, %9 ]
%13 = getelementptr inbounds i8, i8* %4, i64 2
%14 = load i8, i8* %5
br label %15
15: ; preds = %11, %9
%16 = phi i1 [ true, %9 ], [ %12, %11 ]
%17 = phi i8 [ %6, %9 ], [ %14, %11 ]
%18 = phi i8* [ %5, %9 ], [ %13, %11 ]
%19 = sext i8 %17 to i32
%20 = and i8 %17, -33
switch i8 %20, label %51 [
i8 78, label %21
i8 73, label %36
]
21: ; preds = %15
%22 = load i8, i8* %18
switch i8 %22, label %53 [
i8 97, label %23
i8 65, label %23
]
23: ; preds = %21, %21
%24 = getelementptr inbounds i8, i8* %18, i64 1
%25 = load i8, i8* %24
switch i8 %25, label %53 [
i8 110, label %26
i8 78, label %26
]
26: ; preds = %23, %23
%27 = getelementptr inbounds i8, i8* %18, i64 2
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, 46
br i1 %29, label %30, label %181
30: ; preds = %26
%31 = getelementptr inbounds i8, i8* %18, i64 3
%32 = load i8, i8* %31
%33 = icmp eq i8 %32, 48
%34 = getelementptr inbounds i8, i8* %18, i64 4
%35 = select i1 %33, i8* %34, i8* %27
br label %181
36: ; preds = %15
%37 = load i8, i8* %18
switch i8 %37, label %53 [
i8 110, label %38
i8 78, label %38
]
38: ; preds = %36, %36
%39 = getelementptr inbounds i8, i8* %18, i64 1
%40 = load i8, i8* %39
switch i8 %40, label %53 [
i8 102, label %41
i8 70, label %41
]
41: ; preds = %38, %38
%42 = getelementptr inbounds i8, i8* %18, i64 2
%43 = load i8, i8* %42
%44 = icmp eq i8 %43, 46
br i1 %44, label %45, label %181
45: ; preds = %41
%46 = getelementptr inbounds i8, i8* %18, i64 3
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 48
%49 = getelementptr inbounds i8, i8* %18, i64 4
%50 = select i1 %48, i8* %49, i8* %42
br label %181
51: ; preds = %15
%52 = icmp eq i8 %17, 46
br i1 %52, label %86, label %53
53: ; preds = %21, %23, %36, %38, %51
%54 = tail call i64 @isdigit(i8 signext %17)
%55 = icmp eq i64 %54, 0
br i1 %55, label %179, label %56
56: ; preds = %53
%57 = add nsw i32 %19, -48
br label %58
58: ; preds = %78, %56
%59 = phi i32 [ %57, %56 ], [ %83, %78 ]
%60 = phi i32 [ 0, %56 ], [ %80, %78 ]
%61 = phi i8* [ %18, %56 ], [ %62, %78 ]
%62 = getelementptr inbounds i8, i8* %61, i64 1
%63 = load i8, i8* %61
%64 = tail call i64 @isdigit(i8 signext %63)
%65 = icmp eq i64 %64, 0
br i1 %65, label %84, label %66
66: ; preds = %58
%67 = sext i8 %63 to i32
%68 = add nsw i32 %67, -48
%69 = load i32, i32* @UINT64_MAX
%70 = sdiv i32 %69, 10
%71 = icmp sgt i32 %59, %70
br i1 %71, label %74, label %72
72: ; preds = %66
%73 = mul nsw i32 %59, 10
br label %78
74: ; preds = %66
%75 = icmp eq i32 %68, 0
br i1 %75, label %76, label %179
76: ; preds = %74
%77 = add nsw i32 %60, 1
br label %78
78: ; preds = %76, %72
%79 = phi i32 [ %73, %72 ], [ %59, %76 ]
%80 = phi i32 [ %60, %72 ], [ %77, %76 ]
%81 = sub nsw i32 %69, %68
%82 = icmp sgt i32 %79, %81
%83 = add nsw i32 %79, %68
br i1 %82, label %179, label %58
84: ; preds = %58
%85 = icmp eq i8 %63, 46
br i1 %85, label %86, label %118
86: ; preds = %51, %84
%87 = phi i32 [ %59, %84 ], [ 0, %51 ]
%88 = phi i32 [ %60, %84 ], [ 0, %51 ]
%89 = phi i8* [ %62, %84 ], [ %18, %51 ]
%90 = getelementptr inbounds i8, i8* %89, i64 1
%91 = load i8, i8* %89
%92 = tail call i64 @isdigit(i8 signext %91)
%93 = icmp eq i64 %92, 0
br i1 %93, label %118, label %94
94: ; preds = %86, %111
%95 = phi i8 [ %115, %111 ], [ %91, %86 ]
%96 = phi i8* [ %114, %111 ], [ %90, %86 ]
%97 = phi i32 [ %113, %111 ], [ 0, %86 ]
%98 = phi i32 [ %112, %111 ], [ %87, %86 ]
%99 = sext i8 %95 to i32
%100 = add nsw i32 %99, -48
%101 = load i32, i32* @UINT64_MAX
%102 = sdiv i32 %101, 10
%103 = icmp sgt i32 %98, %102
br i1 %103, label %111, label %104
104: ; preds = %94
%105 = mul nsw i32 %98, 10
%106 = sub nsw i32 %101, %100
%107 = icmp sgt i32 %105, %106
br i1 %107, label %111, label %108
108: ; preds = %104
%109 = add nsw i32 %100, %105
%110 = add nsw i32 %97, 1
br label %111
111: ; preds = %104, %94, %108
%112 = phi i32 [ %109, %108 ], [ %98, %94 ], [ %105, %104 ]
%113 = phi i32 [ %110, %108 ], [ %97, %94 ], [ %97, %104 ]
%114 = getelementptr inbounds i8, i8* %96, i64 1
%115 = load i8, i8* %96
%116 = tail call i64 @isdigit(i8 signext %115)
%117 = icmp eq i64 %116, 0
br i1 %117, label %118, label %94
118: ; preds = %111, %86, %84
%119 = phi i32 [ %59, %84 ], [ %87, %86 ], [ %112, %111 ]
%120 = phi i32 [ 0, %84 ], [ 0, %86 ], [ %113, %111 ]
%121 = phi i32 [ %60, %84 ], [ %88, %86 ], [ %88, %111 ]
%122 = phi i8 [ %63, %84 ], [ %91, %86 ], [ %115, %111 ]
%123 = phi i8* [ %62, %84 ], [ %90, %86 ], [ %114, %111 ]
%124 = and i8 %122, -33
%125 = icmp eq i8 %124, 69
br i1 %125, label %126, label %171
126: ; preds = %118
%127 = getelementptr inbounds i8, i8* %123, i64 1
%128 = load i8, i8* %123
switch i8 %128, label %134 [
i8 45, label %130
i8 43, label %129
]
129: ; preds = %126
br label %130
130: ; preds = %126, %129
%131 = phi i1 [ true, %129 ], [ false, %126 ]
%132 = getelementptr inbounds i8, i8* %123, i64 2
%133 = load i8, i8* %127
br label %134
134: ; preds = %130, %126
%135 = phi i1 [ true, %126 ], [ %131, %130 ]
%136 = phi i8 [ %128, %126 ], [ %133, %130 ]
%137 = phi i8* [ %127, %126 ], [ %132, %130 ]
%138 = tail call i64 @isdigit(i8 signext %136)
%139 = icmp eq i64 %138, 0
br i1 %139, label %162, label %140
140: ; preds = %134
%141 = sext i8 %136 to i32
%142 = add i32 %121, -48
%143 = add i32 %142, %141
br label %144
144: ; preds = %157, %140
%145 = phi i32 [ %143, %140 ], [ %161, %157 ]
%146 = phi i8* [ %137, %140 ], [ %147, %157 ]
%147 = getelementptr inbounds i8, i8* %146, i64 1
%148 = load i8, i8* %146
%149 = tail call i64 @isdigit(i8 signext %148)
%150 = icmp eq i64 %149, 0
br i1 %150, label %167, label %151
151: ; preds = %144
%152 = sext i8 %148 to i32
%153 = add nsw i32 %152, -48
%154 = load i32, i32* @INT_MAX
%155 = sdiv i32 %154, 10
%156 = icmp sgt i32 %145, %155
br i1 %156, label %179, label %157
157: ; preds = %151
%158 = mul nsw i32 %145, 10
%159 = sub nsw i32 %154, %153
%160 = icmp sgt i32 %158, %159
%161 = add nsw i32 %153, %158
br i1 %160, label %179, label %144
162: ; preds = %134
%163 = getelementptr inbounds i8, i8* %137, i64 -1
%164 = load i8, i8* %163
switch i8 %164, label %167 [
i8 45, label %165
i8 43, label %165
]
165: ; preds = %162, %162
%166 = getelementptr inbounds i8, i8* %137, i64 -2
br label %167
167: ; preds = %144, %165, %162
%168 = phi i32 [ %121, %162 ], [ %121, %165 ], [ %145, %144 ]
%169 = phi i8* [ %163, %162 ], [ %166, %165 ], [ %147, %144 ]
%170 = sub nsw i32 0, %168
br i1 %135, label %171, label %174
171: ; preds = %118, %167
%172 = phi i8* [ %169, %167 ], [ %123, %118 ]
%173 = phi i32 [ %168, %167 ], [ %121, %118 ]
br label %174
174: ; preds = %167, %171
%175 = phi i8* [ %172, %171 ], [ %169, %167 ]
%176 = phi i32 [ %173, %171 ], [ %170, %167 ]
%177 = sub nsw i32 %176, %120
%178 = tail call double @atod_guts(i32 %119, i32 %177)
br label %181
179: ; preds = %78, %74, %157, %151, %53
%180 = getelementptr inbounds i8, i8* %0, i64 1
br label %181
181: ; preds = %45, %30, %41, %26, %174, %179
%182 = phi double [ 0.000000e+00, %179 ], [ %178, %174 ], [ 0x7FF8000000000000, %26 ], [ 0x7FF0000000000000, %41 ], [ 0x7FF8000000000000, %30 ], [ 0x7FF0000000000000, %45 ]
%183 = phi i8* [ %180, %179 ], [ %175, %174 ], [ %27, %26 ], [ %42, %41 ], [ %35, %30 ], [ %50, %45 ]
%184 = icmp eq i8** %1, null
br i1 %184, label %187, label %185
185: ; preds = %181
%186 = getelementptr inbounds i8, i8* %183, i64 -1
store i8* %186, i8** %1
br label %187
187: ; preds = %181, %185
%188 = fneg double %182
%189 = select i1 %16, double %182, double %188
ret double %189
}