#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 /*<<< orphan*/ iconvert;
typedef int /*<<< orphan*/ fconvert;

/* Variables and functions */
double abs_val(double);
scalar_t__ dopr_outch(char *, size_t *, size_t, char);
long pow10_int(int);
long round_int(long);
int fmtfp(char *buffer, size_t *currlen, size_t maxlen, double fvalue, int min,
          int max, int flags) {
  int signvalue = 0;
  double ufvalue;
  char iconvert[24];
  char fconvert[24];
  int iplace = 0;
  int fplace = 0;
  int padlen = 0;
  int zpadlen = 0;
  int total = 0;
  long intpart;
  long fracpart;
  long mask10;
  int leadingfrac0s = 0;
  int omitzeros = 0;
  int omitcount = 0;
  if (max < 0)
    max = 6;
  ufvalue = abs_val(fvalue);
  if (fvalue < 0)
    signvalue = '-';
  else if (flags & (1 << 1))
    signvalue = '+';
  else if (flags & (1 << 2))
    signvalue = ' ';
  intpart = ufvalue;
  if (flags & (1 << 7)) {
    if (intpart != 0) {
      long temp = intpart;
      for (temp = intpart; temp != 0; temp /= 10)
        --max;
      if (max < 0)
        max = 0;
    } else {
      double temp;
      if (ufvalue != 0)
        for (temp = ufvalue; temp < 0.1; temp *= 10)
          ++max;
    }
  }
  if ((flags & (1 << 7)) && !(flags & (1 << 3)))
    omitzeros = 1;
  if (max > 9)
    max = 9;
  mask10 = pow10_int(max);
  fracpart = round_int(mask10 * (ufvalue - intpart));
  if (fracpart >= mask10) {
    intpart++;
    fracpart -= mask10;
  } else if (fracpart != 0)
    while (fracpart < mask10 / 10) {
      ++leadingfrac0s;
      mask10 /= 10;
    }
  do {
    iconvert[iplace++] = '0' + intpart % 10;
    intpart = (intpart / 10);
  } while (intpart && (iplace < sizeof(iconvert)));
  if (iplace == sizeof(iconvert))
    iplace--;
  iconvert[iplace] = 0;
  do {
    fconvert[fplace++] = '0' + fracpart % 10;
    fracpart = (fracpart / 10);
  } while (fracpart && (fplace < sizeof(fconvert)));
  while (leadingfrac0s-- > 0 && fplace < sizeof(fconvert))
    fconvert[fplace++] = '0';
  if (fplace == sizeof(fconvert))
    fplace--;
  fconvert[fplace] = 0;
  if (omitzeros)
    while (omitcount < fplace && fconvert[omitcount] == '0')
      ++omitcount;
  padlen = min - iplace - (max - omitcount) - 1 - ((signvalue) ? 1 : 0);
  if (!omitzeros)
    zpadlen = max - fplace;
  if (zpadlen < 0)
    zpadlen = 0;
  if (padlen < 0)
    padlen = 0;
  if (flags & (1 << 0))
    padlen = -padlen;
  if ((flags & (1 << 4)) && (padlen > 0)) {
    if (signvalue) {
      total += dopr_outch(buffer, currlen, maxlen, signvalue);
      --padlen;
      signvalue = 0;
    }
    while (padlen > 0) {
      total += dopr_outch(buffer, currlen, maxlen, '0');
      --padlen;
    }
  }
  while (padlen > 0) {
    total += dopr_outch(buffer, currlen, maxlen, ' ');
    --padlen;
  }
  if (signvalue)
    total += dopr_outch(buffer, currlen, maxlen, signvalue);
  while (iplace > 0)
    total += dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);
  if (max > 0 && (fplace > omitcount || zpadlen > 0)) {
    total += dopr_outch(buffer, currlen, maxlen, '.');
    while (fplace > omitcount)
      total += dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);
  }
  while (zpadlen > 0) {
    total += dopr_outch(buffer, currlen, maxlen, '0');
    --zpadlen;
  }
  while (padlen < 0) {
    total += dopr_outch(buffer, currlen, maxlen, ' ');
    ++padlen;
  }
  return total;
}


x86 assembly (clang, -O0):
<fmtfp>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x74(%rbp)
movl   $0x0,-0x78(%rbp)
movl   $0x0,-0x7c(%rbp)
movl   $0x0,-0x80(%rbp)
movl   $0x0,-0x84(%rbp)
movl   $0x0,-0xa4(%rbp)
movl   $0x0,-0xa8(%rbp)
movl   $0x0,-0xac(%rbp)
cmpl   $0x0,-0x28(%rbp)
jge    11c3 <fmtfp+0x83>
movl   $0x6,-0x28(%rbp)
movsd  -0x20(%rbp),%xmm0
call   1040 <abs_val@plt>
movsd  %xmm0,-0x38(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    11ec <fmtfp+0xac>
movl   $0x2d,-0x30(%rbp)
jmp    1227 <fmtfp+0xe7>
mov    -0x2c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1207 <fmtfp+0xc7>
movl   $0x2b,-0x30(%rbp)
jmp    1222 <fmtfp+0xe2>
mov    -0x2c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     121d <fmtfp+0xdd>
movl   $0x20,-0x30(%rbp)
jmp    1222 <fmtfp+0xe2>
jmp    1227 <fmtfp+0xe7>
cvttsd2si -0x38(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x2c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     132e <fmtfp+0x1ee>
cmpq   $0x0,-0x90(%rbp)
je     12b9 <fmtfp+0x179>
mov    -0x90(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x90(%rbp),%rax
mov    %rax,-0xb8(%rbp)
cmpq   $0x0,-0xb8(%rbp)
je     12a3 <fmtfp+0x163>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
mov    -0xb8(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0xb8(%rbp)
jmp    126f <fmtfp+0x12f>
cmpl   $0x0,-0x28(%rbp)
jge    12b4 <fmtfp+0x174>
movl   $0x0,-0x28(%rbp)
jmp    1329 <fmtfp+0x1e9>
movsd  -0x38(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12d6 <fmtfp+0x196>
jp     12d6 <fmtfp+0x196>
jmp    1324 <fmtfp+0x1e4>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
movsd  0xd15(%rip),%xmm0
ucomisd -0xc0(%rbp),%xmm0
ff
jbe    131f <fmtfp+0x1df>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movsd  0xcfe(%rip),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  %xmm0,-0xc0(%rbp)
ff
jmp    12e3 <fmtfp+0x1a3>
jmp    1324 <fmtfp+0x1e4>
jmp    1329 <fmtfp+0x1e9>
jmp    132e <fmtfp+0x1ee>
mov    -0x2c(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     1358 <fmtfp+0x218>
mov    -0x2c(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
jne    1358 <fmtfp+0x218>
movl   $0x1,-0xa8(%rbp)
cmpl   $0x9,-0x28(%rbp)
jle    1369 <fmtfp+0x229>
movl   $0x9,-0x28(%rbp)
mov    -0x28(%rbp),%edi
call   1050 <pow10_int@plt>
mov    %rax,-0xa0(%rbp)
cvtsi2sdq -0xa0(%rbp),%xmm0
ff ff
movsd  -0x38(%rbp),%xmm1
cvtsi2sdq -0x90(%rbp),%xmm2
ff ff
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rdi
call   1030 <round_int@plt>
mov    %rax,-0x98(%rbp)
mov    -0x98(%rbp),%rax
cmp    -0xa0(%rbp),%rax
jl     13eb <fmtfp+0x2ab>
mov    -0x90(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x90(%rbp)
mov    -0xa0(%rbp),%rcx
mov    -0x98(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x98(%rbp)
jmp    1466 <fmtfp+0x326>
cmpq   $0x0,-0x98(%rbp)
je     1461 <fmtfp+0x321>
jmp    13fe <fmtfp+0x2be>
mov    -0x98(%rbp),%rax
mov    %rax,-0xc8(%rbp)
mov    -0xa0(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0xc8(%rbp),%rax
cmp    %rcx,%rax
jge    145c <fmtfp+0x31c>
mov    -0xa4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xa4(%rbp)
mov    -0xa0(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0xa0(%rbp)
jmp    13fe <fmtfp+0x2be>
jmp    1461 <fmtfp+0x321>
jmp    1466 <fmtfp+0x326>
jmp    146b <fmtfp+0x32b>
mov    -0x90(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x74(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x74(%rbp)
cltq
mov    %cl,-0x50(%rbp,%rax,1)
mov    -0x90(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x90(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x90(%rbp)
mov    %al,-0xc9(%rbp)
je     14d2 <fmtfp+0x392>
movslq -0x74(%rbp),%rax
cmp    $0x18,%rax
setb   %al
mov    %al,-0xc9(%rbp)
mov    -0xc9(%rbp),%al
test   $0x1,%al
jne    146b <fmtfp+0x32b>
movslq -0x74(%rbp),%rax
cmp    $0x18,%rax
jne    14f7 <fmtfp+0x3b7>
mov    -0x74(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x74(%rbp)
movslq -0x74(%rbp),%rax
movb   $0x0,-0x50(%rbp,%rax,1)
mov    -0x98(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x78(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x78(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
mov    -0x98(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x98(%rbp)
xor    %eax,%eax
cmpq   $0x0,-0x98(%rbp)
mov    %al,-0xca(%rbp)
je     1567 <fmtfp+0x427>
movslq -0x78(%rbp),%rax
cmp    $0x18,%rax
setb   %al
mov    %al,-0xca(%rbp)
mov    -0xca(%rbp),%al
test   $0x1,%al
jne    1500 <fmtfp+0x3c0>
jmp    157a <fmtfp+0x43a>
mov    -0xa4(%rbp),%ecx
mov    %ecx,%eax
add    $0xffffffff,%eax
mov    %eax,-0xa4(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xcb(%rbp)
jle    15ad <fmtfp+0x46d>
movslq -0x78(%rbp),%rax
cmp    $0x18,%rax
setb   %al
mov    %al,-0xcb(%rbp)
mov    -0xcb(%rbp),%al
test   $0x1,%al
jne    15c0 <fmtfp+0x480>
jmp    15d7 <fmtfp+0x497>
mov    -0x78(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x78(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    157a <fmtfp+0x43a>
movslq -0x78(%rbp),%rax
cmp    $0x18,%rax
jne    15ee <fmtfp+0x4ae>
mov    -0x78(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x78(%rbp)
movslq -0x78(%rbp),%rax
movb   $0x0,-0x70(%rbp,%rax,1)
cmpl   $0x0,-0xa8(%rbp)
je     1664 <fmtfp+0x524>
jmp    1609 <fmtfp+0x4c9>
mov    -0xac(%rbp),%ecx
xor    %eax,%eax
cmp    -0x78(%rbp),%ecx
mov    %al,-0xcc(%rbp)
jge    1638 <fmtfp+0x4f8>
movslq -0xac(%rbp),%rax
movsbl -0x70(%rbp,%rax,1),%eax
cmp    $0x30,%eax
sete   %al
mov    %al,-0xcc(%rbp)
mov    -0xcc(%rbp),%al
test   $0x1,%al
jne    164b <fmtfp+0x50b>
jmp    165f <fmtfp+0x51f>
mov    -0xac(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xac(%rbp)
jmp    1609 <fmtfp+0x4c9>
jmp    1664 <fmtfp+0x524>
mov    -0x24(%rbp),%eax
sub    -0x74(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    -0xac(%rbp),%ecx
sub    %ecx,%eax
sub    $0x1,%eax
mov    -0x30(%rbp),%esi
xor    %ecx,%ecx
mov    $0x1,%edx
cmp    $0x0,%esi
cmovne %edx,%ecx
sub    %ecx,%eax
mov    %eax,-0x7c(%rbp)
cmpl   $0x0,-0xa8(%rbp)
jne    16a3 <fmtfp+0x563>
mov    -0x28(%rbp),%eax
sub    -0x78(%rbp),%eax
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x80(%rbp)
jge    16b4 <fmtfp+0x574>
movl   $0x0,-0x80(%rbp)
cmpl   $0x0,-0x7c(%rbp)
jge    16c5 <fmtfp+0x585>
movl   $0x0,-0x7c(%rbp)
mov    -0x2c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     16dc <fmtfp+0x59c>
xor    %eax,%eax
sub    -0x7c(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x2c(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1784 <fmtfp+0x644>
cmpl   $0x0,-0x7c(%rbp)
jle    1784 <fmtfp+0x644>
cmpl   $0x0,-0x30(%rbp)
je     1739 <fmtfp+0x5f9>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x30(%rbp),%eax
movsbl %al,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x7c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x7c(%rbp)
movl   $0x0,-0x30(%rbp)
jmp    173e <fmtfp+0x5fe>
cmpl   $0x0,-0x7c(%rbp)
jle    177f <fmtfp+0x63f>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x30,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x7c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x7c(%rbp)
jmp    173e <fmtfp+0x5fe>
jmp    1784 <fmtfp+0x644>
jmp    1789 <fmtfp+0x649>
cmpl   $0x0,-0x7c(%rbp)
jle    17ca <fmtfp+0x68a>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x20,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x7c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x7c(%rbp)
jmp    1789 <fmtfp+0x649>
cmpl   $0x0,-0x30(%rbp)
je     17fe <fmtfp+0x6be>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x30(%rbp),%eax
movsbl %al,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
jmp    1803 <fmtfp+0x6c3>
cmpl   $0x0,-0x74(%rbp)
jle    1846 <fmtfp+0x706>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x74(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x74(%rbp)
cltq
movsbl -0x50(%rbp,%rax,1),%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
jmp    1803 <fmtfp+0x6c3>
cmpl   $0x0,-0x28(%rbp)
jle    18df <fmtfp+0x79f>
mov    -0x78(%rbp),%eax
cmp    -0xac(%rbp),%eax
jg     1869 <fmtfp+0x729>
cmpl   $0x0,-0x80(%rbp)
jle    18df <fmtfp+0x79f>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x2e,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x78(%rbp),%eax
cmp    -0xac(%rbp),%eax
jle    18da <fmtfp+0x79a>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x78(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x78(%rbp)
cltq
movsbl -0x70(%rbp,%rax,1),%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
jmp    1892 <fmtfp+0x752>
jmp    18df <fmtfp+0x79f>
jmp    18e4 <fmtfp+0x7a4>
cmpl   $0x0,-0x80(%rbp)
jle    1925 <fmtfp+0x7e5>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x30,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x80(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x80(%rbp)
jmp    18e4 <fmtfp+0x7a4>
jmp    192a <fmtfp+0x7ea>
cmpl   $0x0,-0x7c(%rbp)
jge    196b <fmtfp+0x82b>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    $0x20,%ecx
call   1060 <dopr_outch@plt>
mov    %rax,%rcx
movslq -0x84(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x84(%rbp)
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
jmp    192a <fmtfp+0x7ea>
mov    -0x84(%rbp),%eax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fmtfp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %r9d,%r12d
mov    %ecx,%r13d
movsd  %xmm0,0x18(%rsp)
mov    %rdx,%rbp
mov    %rsi,0x10(%rsp)
mov    %rdi,%rbx
test   %r8d,%r8d
mov    $0x6,%r14d
cmovns %r8d,%r14d
call   1040 <abs_val@plt>
xorpd  %xmm1,%xmm1
ucomisd 0x18(%rsp),%xmm1
mov    %rbp,0x8(%rsp)
jbe    11a2 <fmtfp+0x52>
mov    $0x2d,%eax
jmp    11bb <fmtfp+0x6b>
test   $0x2,%r12b
jne    11b6 <fmtfp+0x66>
mov    %r12d,%eax
and    $0x4,%eax
sete   %cl
shl    $0x3,%eax
jmp    11bd <fmtfp+0x6d>
mov    $0x2b,%eax
xor    %ecx,%ecx
cvttsd2si %xmm0,%rbp
movabs $0x6666666666666667,%r15
66 66 66
test   $0x80,%r12b
mov    %eax,0x40(%rsp)
mov    %r12d,0x20(%rsp)
mov    %r13,0x58(%rsp)
mov    %ecx,0x3c(%rsp)
movsd  %xmm0,0x28(%rsp)
je     126e <fmtfp+0x11e>
test   %rbp,%rbp
je     1230 <fmtfp+0xe0>
mov    %rbp,%rcx
cs nopw 0x0(%rax,%rax,1)
add    $0xffffffff,%r14d
mov    %rcx,%rax
imul   %r15
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%rdx
add    %rax,%rdx
add    $0x9,%rcx
cmp    $0x12,%rcx
mov    %rdx,%rcx
ja     1200 <fmtfp+0xb0>
xor    %eax,%eax
test   %r14d,%r14d
cmovs  %eax,%r14d
jmp    126e <fmtfp+0x11e>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123c <fmtfp+0xec>
jnp    126e <fmtfp+0x11e>
movsd  0xdbc(%rip),%xmm3
ucomisd %xmm0,%xmm3
jbe    126e <fmtfp+0x11e>
movsd  0xdb6(%rip),%xmm1
movapd %xmm0,%xmm2
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r14d
mulsd  %xmm1,%xmm2
ucomisd %xmm2,%xmm3
ja     1260 <fmtfp+0x110>
cmp    $0x9,%r14d
mov    $0x9,%edi
cmovl  %r14d,%edi
mov    %rdi,0x18(%rsp)
call   1060 <pow10_int@plt>
mov    %rax,%r13
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %rbp,%xmm1
movsd  0x28(%rsp),%xmm2
subsd  %xmm1,%xmm2
mulsd  %xmm0,%xmm2
cvttsd2si %xmm2,%rdi
call   1030 <round_int@plt>
mov    %rax,%rcx
sub    %r13,%rcx
mov    %rbx,0x30(%rsp)
jge    12f5 <fmtfp+0x1a5>
mov    %rax,%rsi
test   %rax,%rax
je     12fb <fmtfp+0x1ab>
mov    $0xffffffff,%r12d
nopl   0x0(%rax,%rax,1)
mov    %r13,%rax
imul   %r15
mov    %rdx,%r13
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%r13
add    %rax,%r13
add    $0x1,%r12d
cmp    %r13,%rsi
jl     12d0 <fmtfp+0x180>
mov    %rsi,%rcx
jmp    1300 <fmtfp+0x1b0>
add    $0x1,%rbp
jmp    12fd <fmtfp+0x1ad>
xor    %ecx,%ecx
xor    %r12d,%r12d
mov    0x20(%rsp),%r13d
and    $0x88,%r13d
xor    %edi,%edi
xchg   %ax,%ax
mov    %rbp,%rsi
mov    %rbp,%rax
imul   %r15
mov    %rdx,%rbp
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%rbp
add    %rax,%rbp
lea    0x0(%rbp,%rbp,1),%eax
lea    (%rax,%rax,4),%eax
mov    %esi,%edx
sub    %eax,%edx
add    $0x30,%dl
lea    0x1(%rdi),%rax
mov    %dl,0x80(%rsp,%rdi,1)
add    $0xfffffffffffffff6,%rsi
cmp    $0xffffffffffffffec,%rsi
ja     1356 <fmtfp+0x206>
cmp    $0x17,%rdi
mov    %rax,%rdi
jb     1310 <fmtfp+0x1c0>
lea    -0x1(%rax),%edx
cmp    $0x18,%eax
cmovne %eax,%edx
mov    %rdx,0x28(%rsp)
movb   $0x0,0x80(%rsp,%rdx,1)
xor    %edi,%edi
xchg   %ax,%ax
mov    %rcx,%rsi
mov    %rcx,%rax
imul   %r15
mov    %rdx,%rcx
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%rcx
add    %rax,%rcx
lea    (%rcx,%rcx,1),%eax
lea    (%rax,%rax,4),%eax
mov    %esi,%edx
sub    %eax,%edx
add    $0x30,%dl
lea    0x1(%rdi),%rbp
mov    %dl,0x60(%rsp,%rdi,1)
add    $0xfffffffffffffff6,%rsi
cmp    $0xffffffffffffffec,%rsi
ja     13b2 <fmtfp+0x262>
cmp    $0x17,%rdi
mov    %rbp,%rdi
jb     1370 <fmtfp+0x220>
test   %r12d,%r12d
je     1419 <fmtfp+0x2c9>
lea    -0x1(%rbp),%eax
cmp    $0x17,%eax
jae    1419 <fmtfp+0x2c9>
lea    (%rsp,%rbp,1),%rdi
add    $0x60,%rdi
lea    -0x1(%r12),%eax
xor    %ecx,%ecx
mov    $0x17,%esi
sub    %ebp,%esi
cmovb  %ecx,%esi
cmp    %eax,%esi
cmovae %eax,%esi
add    $0x1,%esi
test   %eax,%eax
mov    $0x1,%edx
cmovne %esi,%edx
mov    $0x30,%esi
call   1050 <memset@plt>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x1(%rbp),%rax
cmp    $0x2,%r12d
jl     1417 <fmtfp+0x2c7>
add    $0xffffffff,%r12d
cmp    $0x17,%rbp
mov    %rax,%rbp
jb     1400 <fmtfp+0x2b0>
mov    %eax,%ebp
mov    0x3c(%rsp),%r8d
cmp    $0x18,%ebp
mov    $0x17,%r9d
cmovne %ebp,%r9d
xor    %eax,%eax
movb   $0x0,0x60(%rsp,%r9,1)
mov    $0x0,%ebx
cmp    $0x80,%r13d
mov    0x10(%rsp),%rsi
mov    0x30(%rsp),%rbp
mov    0x28(%rsp),%r12
jne    1474 <fmtfp+0x324>
cmp    $0x2,%r9d
mov    $0x1,%ebx
cmovae %r9d,%ebx
xor    %ecx,%ecx
nop
cmpb   $0x30,0x60(%rsp,%rcx,1)
jne    1472 <fmtfp+0x322>
add    $0x1,%rcx
cmp    %rcx,%rbx
jne    1460 <fmtfp+0x310>
jmp    1474 <fmtfp+0x324>
mov    %ecx,%ebx
mov    %r8d,%ecx
xor    $0x1,%cl
movzbl %cl,%ecx
mov    0x58(%rsp),%rdi
sub    %ecx,%edi
mov    0x18(%rsp),%rdx
sub    %edx,%edi
sub    %r12d,%edi
sub    %r9d,%edx
cmp    $0x80,%r13d
lea    -0x1(%rdi,%rbx,1),%ecx
cmove  %eax,%edx
mov    %rdx,0x18(%rsp)
test   %ecx,%ecx
cmovns %ecx,%eax
mov    %eax,%r13d
neg    %r13d
mov    0x20(%rsp),%ecx
test   $0x1,%cl
cmove  %eax,%r13d
test   $0x10,%cl
mov    %r9,0x50(%rsp)
mov    %rbx,0x48(%rsp)
je     153a <fmtfp+0x3ea>
test   %r13d,%r13d
jle    153a <fmtfp+0x3ea>
xor    %r15d,%r15d
test   %r8b,%r8b
mov    0x40(%rsp),%ecx
jne    14f9 <fmtfp+0x3a9>
mov    %rbp,%rdi
mov    0x8(%rsp),%rdx
call   1070 <dopr_outch@plt>
mov    %rax,%r15
add    $0xffffffff,%r13d
je     1594 <fmtfp+0x444>
mov    0x10(%rsp),%rsi
add    $0x1,%r13d
mov    0x8(%rsp),%rbx
mov    %rsi,%r12
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbp,%rdi
mov    %r12,%rsi
mov    %rbx,%rdx
mov    $0x30,%ecx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
add    $0xffffffff,%r13d
cmp    $0x1,%r13d
ja     1510 <fmtfp+0x3c0>
xor    %r13d,%r13d
mov    0x28(%rsp),%r12
jmp    1597 <fmtfp+0x447>
test   %r13d,%r13d
jle    1577 <fmtfp+0x427>
mov    %r13d,%ebx
add    $0x1,%ebx
xor    %r13d,%r13d
xor    %r15d,%r15d
mov    0x8(%rsp),%r12
mov    %rbp,%rdi
mov    %r12,%rdx
mov    $0x20,%ecx
call   1070 <dopr_outch@plt>
mov    0x10(%rsp),%rsi
add    %eax,%r15d
add    $0xffffffff,%ebx
cmp    $0x1,%ebx
ja     1550 <fmtfp+0x400>
mov    0x28(%rsp),%r12
jmp    157a <fmtfp+0x42a>
xor    %r15d,%r15d
mov    0x40(%rsp),%ecx
test   %ecx,%ecx
je     1597 <fmtfp+0x447>
mov    %rbp,%rdi
mov    0x8(%rsp),%rdx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
jmp    1597 <fmtfp+0x447>
xor    %r13d,%r13d
test   %r12d,%r12d
mov    %r14d,0x44(%rsp)
je     15f3 <fmtfp+0x4a3>
mov    %r12,%rax
lea    0x1(%r12),%ebx
add    $0xffffffff,%eax
mov    0x10(%rsp),%r12
lea    (%rsp,%rax,1),%rbp
add    $0x80,%rbp
mov    0x8(%rsp),%r14
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl 0x0(%rbp),%ecx
mov    0x30(%rsp),%rdi
mov    %r12,%rsi
mov    %r14,%rdx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
add    $0xffffffff,%ebx
add    $0xffffffffffffffff,%rbp
cmp    $0x1,%ebx
jg     15d0 <fmtfp+0x480>
cmpl   $0x0,0x44(%rsp)
jle    1681 <fmtfp+0x531>
mov    0x50(%rsp),%rax
mov    0x48(%rsp),%rbp
cmp    %ebp,%eax
ja     1613 <fmtfp+0x4c3>
cmpl   $0x0,0x18(%rsp)
jle    1681 <fmtfp+0x531>
mov    0x30(%rsp),%r12
mov    %r12,%rdi
mov    0x10(%rsp),%r14
mov    %r14,%rsi
mov    0x8(%rsp),%rdx
mov    $0x2e,%ecx
mov    %rax,%rbx
call   1070 <dopr_outch@plt>
mov    %rbp,%rdx
mov    %rbx,%rcx
add    %eax,%r15d
cmp    %edx,%ecx
jle    1681 <fmtfp+0x531>
movslq %ecx,%rbx
mov    %r12,%rbp
movslq %edx,%rax
mov    %rax,0x20(%rsp)
mov    0x8(%rsp),%r12
cs nopw 0x0(%rax,%rax,1)
nop
movsbl 0x5f(%rsp,%rbx,1),%ecx
add    $0xffffffffffffffff,%rbx
mov    %rbp,%rdi
mov    %r14,%rsi
mov    %r12,%rdx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
cmp    0x20(%rsp),%rbx
jg     1660 <fmtfp+0x510>
mov    0x18(%rsp),%rbx
test   %ebx,%ebx
jle    16d8 <fmtfp+0x588>
add    $0x1,%ebx
mov    0x10(%rsp),%r14
mov    0x30(%rsp),%r12
mov    0x8(%rsp),%rbp
nopl   0x0(%rax)
mov    %r12,%rdi
mov    %r14,%rsi
mov    %rbp,%rdx
mov    $0x30,%ecx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
add    $0xffffffff,%ebx
cmp    $0x1,%ebx
jg     16a0 <fmtfp+0x550>
test   %r13d,%r13d
js     16f0 <fmtfp+0x5a0>
mov    %r15d,%eax
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x10(%rsp),%r14
mov    0x30(%rsp),%r12
mov    0x8(%rsp),%rbp
test   %r13d,%r13d
jns    16c3 <fmtfp+0x573>
nopl   0x0(%rax)
mov    %r12,%rdi
mov    %r14,%rsi
mov    %rbp,%rdx
mov    $0x20,%ecx
call   1070 <dopr_outch@plt>
add    %eax,%r15d
inc    %r13d
jne    16f0 <fmtfp+0x5a0>
jmp    16c3 <fmtfp+0x573>

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

LLVM IR (-O2):
define i32 @fmtfp(i8* %0, i64* %1, i64 %2, double %3, i32 %4, i32 %5, i32 %6) {
%8 = alloca [24 x i8]
%9 = alloca [24 x i8]
%10 = getelementptr inbounds [24 x i8], [24 x i8]* %8, i64 0, i64 0
%11 = getelementptr inbounds [24 x i8], [24 x i8]* %9, i64 0, i64 0
%12 = icmp slt i32 %5, 0
%13 = select i1 %12, i32 6, i32 %5
%14 = tail call double @abs_val(double %3)
%15 = fcmp olt double %3, 0.000000e+00
br i1 %15, label %23, label %16
16: ; preds = %7
%17 = and i32 %6, 2
%18 = icmp eq i32 %17, 0
br i1 %18, label %19, label %23
19: ; preds = %16
%20 = and i32 %6, 4
%21 = icmp eq i32 %20, 0
%22 = shl nuw nsw i32 %20, 3
br label %23
23: ; preds = %19, %16, %7
%24 = phi i1 [ false, %7 ], [ false, %16 ], [ %21, %19 ]
%25 = phi i32 [ 45, %7 ], [ 43, %16 ], [ %22, %19 ]
%26 = fptosi double %14 to i64
%27 = and i32 %6, 128
%28 = icmp eq i32 %27, 0
br i1 %28, label %51, label %29
29: ; preds = %23
%30 = icmp eq i64 %26, 0
br i1 %30, label %41, label %31
31: ; preds = %29, %31
%32 = phi i64 [ %35, %31 ], [ %26, %29 ]
%33 = phi i32 [ %34, %31 ], [ %13, %29 ]
%34 = add nsw i32 %33, -1
%35 = sdiv i64 %32, 10
%36 = add i64 %32, 9
%37 = icmp ult i64 %36, 19
br i1 %37, label %38, label %31
38: ; preds = %31
%39 = icmp sgt i32 %34, 0
%40 = select i1 %39, i32 %34, i32 0
br label %51
41: ; preds = %29
%42 = fcmp une double %14, 0.000000e+00
%43 = fcmp olt double %14, 1.000000e-01
%44 = and i1 %42, %43
br i1 %44, label %45, label %51
45: ; preds = %41, %45
%46 = phi double [ %49, %45 ], [ %14, %41 ]
%47 = phi i32 [ %48, %45 ], [ %13, %41 ]
%48 = add nsw i32 %47, 1
%49 = fmul double %46, 1.000000e+01
%50 = fcmp olt double %49, 1.000000e-01
br i1 %50, label %45, label %51
51: ; preds = %45, %41, %38, %23
%52 = phi i32 [ %40, %38 ], [ %13, %23 ], [ %13, %41 ], [ %48, %45 ]
%53 = and i32 %6, 136
%54 = icmp eq i32 %53, 128
%55 = icmp slt i32 %52, 9
%56 = select i1 %55, i32 %52, i32 9
%57 = tail call i64 @pow10_int(i32 %56)
%58 = sitofp i64 %57 to double
%59 = sitofp i64 %26 to double
%60 = fsub double %14, %59
%61 = fmul double %60, %58
%62 = fptosi double %61 to i64
%63 = tail call i64 @round_int(i64 %62)
%64 = icmp slt i64 %63, %57
br i1 %64, label %68, label %65
65: ; preds = %51
%66 = add nsw i64 %26, 1
%67 = sub nsw i64 %63, %57
br label %76
68: ; preds = %51
%69 = icmp eq i64 %63, 0
br i1 %69, label %76, label %70
70: ; preds = %68, %70
%71 = phi i64 [ %73, %70 ], [ %57, %68 ]
%72 = phi i32 [ %75, %70 ], [ 0, %68 ]
%73 = sdiv i64 %71, 10
%74 = icmp slt i64 %63, %73
%75 = add nuw nsw i32 %72, 1
br i1 %74, label %70, label %76
76: ; preds = %70, %68, %65
%77 = phi i64 [ %66, %65 ], [ %26, %68 ], [ %26, %70 ]
%78 = phi i64 [ %67, %65 ], [ 0, %68 ], [ %63, %70 ]
%79 = phi i32 [ 0, %65 ], [ 0, %68 ], [ %72, %70 ]
br label %80
80: ; preds = %80, %76
%81 = phi i64 [ %86, %80 ], [ 0, %76 ]
%82 = phi i64 [ %88, %80 ], [ %77, %76 ]
%83 = srem i64 %82, 10
%84 = trunc i64 %83 to i8
%85 = add nsw i8 %84, 48
%86 = add nuw nsw i64 %81, 1
%87 = getelementptr inbounds [24 x i8], [24 x i8]* %8, i64 0, i64 %81
store i8 %85, i8* %87
%88 = sdiv i64 %82, 10
%89 = add i64 %82, -10
%90 = icmp ult i64 %89, -19
%91 = icmp ult i64 %81, 23
%92 = select i1 %90, i1 %91, i1 false
br i1 %92, label %80, label %93
93: ; preds = %80
%94 = trunc i64 %81 to i32
%95 = trunc i64 %86 to i32
%96 = icmp eq i32 %95, 24
%97 = select i1 %96, i32 %94, i32 %95
%98 = zext i32 %97 to i64
%99 = getelementptr inbounds [24 x i8], [24 x i8]* %8, i64 0, i64 %98
store i8 0, i8* %99
br label %100
100: ; preds = %100, %93
%101 = phi i64 [ %106, %100 ], [ 0, %93 ]
%102 = phi i64 [ %108, %100 ], [ %78, %93 ]
%103 = srem i64 %102, 10
%104 = trunc i64 %103 to i8
%105 = add nsw i8 %104, 48
%106 = add nuw nsw i64 %101, 1
%107 = getelementptr inbounds [24 x i8], [24 x i8]* %9, i64 0, i64 %101
store i8 %105, i8* %107
%108 = sdiv i64 %102, 10
%109 = add i64 %102, -10
%110 = icmp ult i64 %109, -19
%111 = icmp ult i64 %101, 23
%112 = select i1 %110, i1 %111, i1 false
br i1 %112, label %100, label %113
113: ; preds = %100
%114 = trunc i64 %101 to i32
%115 = trunc i64 %106 to i32
%116 = icmp ne i32 %79, 0
%117 = icmp ult i32 %114, 23
%118 = select i1 %116, i1 %117, i1 false
br i1 %118, label %119, label %138
119: ; preds = %113
%120 = getelementptr [24 x i8], [24 x i8]* %9, i64 0, i64 %106
%121 = add nsw i32 %79, -1
%122 = call i32 @llvm.usub.sat.i32(i32 23, i32 %115)
%123 = icmp eq i32 %121, 0
%124 = call i32 @llvm.umin.i32(i32 %122, i32 %121)
%125 = add nuw nsw i32 %124, 1
%126 = select i1 %123, i32 1, i32 %125
%127 = zext i32 %126 to i64
br label %128
128: ; preds = %119, %128
%129 = phi i64 [ %106, %119 ], [ %132, %128 ]
%130 = phi i32 [ %79, %119 ], [ %131, %128 ]
%131 = add nsw i32 %130, -1
%132 = add nuw nsw i64 %129, 1
%133 = icmp sgt i32 %130, 1
%134 = icmp ult i64 %129, 23
%135 = select i1 %133, i1 %134, i1 false
br i1 %135, label %128, label %136
136: ; preds = %128
%137 = trunc i64 %132 to i32
br label %138
138: ; preds = %136, %113
%139 = phi i32 [ %115, %113 ], [ %137, %136 ]
%140 = icmp eq i32 %139, 24
%141 = select i1 %140, i32 23, i32 %139
%142 = zext i32 %141 to i64
%143 = getelementptr inbounds [24 x i8], [24 x i8]* %9, i64 0, i64 %142
store i8 0, i8* %143
br i1 %54, label %144, label %157
144: ; preds = %138
%145 = call i32 @llvm.umax.i32(i32 %141, i32 1)
%146 = zext i32 %145 to i64
br label %147
147: ; preds = %144, %152
%148 = phi i64 [ 0, %144 ], [ %153, %152 ]
%149 = getelementptr inbounds [24 x i8], [24 x i8]* %9, i64 0, i64 %148
%150 = load i8, i8* %149
%151 = icmp eq i8 %150, 48
br i1 %151, label %152, label %155
152: ; preds = %147
%153 = add nuw nsw i64 %148, 1
%154 = icmp eq i64 %153, %146
br i1 %154, label %157, label %147
155: ; preds = %147
%156 = trunc i64 %148 to i32
br label %157
157: ; preds = %152, %155, %138
%158 = phi i32 [ 0, %138 ], [ %156, %155 ], [ %145, %152 ]
%159 = xor i1 %24, true
%160 = sext i1 %159 to i32
%161 = add i32 %4, -1
%162 = add i32 %161, %160
%163 = add i32 %56, %97
%164 = sub i32 %162, %163
%165 = add i32 %164, %158
%166 = sub nsw i32 %56, %141
%167 = select i1 %54, i32 0, i32 %166
%168 = icmp sgt i32 %167, 0
%169 = icmp sgt i32 %165, 0
%170 = select i1 %169, i32 %165, i32 0
%171 = and i32 %6, 1
%172 = icmp eq i32 %171, 0
%173 = sub nsw i32 0, %170
%174 = select i1 %172, i32 %170, i32 %173
%175 = and i32 %6, 16
%176 = icmp ne i32 %175, 0
%177 = icmp sgt i32 %174, 0
%178 = select i1 %176, i1 %177, i1 false
br i1 %178, label %179, label %197
179: ; preds = %157
br i1 %24, label %186, label %180
180: ; preds = %179
%181 = trunc i32 %25 to i8
%182 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext %181)
%183 = trunc i64 %182 to i32
%184 = add nsw i32 %174, -1
%185 = icmp eq i32 %184, 0
br i1 %185, label %216, label %186
186: ; preds = %179, %180
%187 = phi i32 [ 0, %179 ], [ %183, %180 ]
%188 = phi i32 [ %174, %179 ], [ %184, %180 ]
br label %189
189: ; preds = %186, %189
%190 = phi i32 [ %194, %189 ], [ %187, %186 ]
%191 = phi i32 [ %195, %189 ], [ %188, %186 ]
%192 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext 48)
%193 = trunc i64 %192 to i32
%194 = add i32 %190, %193
%195 = add nsw i32 %191, -1
%196 = icmp ugt i32 %191, 1
br i1 %196, label %189, label %216
197: ; preds = %157
%198 = icmp sgt i32 %174, 0
br i1 %198, label %199, label %207
199: ; preds = %197, %199
%200 = phi i32 [ %204, %199 ], [ 0, %197 ]
%201 = phi i32 [ %205, %199 ], [ %174, %197 ]
%202 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext 32)
%203 = trunc i64 %202 to i32
%204 = add i32 %200, %203
%205 = add nsw i32 %201, -1
%206 = icmp ugt i32 %201, 1
br i1 %206, label %199, label %207
207: ; preds = %199, %197
%208 = phi i32 [ %174, %197 ], [ 0, %199 ]
%209 = phi i32 [ 0, %197 ], [ %204, %199 ]
%210 = icmp eq i32 %25, 0
br i1 %210, label %216, label %211
211: ; preds = %207
%212 = trunc i32 %25 to i8
%213 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext %212)
%214 = trunc i64 %213 to i32
%215 = add i32 %209, %214
br label %216
216: ; preds = %189, %180, %211, %207
%217 = phi i32 [ %208, %211 ], [ %208, %207 ], [ 0, %180 ], [ 0, %189 ]
%218 = phi i32 [ %215, %211 ], [ %209, %207 ], [ %183, %180 ], [ %194, %189 ]
%219 = icmp eq i32 %97, 0
br i1 %219, label %232, label %220
220: ; preds = %216, %220
%221 = phi i64 [ %223, %220 ], [ %98, %216 ]
%222 = phi i32 [ %229, %220 ], [ %218, %216 ]
%223 = add nsw i64 %221, -1
%224 = and i64 %223, 4294967295
%225 = getelementptr inbounds [24 x i8], [24 x i8]* %8, i64 0, i64 %224
%226 = load i8, i8* %225
%227 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext %226)
%228 = trunc i64 %227 to i32
%229 = add i32 %222, %228
%230 = trunc i64 %221 to i32
%231 = icmp sgt i32 %230, 1
br i1 %231, label %220, label %232
232: ; preds = %220, %216
%233 = phi i32 [ %218, %216 ], [ %229, %220 ]
%234 = icmp sgt i32 %52, 0
br i1 %234, label %235, label %256
235: ; preds = %232
%236 = icmp ugt i32 %141, %158
%237 = select i1 %236, i1 true, i1 %168
br i1 %237, label %238, label %256
238: ; preds = %235
%239 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext 46)
%240 = trunc i64 %239 to i32
%241 = add i32 %233, %240
%242 = icmp sgt i32 %141, %158
br i1 %242, label %243, label %256
243: ; preds = %238
%244 = sext i32 %141 to i64
%245 = sext i32 %158 to i64
br label %246
246: ; preds = %243, %246
%247 = phi i64 [ %244, %243 ], [ %249, %246 ]
%248 = phi i32 [ %241, %243 ], [ %254, %246 ]
%249 = add nsw i64 %247, -1
%250 = getelementptr inbounds [24 x i8], [24 x i8]* %9, i64 0, i64 %249
%251 = load i8, i8* %250
%252 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext %251)
%253 = trunc i64 %252 to i32
%254 = add i32 %248, %253
%255 = icmp sgt i64 %249, %245
br i1 %255, label %246, label %256
256: ; preds = %246, %238, %235, %232
%257 = phi i32 [ %233, %235 ], [ %233, %232 ], [ %241, %238 ], [ %254, %246 ]
br i1 %168, label %261, label %258
258: ; preds = %261, %256
%259 = phi i32 [ %257, %256 ], [ %266, %261 ]
%260 = icmp slt i32 %217, 0
br i1 %260, label %269, label %277
261: ; preds = %256, %261
%262 = phi i32 [ %266, %261 ], [ %257, %256 ]
%263 = phi i32 [ %267, %261 ], [ %167, %256 ]
%264 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext 48)
%265 = trunc i64 %264 to i32
%266 = add i32 %262, %265
%267 = add nsw i32 %263, -1
%268 = icmp sgt i32 %263, 1
br i1 %268, label %261, label %258
269: ; preds = %258, %269
%270 = phi i32 [ %274, %269 ], [ %259, %258 ]
%271 = phi i32 [ %275, %269 ], [ %217, %258 ]
%272 = tail call i64 @dopr_outch(i8* %0, i64* %1, i64 %2, i8 signext 32)
%273 = trunc i64 %272 to i32
%274 = add i32 %270, %273
%275 = add i32 %271, 1
%276 = icmp eq i32 %275, 0
br i1 %276, label %277, label %269
277: ; preds = %269, %258
%278 = phi i32 [ %259, %258 ], [ %274, %269 ]
ret i32 %278
}