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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
char *gcvt(double f, size_t ndigit, char *buf) {
  int i;
  int l1, l2;
  unsigned long long z, k, k2;
  int exp = 0;
  char *c = buf;
  double f2, t, scal;
  int sign = 0;
  if ((int)ndigit == -1)
    ndigit = 5;
  if (ndigit > 20)
    ndigit = 20;
  if (f < 0.0) {
    sign = 1;
    f = -f;
    buf++;
  }
  scal = 1;
  for (i = ndigit; i > 0; i--)
    scal *= 10;
  k = f + 0.5 / scal;
  f2 = f - k;
  if (!f) {
    (*(buf++) = ('0'));
    if (ndigit > 0)
      (*(buf++) = ('.'));
    for (i = 0; i < ndigit; i++)
      (*(buf++) = ('0'));
    (*(buf++) = (0));
    return c;
  }
  i = 1;
  while (f >= 10.0) {
    f /= 10.0;
    i++;
  }
  l1 = i;
  k2 = k;
  l2 = 1;
  do {
    if (k2 >= 10) {
      l2++;
    }
    k2 /= 10;
  } while (k2);
  if (l2 > l1) {
    buf += i + ndigit + 2;
  } else {
    buf += i + ndigit + 1;
  }
  (*(buf--) = (0));
  if (ndigit > 0) {
    t = f2 * scal;
    z = t + 0.5;
    for (i = 0; i < ndigit; i++) {
      (*(buf--) = ('0' + (z % 10)));
      z /= 10;
    }
    (*(buf--) = ('.'));
  } else
    (*(buf--) = (0));
  l2 = 1;
  do {
    (*(buf--) = ('0' + (k % 10)));
    if (k >= 10) {
      l2++;
    }
    k /= 10;
  } while (k);
  if (sign)
    (*(buf--) = ('-'));
  return c;
}


x86 assembly (clang, -O0):
<gcvt>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x74(%rbp)
mov    -0x18(%rbp),%rax
cmp    $0xffffffff,%eax
jne    113c <gcvt+0x3c>
movq   $0x5,-0x18(%rbp)
cmpq   $0x14,-0x18(%rbp)
jbe    114f <gcvt+0x4f>
movq   $0x14,-0x18(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1191 <gcvt+0x91>
movl   $0x1,-0x74(%rbp)
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
movsd  0xe67(%rip),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    11cf <gcvt+0xcf>
movsd  0xe61(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    11a5 <gcvt+0xa5>
movsd  -0x10(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm2
movsd  0xe27(%rip),%xmm1
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movaps %xmm0,%xmm1
cvttsd2si %xmm1,%rax
mov    %rax,%rdx
sar    $0x3f,%rdx
movsd  0xe10(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
and    %rdx,%rcx
or     %rcx,%rax
mov    %rax,-0x40(%rbp)
movsd  -0x10(%rbp),%xmm0
movaps 0xe01(%rip),%xmm2
movq   -0x40(%rbp),%xmm1
punpckldq %xmm2,%xmm1
movapd 0xe00(%rip),%xmm2
subpd  %xmm2,%xmm1
movaps %xmm1,%xmm2
unpckhpd %xmm1,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12e3 <gcvt+0x1e3>
jp     12e3 <gcvt+0x1e3>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x30,(%rax)
cmpq   $0x0,-0x18(%rbp)
jbe    128f <gcvt+0x18f>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x2e,(%rax)
movl   $0x0,-0x24(%rbp)
movslq -0x24(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    12c4 <gcvt+0x1c4>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x30,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1296 <gcvt+0x196>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x0,(%rax)
mov    -0x58(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1513 <gcvt+0x413>
movl   $0x1,-0x24(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xd21(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1325 <gcvt+0x225>
movsd  -0x10(%rbp),%xmm0
movsd  0xd0a(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    12ea <gcvt+0x1ea>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
movl   $0x1,-0x2c(%rbp)
cmpq   $0xa,-0x48(%rbp)
jb     134e <gcvt+0x24e>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x48(%rbp),%rax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
jne    133a <gcvt+0x23a>
mov    -0x2c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jle    1390 <gcvt+0x290>
movslq -0x24(%rbp),%rax
add    -0x18(%rbp),%rax
add    $0x2,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    13a4 <gcvt+0x2a4>
movslq -0x24(%rbp),%rax
add    -0x18(%rbp),%rax
add    $0x1,%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x0,(%rax)
cmpq   $0x0,-0x18(%rbp)
jbe    1480 <gcvt+0x380>
movsd  -0x60(%rbp),%xmm0
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  0xc27(%rip),%xmm1
addsd  %xmm1,%xmm0
movaps %xmm0,%xmm1
cvttsd2si %xmm1,%rax
mov    %rax,%rdx
sar    $0x3f,%rdx
movsd  0xc14(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rcx
and    %rdx,%rcx
or     %rcx,%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x24(%rbp)
movslq -0x24(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1469 <gcvt+0x369>
mov    -0x38(%rbp),%rax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,-0x38(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1416 <gcvt+0x316>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x2e,(%rax)
jmp    1492 <gcvt+0x392>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x0,(%rax)
movl   $0x1,-0x2c(%rbp)
mov    -0x40(%rbp),%rax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
cmpq   $0xa,-0x40(%rbp)
jb     14d2 <gcvt+0x3d2>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x40(%rbp),%rax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    1499 <gcvt+0x399>
cmpl   $0x0,-0x74(%rbp)
je     150b <gcvt+0x40b>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x2d,(%rax)
mov    -0x58(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<gcvt>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
cmp    $0xffffffff,%edi
mov    $0x5,%eax
cmovne %rdi,%rax
cmp    $0x14,%rax
mov    $0x14,%r15d
cmovb  %rax,%r15
xorpd  %xmm1,%xmm1
xor    %r12d,%r12d
ucomisd %xmm0,%xmm1
seta   %r12b
ja     1187 <gcvt+0x77>
movapd %xmm0,%xmm1
test   %r15d,%r15d
je     1198 <gcvt+0x88>
lea    -0x1(%r15),%ecx
mov    %r15d,%eax
and    $0x7,%eax
je     11a2 <gcvt+0x92>
xor    %edx,%edx
movsd  0xecb(%rip),%xmm2
movsd  0xecb(%rip),%xmm3
nopl   (%rax)
mulsd  %xmm3,%xmm2
add    $0x1,%edx
cmp    %edx,%eax
jne    1170 <gcvt+0x60>
mov    %r15d,%eax
sub    %edx,%eax
cmp    $0x7,%ecx
jae    11b2 <gcvt+0xa2>
jmp    11e8 <gcvt+0xd8>
movapd 0xe71(%rip),%xmm1
xorpd  %xmm0,%xmm1
test   %r15d,%r15d
jne    114f <gcvt+0x3f>
movsd  0xe90(%rip),%xmm2
jmp    11e8 <gcvt+0xd8>
movsd  0xe86(%rip),%xmm2
mov    %r15d,%eax
cmp    $0x7,%ecx
jb     11e8 <gcvt+0xd8>
add    $0xffffffff,%eax
movsd  0xe7b(%rip),%xmm3
nopl   (%rax)
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
mulsd  %xmm3,%xmm2
add    $0xfffffff8,%eax
cmp    $0xfffffffe,%eax
jb     11c0 <gcvt+0xb0>
add    %r14,%r12
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm1
jne    11fb <gcvt+0xeb>
jnp    130c <gcvt+0x1fc>
movsd  0xe3d(%rip),%xmm3
divsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
cvttsd2si %xmm3,%rax
mov    %rax,%rcx
subsd  0xe2d(%rip),%xmm3
cvttsd2si %xmm3,%r10
sar    $0x3f,%rcx
and    %rcx,%r10
or     %rax,%r10
movq   %r10,%xmm4
punpckldq 0xdd9(%rip),%xmm4
subpd  0xde1(%rip),%xmm4
movapd %xmm4,%xmm3
unpckhpd %xmm4,%xmm3
addsd  %xmm4,%xmm3
mov    $0x1,%ecx
ucomisd 0xde0(%rip),%xmm1
mov    $0x1,%edi
jb     127d <gcvt+0x16d>
mov    $0x1,%edi
movsd  0xdcc(%rip),%xmm4
movapd %xmm1,%xmm5
divsd  %xmm4,%xmm5
add    $0x1,%edi
ucomisd %xmm4,%xmm5
jae    1270 <gcvt+0x160>
subsd  %xmm3,%xmm1
movabs $0xcccccccccccccccd,%r8
cc cc cc
mov    %r10,%rsi
xchg   %ax,%ax
cmp    $0xa,%rsi
sbb    $0xffffffff,%ecx
mov    %rsi,%rax
mul    %r8
shr    $0x3,%rdx
cmp    $0x9,%rsi
mov    %rdx,%rsi
ja     1290 <gcvt+0x180>
mov    %edi,%eax
add    %r15,%rax
cmp    %ecx,%edi
adc    $0x0,%rax
lea    (%rax,%r12,1),%rdi
lea    (%rax,%r12,1),%rbx
add    $0x1,%rbx
movb   $0x0,0x1(%rax,%r12,1)
test   %r15,%r15
je     133e <gcvt+0x22e>
mulsd  %xmm1,%xmm2
addsd  0xd68(%rip),%xmm2
cvttsd2si %xmm2,%rax
mov    %rax,%rcx
subsd  0xd60(%rip),%xmm2
cvttsd2si %xmm2,%rsi
sar    $0x3f,%rcx
and    %rcx,%rsi
or     %rax,%rsi
cmp    $0x1,%r15
jne    1346 <gcvt+0x236>
test   $0x1,%r15b
jne    13c3 <gcvt+0x2b3>
jmp    13e2 <gcvt+0x2d2>
movb   $0x30,(%r12)
test   %r15,%r15
je     1426 <gcvt+0x316>
lea    0x2(%r12),%rdi
movb   $0x2e,0x1(%r12)
mov    $0x30,%esi
mov    %r15,%rdx
call   1030 <memset@plt>
add    %r15,%r12
add    $0x2,%r12
jmp    142a <gcvt+0x31a>
movb   $0x0,(%rdi)
jmp    13e5 <gcvt+0x2d5>
mov    %r15,%r9
and    $0xfffffffffffffffe,%r9
neg    %r9
xor    %ecx,%ecx
movabs $0x28f5c28f5c28f5c3,%r11
c2 f5 28
nopl   0x0(%rax)
mov    %rsi,%rax
mul    %r8
mov    %rdx,%rdi
shr    $0x3,%rdi
lea    (%rdi,%rdi,1),%eax
lea    (%rax,%rax,4),%eax
mov    %esi,%edx
sub    %eax,%edx
or     $0x30,%dl
mov    %dl,-0x1(%rbx,%rcx,1)
mov    %rdi,%rax
mul    %r8
shr    $0x2,%edx
and    $0xfffffffe,%edx
lea    (%rdx,%rdx,4),%eax
sub    %eax,%edi
or     $0x30,%dil
shr    $0x2,%rsi
mov    %rsi,%rax
mul    %r11
mov    %dil,-0x2(%rbx,%rcx,1)
mov    %rdx,%rsi
shr    $0x2,%rsi
add    $0xfffffffffffffffe,%rcx
cmp    %rcx,%r9
jne    1360 <gcvt+0x250>
lea    (%rbx,%rcx,1),%rdi
add    $0xffffffffffffffff,%rdi
add    %rcx,%rbx
test   $0x1,%r15b
je     13e2 <gcvt+0x2d2>
mov    %rsi,%rax
mul    %r8
shr    $0x2,%edx
and    $0xfffffffe,%edx
lea    (%rdx,%rdx,4),%eax
sub    %eax,%esi
or     $0x30,%sil
mov    %sil,(%rdi)
mov    %rdi,%rbx
add    $0xffffffffffffffff,%rdi
movb   $0x2e,(%rdi)
add    $0xfffffffffffffffe,%rbx
nopl   0x0(%rax)
mov    %r10,%rax
mul    %r8
shr    $0x3,%rdx
lea    (%rdx,%rdx,1),%eax
lea    (%rax,%rax,4),%eax
mov    %r10d,%ecx
sub    %eax,%ecx
or     $0x30,%cl
mov    %cl,(%rbx)
add    $0xffffffffffffffff,%rbx
cmp    $0x9,%r10
mov    %rdx,%r10
ja     13f0 <gcvt+0x2e0>
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    142f <gcvt+0x31f>
movb   $0x2d,(%rbx)
jmp    142f <gcvt+0x31f>
add    $0x1,%r12
movb   $0x0,(%r12)
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define i8* @gcvt(double %0, i64 %1, i8* returned writeonly %2) {
%4 = trunc i64 %1 to i32
%5 = icmp eq i32 %4, -1
%6 = select i1 %5, i64 5, i64 %1
%7 = icmp ult i64 %6, 20
%8 = select i1 %7, i64 %6, i64 20
%9 = fcmp olt double %0, 0.000000e+00
%10 = fneg double %0
%11 = zext i1 %9 to i64
%12 = getelementptr i8, i8* %2, i64 %11
%13 = select i1 %9, double %10, double %0
%14 = trunc i64 %8 to i32
%15 = icmp eq i32 %14, 0
br i1 %15, label %47, label %16
16: ; preds = %3
%17 = add nsw i32 %14, -1
%18 = and i32 %14, 7
%19 = icmp eq i32 %18, 0
br i1 %19, label %28, label %20
20: ; preds = %16, %20
%21 = phi double [ %24, %20 ], [ 1.000000e+00, %16 ]
%22 = phi i32 [ %25, %20 ], [ %14, %16 ]
%23 = phi i32 [ %26, %20 ], [ 0, %16 ]
%24 = fmul double %21, 1.000000e+01
%25 = add nsw i32 %22, -1
%26 = add i32 %23, 1
%27 = icmp eq i32 %26, %18
br i1 %27, label %28, label %20
28: ; preds = %20, %16
%29 = phi double [ 1.000000e+00, %16 ], [ %24, %20 ]
%30 = phi i32 [ %14, %16 ], [ %25, %20 ]
%31 = phi double [ undef, %16 ], [ %24, %20 ]
%32 = icmp ult i32 %17, 7
br i1 %32, label %47, label %33
33: ; preds = %28, %33
%34 = phi double [ %43, %33 ], [ %29, %28 ]
%35 = phi i32 [ %44, %33 ], [ %30, %28 ]
%36 = fmul double %34, 1.000000e+01
%37 = fmul double %36, 1.000000e+01
%38 = fmul double %37, 1.000000e+01
%39 = fmul double %38, 1.000000e+01
%40 = fmul double %39, 1.000000e+01
%41 = fmul double %40, 1.000000e+01
%42 = fmul double %41, 1.000000e+01
%43 = fmul double %42, 1.000000e+01
%44 = add nsw i32 %35, -8
%45 = add i32 %35, -9
%46 = icmp ult i32 %45, -2
br i1 %46, label %33, label %47
47: ; preds = %28, %33, %3
%48 = phi double [ 1.000000e+00, %3 ], [ %31, %28 ], [ %43, %33 ]
%49 = fdiv double 5.000000e-01, %48
%50 = fadd double %13, %49
%51 = fptoui double %50 to i64
%52 = uitofp i64 %51 to double
%53 = fsub double %13, %52
%54 = fcmp une double %13, 0.000000e+00
br i1 %54, label %55, label %57
55: ; preds = %47
%56 = fcmp ult double %13, 1.000000e+01
br i1 %56, label %65, label %67
57: ; preds = %47
%58 = getelementptr inbounds i8, i8* %12, i64 1
store i8 48, i8* %12
%59 = icmp eq i64 %8, 0
br i1 %59, label %63, label %60
60: ; preds = %57
%61 = getelementptr inbounds i8, i8* %12, i64 2
store i8 46, i8* %58
%62 = getelementptr i8, i8* %61, i64 %8
br label %63
63: ; preds = %57, %60
%64 = phi i8* [ %62, %60 ], [ %58, %57 ]
store i8 0, i8* %64
br label %145
65: ; preds = %67, %55
%66 = phi i32 [ 1, %55 ], [ %71, %67 ]
br label %73
67: ; preds = %55, %67
%68 = phi double [ %70, %67 ], [ %13, %55 ]
%69 = phi i32 [ %71, %67 ], [ 1, %55 ]
%70 = fdiv double %68, 1.000000e+01
%71 = add nuw nsw i32 %69, 1
%72 = fcmp ult double %70, 1.000000e+01
br i1 %72, label %65, label %67
73: ; preds = %65, %73
%74 = phi i32 [ %78, %73 ], [ 1, %65 ]
%75 = phi i64 [ %79, %73 ], [ %51, %65 ]
%76 = icmp ugt i64 %75, 9
%77 = zext i1 %76 to i32
%78 = add nuw nsw i32 %74, %77
%79 = udiv i64 %75, 10
%80 = icmp ult i64 %75, 10
br i1 %80, label %81, label %73
81: ; preds = %73
%82 = icmp ugt i32 %78, %66
%83 = zext i32 %66 to i64
%84 = add nuw nsw i64 %8, %83
%85 = select i1 %82, i64 2, i64 1
%86 = add nuw nsw i64 %84, %85
%87 = getelementptr inbounds i8, i8* %12, i64 %86
%88 = getelementptr inbounds i8, i8* %87, i64 -1
store i8 0, i8* %87
%89 = icmp eq i64 %8, 0
br i1 %89, label %130, label %90
90: ; preds = %81
%91 = fmul double %48, %53
%92 = fadd double %91, 5.000000e-01
%93 = fptoui double %92 to i64
%94 = and i64 %8, 1
%95 = icmp eq i64 %8, 1
br i1 %95, label %116, label %96
96: ; preds = %90
%97 = and i64 %8, 30
br label %98
98: ; preds = %98, %96
%99 = phi i8* [ %88, %96 ], [ %110, %98 ]
%100 = phi i64 [ %93, %96 ], [ %111, %98 ]
%101 = phi i64 [ 0, %96 ], [ %112, %98 ]
%102 = urem i64 %100, 10
%103 = trunc i64 %102 to i8
%104 = or i8 %103, 48
%105 = getelementptr inbounds i8, i8* %99, i64 -1
store i8 %104, i8* %99
%106 = udiv i64 %100, 10
%107 = urem i64 %106, 10
%108 = trunc i64 %107 to i8
%109 = or i8 %108, 48
%110 = getelementptr inbounds i8, i8* %99, i64 -2
store i8 %109, i8* %105
%111 = udiv i64 %100, 100
%112 = add i64 %101, 2
%113 = icmp eq i64 %112, %97
br i1 %113, label %114, label %98
114: ; preds = %98
%115 = getelementptr inbounds i8, i8* %99, i64 -1
br label %116
116: ; preds = %114, %90
%117 = phi i8* [ undef, %90 ], [ %115, %114 ]
%118 = phi i8* [ undef, %90 ], [ %110, %114 ]
%119 = phi i8* [ %88, %90 ], [ %110, %114 ]
%120 = phi i64 [ %93, %90 ], [ %111, %114 ]
%121 = icmp eq i64 %94, 0
br i1 %121, label %127, label %122
122: ; preds = %116
%123 = urem i64 %120, 10
%124 = trunc i64 %123 to i8
%125 = or i8 %124, 48
%126 = getelementptr inbounds i8, i8* %119, i64 -1
store i8 %125, i8* %119
br label %127
127: ; preds = %116, %122
%128 = phi i8* [ %117, %116 ], [ %119, %122 ]
%129 = phi i8* [ %118, %116 ], [ %126, %122 ]
store i8 46, i8* %129
br label %131
130: ; preds = %81
store i8 0, i8* %88
br label %131
131: ; preds = %130, %127
%132 = phi i8* [ %128, %127 ], [ %87, %130 ]
%133 = getelementptr inbounds i8, i8* %132, i64 -2
br label %134
134: ; preds = %134, %131
%135 = phi i64 [ %51, %131 ], [ %141, %134 ]
%136 = phi i8* [ %133, %131 ], [ %140, %134 ]
%137 = urem i64 %135, 10
%138 = trunc i64 %137 to i8
%139 = or i8 %138, 48
%140 = getelementptr inbounds i8, i8* %136, i64 -1
store i8 %139, i8* %136
%141 = udiv i64 %135, 10
%142 = icmp ult i64 %135, 10
br i1 %142, label %143, label %134
143: ; preds = %134
br i1 %9, label %144, label %145
144: ; preds = %143
store i8 45, i8* %140
br label %145
145: ; preds = %143, %144, %63
ret i8* %2
}