long char_d2a_f(number, nplace, decimal, string, nchar)
double number;
long nplace;
long decimal;
char string[];
long *nchar;
{
  long status, pow10, a2l();
  char *pstr, *pexp, *pbuff, *pstart, *d2a();
  pstr = string;
  if ((nplace < (decimal + 3)) || (decimal < 1)) {
    *string = (char)'\0';
    *nchar = 0;
    return (4L);
  }
  pbuff = d2a(number, 14, 2, nchar, &status);
  if (status != 1L) {
    *string = (char)'\0';
    *nchar = 0;
    return (4L);
  }
  pexp = pbuff;
  for (; ((*pexp != 'E') && (*pexp != 'e')); pexp++) {
    if (*pexp == (char)'\0') {
      *string = (char)'\0';
      *nchar = 0;
      return (4L);
    }
  }
  pexp++;
  pow10 = a2l(pexp, status);
  if (status != 1L) {
    *string = (char)'\0';
    *nchar = 0;
    return (4L);
  }
  if (pow10 < 0) {
    pow10 = 0 - pow10;
    *pstr++ = *pbuff++;
    *pstr++ = '0';
    *pstr++ = '.';
    for (; pstr < (string + pow10 - 1 + 3); pstr++) {
      if (pstr >= (string + nplace)) {
        *string = (char)'\0';
        *nchar = 0;
        return (4L);
      }
      if (pstr >= (string + decimal + 3)) {
        *pstr = (char)'\0';
        *nchar = pstr - string;
        return (1L);
      }
      *pstr = '0';
    }
    while (pstr < (string + decimal + 3)) {
      if (pstr >= (string + nplace)) {
        *string = (char)'\0';
        *nchar = 0;
        return (4L);
      }
      switch (*pbuff) {
      case '.':
        pbuff++;
        break;
      case 'e':
      case 'E':
      case (char)'\0':
        *pstr++ = '0';
        break;
      default:
        if (((((*pbuff) >= '0') && ((*pbuff) <= '9')) ? 1 : 0)) {
          *pstr++ = *pbuff++;
        } else {
          *string = (char)'\0';
          *nchar = 0;
          return (4L);
        }
        break;
      }
    }
  } else if (pow10 > 0) {
    while (pstr < (string + pow10 + 2)) {
      if (pstr >= (string + nplace)) {
        *string = (char)'\0';
        *nchar = 0;
        return (4L);
      }
      switch (*pbuff) {
      case '.':
        pbuff++;
        break;
      case '-':
      case '+':
        *pstr++ = *pbuff++;
        break;
      case 'e':
      case 'E':
      case (char)'\0':
        *pstr++ = '0';
        break;
      default:
        if (((((*pbuff) >= '0') && ((*pbuff) <= '9')) ? 1 : 0)) {
          *pstr++ = *pbuff++;
        } else {
          *string = (char)'\0';
          *nchar = 0;
          return (4L);
        }
        break;
      }
    }
    if (pstr >= (string + nplace)) {
      *string = (char)'\0';
      *nchar = 0;
      return (4L);
    }
    *pstr++ = '.';
    if (pstr >= (string + nplace)) {
      *string = (char)'\0';
      *nchar = 0;
      return (4L);
    }
    pstart = pstr;
    while (pstr < (pstart + decimal)) {
      if (pstr >= (string + nplace)) {
        *string = (char)'\0';
        *nchar = 0;
        return (4L);
      }
      switch (*pbuff) {
      case '.':
        pbuff++;
        break;
      case 'e':
      case 'E':
      case (char)'\0':
        *pstr++ = '0';
        break;
      default:
        if (((((*pbuff) >= '0') && ((*pbuff) <= '9')) ? 1 : 0)) {
          *pstr++ = *pbuff++;
        } else {
          *string = (char)'\0';
          *nchar = 0;
          return (4L);
        }
        break;
      }
    }
    *pstr = (char)'\0';
  } else {
    while (pstr < (string + decimal + 3)) {
      if (pstr >= (string + nplace)) {
        *string = (char)'\0';
        *nchar = 0;
        return (4L);
      }
      switch (*pbuff) {
      case '.':
      case '-':
      case '+':
        *pstr++ = *pbuff++;
        break;
      case 'e':
      case 'E':
      case (char)'\0':
        *pstr++ = '0';
        break;
      default:
        if (((((*pbuff) >= '0') && ((*pbuff) <= '9')) ? 1 : 0)) {
          *pstr++ = *pbuff++;
        } else {
          *string = (char)'\0';
          *nchar = 0;
          return (4L);
        }
        break;
      }
    }
  }
  *pstr = (char)'\0';
  *nchar = pstr - string;
  return (1L);
}


x86 assembly (clang, -O0):
<char_d2a_f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x3,%rcx
cmp    %rcx,%rax
jl     1168 <char_d2a_f+0x48>
cmpq   $0x1,-0x20(%rbp)
jge    1187 <char_d2a_f+0x67>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
movsd  -0x10(%rbp),%xmm0
mov    -0x30(%rbp),%rdx
mov    $0xe,%edi
mov    $0x2,%esi
lea    -0x38(%rbp),%rcx
mov    $0x1,%al
call   1030 <d2a@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x1,-0x38(%rbp)
je     11d3 <char_d2a_f+0xb3>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x58(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x45,%ecx
mov    %al,-0x61(%rbp)
je     1200 <char_d2a_f+0xe0>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x65,%eax
setne  %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    1210 <char_d2a_f+0xf0>
jmp    1255 <char_d2a_f+0x135>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    123f <char_d2a_f+0x11f>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
jmp    1244 <char_d2a_f+0x124>
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
jmp    11db <char_d2a_f+0xbb>
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    $0x0,%al
call   1040 <a2l@plt>
mov    %rax,-0x40(%rbp)
cmpq   $0x1,-0x38(%rbp)
je     129e <char_d2a_f+0x17e>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
cmpq   $0x0,-0x40(%rbp)
jge    14f8 <char_d2a_f+0x3d8>
xor    %eax,%eax
sub    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x30,(%rax)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x2e,(%rax)
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x40(%rbp),%rcx
add    $0xffffffffffffffff,%rcx
add    $0x3,%rcx
cmp    %rcx,%rax
jae    13a1 <char_d2a_f+0x281>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     134a <char_d2a_f+0x22a>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x20(%rbp),%rcx
add    $0x3,%rcx
cmp    %rcx,%rax
jb     1389 <char_d2a_f+0x269>
mov    -0x48(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x48(%rbp),%rcx
mov    -0x28(%rbp),%rax
sub    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
movq   $0x1,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x48(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    12f9 <char_d2a_f+0x1d9>
jmp    13a6 <char_d2a_f+0x286>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x20(%rbp),%rcx
add    $0x3,%rcx
cmp    %rcx,%rax
jae    14f3 <char_d2a_f+0x3d3>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     13f3 <char_d2a_f+0x2d3>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x68(%rbp)
test   %eax,%eax
je     144e <char_d2a_f+0x32e>
jmp    140a <char_d2a_f+0x2ea>
mov    -0x68(%rbp),%eax
sub    $0x2e,%eax
je     143d <char_d2a_f+0x31d>
jmp    141b <char_d2a_f+0x2fb>
mov    -0x68(%rbp),%eax
sub    $0x45,%eax
je     144e <char_d2a_f+0x32e>
jmp    142c <char_d2a_f+0x30c>
mov    -0x68(%rbp),%eax
sub    $0x65,%eax
je     144e <char_d2a_f+0x32e>
jmp    1465 <char_d2a_f+0x345>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    14ee <char_d2a_f+0x3ce>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x30,(%rax)
jmp    14ee <char_d2a_f+0x3ce>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1494 <char_d2a_f+0x374>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     1494 <char_d2a_f+0x374>
mov    $0x1,%al
test   $0x1,%al
jne    14a3 <char_d2a_f+0x383>
jmp    14ca <char_d2a_f+0x3aa>
xor    %eax,%eax
test   $0x1,%al
jne    14a3 <char_d2a_f+0x383>
jmp    14ca <char_d2a_f+0x3aa>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    14e9 <char_d2a_f+0x3c9>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
jmp    14ee <char_d2a_f+0x3ce>
jmp    13a6 <char_d2a_f+0x286>
jmp    19fb <char_d2a_f+0x8db>
cmpq   $0x0,-0x40(%rbp)
jle    1875 <char_d2a_f+0x755>
jmp    1508 <char_d2a_f+0x3e8>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x40(%rbp),%rcx
add    $0x2,%rcx
cmp    %rcx,%rax
jae    169e <char_d2a_f+0x57e>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     1555 <char_d2a_f+0x435>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x6c(%rbp)
test   %eax,%eax
je     15f9 <char_d2a_f+0x4d9>
jmp    156c <char_d2a_f+0x44c>
mov    -0x6c(%rbp),%eax
sub    $0x2b,%eax
je     15d2 <char_d2a_f+0x4b2>
jmp    157d <char_d2a_f+0x45d>
mov    -0x6c(%rbp),%eax
sub    $0x2d,%eax
je     15d2 <char_d2a_f+0x4b2>
jmp    158e <char_d2a_f+0x46e>
mov    -0x6c(%rbp),%eax
sub    $0x2e,%eax
je     15c1 <char_d2a_f+0x4a1>
jmp    159f <char_d2a_f+0x47f>
mov    -0x6c(%rbp),%eax
sub    $0x45,%eax
je     15f9 <char_d2a_f+0x4d9>
jmp    15b0 <char_d2a_f+0x490>
mov    -0x6c(%rbp),%eax
sub    $0x65,%eax
je     15f9 <char_d2a_f+0x4d9>
jmp    1610 <char_d2a_f+0x4f0>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    1699 <char_d2a_f+0x579>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    1699 <char_d2a_f+0x579>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x30,(%rax)
jmp    1699 <char_d2a_f+0x579>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     163f <char_d2a_f+0x51f>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     163f <char_d2a_f+0x51f>
mov    $0x1,%al
test   $0x1,%al
jne    164e <char_d2a_f+0x52e>
jmp    1675 <char_d2a_f+0x555>
xor    %eax,%eax
test   $0x1,%al
jne    164e <char_d2a_f+0x52e>
jmp    1675 <char_d2a_f+0x555>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    1694 <char_d2a_f+0x574>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
jmp    1699 <char_d2a_f+0x579>
jmp    1508 <char_d2a_f+0x3e8>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     16d2 <char_d2a_f+0x5b2>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x2e,(%rax)
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     1718 <char_d2a_f+0x5f8>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x48(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x60(%rbp),%rcx
add    -0x20(%rbp),%rcx
cmp    %rcx,%rax
jae    1869 <char_d2a_f+0x749>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     1769 <char_d2a_f+0x649>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x70(%rbp)
test   %eax,%eax
je     17c4 <char_d2a_f+0x6a4>
jmp    1780 <char_d2a_f+0x660>
mov    -0x70(%rbp),%eax
sub    $0x2e,%eax
je     17b3 <char_d2a_f+0x693>
jmp    1791 <char_d2a_f+0x671>
mov    -0x70(%rbp),%eax
sub    $0x45,%eax
je     17c4 <char_d2a_f+0x6a4>
jmp    17a2 <char_d2a_f+0x682>
mov    -0x70(%rbp),%eax
sub    $0x65,%eax
je     17c4 <char_d2a_f+0x6a4>
jmp    17db <char_d2a_f+0x6bb>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    1864 <char_d2a_f+0x744>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x30,(%rax)
jmp    1864 <char_d2a_f+0x744>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     180a <char_d2a_f+0x6ea>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     180a <char_d2a_f+0x6ea>
mov    $0x1,%al
test   $0x1,%al
jne    1819 <char_d2a_f+0x6f9>
jmp    1840 <char_d2a_f+0x720>
xor    %eax,%eax
test   $0x1,%al
jne    1819 <char_d2a_f+0x6f9>
jmp    1840 <char_d2a_f+0x720>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    185f <char_d2a_f+0x73f>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
jmp    1864 <char_d2a_f+0x744>
jmp    1720 <char_d2a_f+0x600>
mov    -0x48(%rbp),%rax
movb   $0x0,(%rax)
jmp    19f6 <char_d2a_f+0x8d6>
jmp    187a <char_d2a_f+0x75a>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x20(%rbp),%rcx
add    $0x3,%rcx
cmp    %rcx,%rax
jae    19f1 <char_d2a_f+0x8d1>
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
add    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     18c7 <char_d2a_f+0x7a7>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x74(%rbp)
test   %eax,%eax
je     194c <char_d2a_f+0x82c>
jmp    18de <char_d2a_f+0x7be>
mov    -0x74(%rbp),%eax
sub    $0x2b,%eax
je     1925 <char_d2a_f+0x805>
jmp    18ef <char_d2a_f+0x7cf>
mov    -0x74(%rbp),%eax
add    $0xffffffd3,%eax
sub    $0x2,%eax
jb     1925 <char_d2a_f+0x805>
jmp    1903 <char_d2a_f+0x7e3>
mov    -0x74(%rbp),%eax
sub    $0x45,%eax
je     194c <char_d2a_f+0x82c>
jmp    1914 <char_d2a_f+0x7f4>
mov    -0x74(%rbp),%eax
sub    $0x65,%eax
je     194c <char_d2a_f+0x82c>
jmp    1963 <char_d2a_f+0x843>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    19ec <char_d2a_f+0x8cc>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
movb   $0x30,(%rax)
jmp    19ec <char_d2a_f+0x8cc>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1992 <char_d2a_f+0x872>
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     1992 <char_d2a_f+0x872>
mov    $0x1,%al
test   $0x1,%al
jne    19a1 <char_d2a_f+0x881>
jmp    19c8 <char_d2a_f+0x8a8>
xor    %eax,%eax
test   $0x1,%al
jne    19a1 <char_d2a_f+0x881>
jmp    19c8 <char_d2a_f+0x8a8>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    19e7 <char_d2a_f+0x8c7>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
movq   $0x4,-0x8(%rbp)
jmp    1a1c <char_d2a_f+0x8fc>
jmp    19ec <char_d2a_f+0x8cc>
jmp    187a <char_d2a_f+0x75a>
jmp    19f6 <char_d2a_f+0x8d6>
jmp    19fb <char_d2a_f+0x8db>
mov    -0x48(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x48(%rbp),%rcx
mov    -0x28(%rbp),%rax
sub    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
movq   $0x1,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<char_d2a_f>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rcx,%r14
mov    %rdx,%r13
test   %rsi,%rsi
jle    1418 <char_d2a_f+0x2f8>
mov    %rsi,%rbx
mov    %rdi,%r15
lea    0x3(%rsi),%rax
cmp    %rdi,%rax
jg     1418 <char_d2a_f+0x2f8>
lea    0x8(%rsp),%rcx
mov    $0xe,%edi
mov    $0x2,%esi
mov    %r14,%rdx
mov    $0x1,%al
call   1030 <d2a@plt>
cmpq   $0x1,0x8(%rsp)
jne    1418 <char_d2a_f+0x2f8>
mov    %rax,%r12
lea    0x1(%rax),%rdi
nopl   0x0(%rax,%rax,1)
movzbl -0x1(%rdi),%eax
cmp    $0x65,%al
je     119a <char_d2a_f+0x7a>
cmp    $0x45,%al
je     119a <char_d2a_f+0x7a>
test   %al,%al
je     1418 <char_d2a_f+0x2f8>
add    $0x1,%rdi
jmp    1180 <char_d2a_f+0x60>
mov    $0x1,%esi
xor    %eax,%eax
call   1040 <a2l@plt>
cmpq   $0x1,0x8(%rsp)
jne    1418 <char_d2a_f+0x2f8>
test   %rax,%rax
js     1241 <char_d2a_f+0x121>
je     12ad <char_d2a_f+0x18d>
lea    (%rax,%r13,1),%rcx
add    $0x2,%rcx
cmp    %r13,%rcx
jbe    1328 <char_d2a_f+0x208>
lea    (%r15,%r13,1),%r9
lea    0xe23(%rip),%r8
mov    %r13,%rax
jmp    11f2 <char_d2a_f+0xd2>
movb   $0x30,(%rax)
add    $0x1,%rax
cmp    %rcx,%rax
jae    132b <char_d2a_f+0x20b>
cmp    %r9,%rax
jae    1418 <char_d2a_f+0x2f8>
movzbl (%r12),%edi
movsbl %dil,%esi
lea    -0x2b(%rsi),%edx
cmp    $0x1a,%edx
ja     1223 <char_d2a_f+0x103>
movslq (%r8,%rdx,4),%rdx
add    %r8,%rdx
jmp    *%rdx
add    $0x1,%r12
cmp    %rcx,%rax
jb     11f2 <char_d2a_f+0xd2>
jmp    132b <char_d2a_f+0x20b>
test   %esi,%esi
je     11e2 <char_d2a_f+0xc2>
cmp    $0x65,%esi
je     11e2 <char_d2a_f+0xc2>
lea    -0x30(%rdi),%edx
cmp    $0x9,%dl
ja     1418 <char_d2a_f+0x2f8>
add    $0x1,%r12
mov    %dil,(%rax)
jmp    11e5 <char_d2a_f+0xc5>
mov    (%r12),%cl
mov    %cl,0x0(%r13)
movw   $0x2e30,0x1(%r13)
mov    %r13,%rdx
sub    %rax,%rdx
lea    -0x1(%rdx),%rax
cmp    %r13,%rax
jbe    13b1 <char_d2a_f+0x291>
add    $0x2,%rdx
lea    (%r15,%r13,1),%rax
lea    (%rbx,%r13,1),%rsi
add    $0x3,%rsi
mov    $0x3,%ecx
lea    (%rcx,%r13,1),%rdi
cmp    %rax,%rdi
jae    1418 <char_d2a_f+0x2f8>
cmp    %rsi,%rdi
jae    1435 <char_d2a_f+0x315>
movb   $0x30,0x0(%r13,%rcx,1)
lea    (%rcx,%r13,1),%rdi
add    $0x1,%rdi
add    $0x1,%rcx
cmp    %rdx,%rdi
jb     1278 <char_d2a_f+0x158>
add    %r13,%rcx
jmp    13b5 <char_d2a_f+0x295>
lea    (%rbx,%r13,1),%rax
add    $0x3,%rax
mov    %r13,%rcx
cmp    %r13,%rax
jbe    1440 <char_d2a_f+0x320>
add    %r13,%r15
mov    $0xd,%edx
movabs $0x400000004000000,%r8
mov    %r13,%rcx
jmp    12f9 <char_d2a_f+0x1d9>
lea    -0x30(%rdi),%esi
cmp    $0x9,%sil
ja     1418 <char_d2a_f+0x2f8>
add    $0x1,%r12
mov    %dil,(%rcx)
add    $0x1,%rcx
cmp    %rax,%rcx
jae    1440 <char_d2a_f+0x320>
cmp    %r15,%rcx
jae    1418 <char_d2a_f+0x2f8>
movzbl (%r12),%edi
movsbl %dil,%ebx
lea    -0x2b(%rbx),%esi
cmp    $0x3a,%esi
ja     131f <char_d2a_f+0x1ff>
bt     %rsi,%rdx
jb     12e5 <char_d2a_f+0x1c5>
bt     %rsi,%r8
jb     1323 <char_d2a_f+0x203>
test   %ebx,%ebx
jne    12d8 <char_d2a_f+0x1b8>
mov    $0x30,%dil
jmp    12e9 <char_d2a_f+0x1c9>
mov    %r13,%rax
add    %r13,%r15
cmp    %r15,%rax
jae    1418 <char_d2a_f+0x2f8>
lea    0x1(%rax),%rcx
movb   $0x2e,(%rax)
cmp    %r15,%rcx
jae    1418 <char_d2a_f+0x2f8>
test   %rbx,%rbx
jle    143d <char_d2a_f+0x31d>
add    %rbx,%rax
add    $0x1,%rax
jmp    1369 <char_d2a_f+0x249>
movb   $0x30,(%rcx)
add    $0x1,%rcx
cmp    %rax,%rcx
jae    143d <char_d2a_f+0x31d>
cmp    %r15,%rcx
jae    1418 <char_d2a_f+0x2f8>
movzbl (%r12),%edx
movsbl %dl,%esi
cmp    $0x44,%esi
jg     1396 <char_d2a_f+0x276>
test   %esi,%esi
je     1359 <char_d2a_f+0x239>
cmp    $0x2e,%esi
jne    13a0 <char_d2a_f+0x280>
add    $0x1,%r12
cmp    %rax,%rcx
jb     1369 <char_d2a_f+0x249>
jmp    143d <char_d2a_f+0x31d>
cmp    $0x45,%esi
je     1359 <char_d2a_f+0x239>
cmp    $0x65,%esi
je     1359 <char_d2a_f+0x239>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     1418 <char_d2a_f+0x2f8>
add    $0x1,%r12
mov    %dl,(%rcx)
jmp    135c <char_d2a_f+0x23c>
lea    0x3(%r13),%rcx
lea    (%rbx,%r13,1),%rax
add    $0x3,%rax
cmp    %rax,%rcx
jae    1440 <char_d2a_f+0x320>
add    $0x1,%r12
add    %r13,%r15
jmp    13d7 <char_d2a_f+0x2b7>
movb   $0x30,(%rcx)
add    $0x1,%rcx
cmp    %rax,%rcx
jae    1440 <char_d2a_f+0x320>
cmp    %r15,%rcx
jae    1418 <char_d2a_f+0x2f8>
movzbl (%r12),%edx
movsbl %dl,%esi
cmp    $0x44,%esi
jg     13fd <char_d2a_f+0x2dd>
test   %esi,%esi
je     13cb <char_d2a_f+0x2ab>
cmp    $0x2e,%esi
jne    1407 <char_d2a_f+0x2e7>
add    $0x1,%r12
cmp    %rax,%rcx
jb     13d7 <char_d2a_f+0x2b7>
jmp    1440 <char_d2a_f+0x320>
cmp    $0x45,%esi
je     13cb <char_d2a_f+0x2ab>
cmp    $0x65,%esi
je     13cb <char_d2a_f+0x2ab>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     1418 <char_d2a_f+0x2f8>
add    $0x1,%r12
mov    %dl,(%rcx)
jmp    13ce <char_d2a_f+0x2ae>
movb   $0x0,0x0(%r13)
mov    $0x4,%eax
xor    %ecx,%ecx
mov    %rcx,(%r14)
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
movb   $0x0,0x0(%r13,%rcx,1)
jmp    1446 <char_d2a_f+0x326>
movb   $0x0,(%rcx)
movb   $0x0,(%rcx)
sub    %r13,%rcx
mov    $0x1,%eax
jmp    1424 <char_d2a_f+0x304>

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

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