char *outfloat(value, width, nplace, fill_char, left_justify, p)
double value;
int width, nplace;
char fill_char;
int left_justify;
register char *p;
{
  register int i, intval;
  register char *place, *to, *from;
  int negative;
  negative = value < 0.0 ? 1 : 0;
  if (negative)
    value = -value;
  for (i = 0; i < nplace; i++)
    value *= 10.0;
  intval = value + 0.5;
  if (nplace + (nplace == 0 ? 1 : 2) > width) {
    e_outfloat(width, p);
    return p + width;
  }
  for (place = p + width - 1; place >= p + width - nplace; place--) {
    *place = '0' + intval % 10;
    intval /= 10;
  }
  if (nplace > 0)
    *place-- = '.';
  if (intval == 0)
    *place-- = '0';
  for (; place >= p; place--) {
    if (intval == 0)
      break;
    else {
      *place = '0' + intval % 10;
      intval /= 10;
    }
  }
  if (intval != 0) {
    e_outfloat(width, p);
    return p + width;
  }
  if (place < p && negative) {
    e_outfloat(width, p);
    return p + width;
  }
  if (left_justify) {
    for (from = place + 1, to = (negative ? p + 1 : p); from < p + width;
         from++, to++)
      *to = *from;
    for (; to < p + width; to++)
      *to = fill_char;
    if (negative)
      *p = '-';
  } else {
    for (to = place; to >= p; to--)
      *to = fill_char;
    if (negative) {
      if (fill_char == ' ')
        *place = '-';
      else
        *p = '-';
    }
  }
  return p + width;
}


x86 assembly (clang, -O0):
<outfloat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %dl,%al
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
mov    %al,-0x19(%rbp)
mov    %ecx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm1
xorps  %xmm0,%xmm0
xor    %eax,%eax
mov    $0x1,%ecx
ucomisd %xmm1,%xmm0
cmova  %ecx,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     1173 <outfloat+0x63>
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11a6 <outfloat+0x96>
movsd  0xe7a(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    117a <outfloat+0x6a>
movsd  0xe52(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x18(%rbp),%esi
mov    $0x2,%ecx
mov    $0x1,%edx
cmp    $0x0,%esi
cmove  %edx,%ecx
add    %ecx,%eax
cmp    -0x14(%rbp),%eax
jle    11fd <outfloat+0xed>
mov    -0x14(%rbp),%edi
mov    -0x28(%rbp),%rsi
mov    $0x0,%al
call   1030 <e_outfloat@plt>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    14a5 <outfloat+0x395>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x28(%rbp),%rcx
movslq -0x14(%rbp),%rdx
add    %rdx,%rcx
movslq -0x18(%rbp),%rsi
xor    %edx,%edx
sub    %rsi,%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jb     1269 <outfloat+0x159>
mov    -0x30(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    1210 <outfloat+0x100>
cmpl   $0x0,-0x18(%rbp)
jle    1285 <outfloat+0x175>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x2e,(%rax)
cmpl   $0x0,-0x30(%rbp)
jne    12a1 <outfloat+0x191>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x30,(%rax)
jmp    12a6 <outfloat+0x196>
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
jb     12fd <outfloat+0x1ed>
cmpl   $0x0,-0x30(%rbp)
jne    12c3 <outfloat+0x1b3>
jmp    12fd <outfloat+0x1ed>
mov    -0x30(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x38(%rbp),%rax
mov    %cl,(%rax)
mov    -0x30(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
jmp    12ec <outfloat+0x1dc>
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    12a6 <outfloat+0x196>
cmpl   $0x0,-0x30(%rbp)
je     1329 <outfloat+0x219>
mov    -0x14(%rbp),%edi
mov    -0x28(%rbp),%rsi
mov    $0x0,%al
call   1030 <e_outfloat@plt>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    14a5 <outfloat+0x395>
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    1363 <outfloat+0x253>
cmpl   $0x0,-0x4c(%rbp)
je     1363 <outfloat+0x253>
mov    -0x14(%rbp),%edi
mov    -0x28(%rbp),%rsi
mov    $0x0,%al
call   1030 <e_outfloat@plt>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    14a5 <outfloat+0x395>
cmpl   $0x0,-0x20(%rbp)
je     1432 <outfloat+0x322>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     1394 <outfloat+0x284>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    139c <outfloat+0x28c>
mov    -0x28(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x28(%rbp),%rcx
movslq -0x14(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    13e5 <outfloat+0x2d5>
mov    -0x48(%rbp),%rax
mov    (%rax),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    13a4 <outfloat+0x294>
jmp    13ea <outfloat+0x2da>
mov    -0x40(%rbp),%rax
mov    -0x28(%rbp),%rcx
movslq -0x14(%rbp),%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    141c <outfloat+0x30c>
mov    -0x19(%rbp),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    13ea <outfloat+0x2da>
cmpl   $0x0,-0x4c(%rbp)
je     142d <outfloat+0x31d>
mov    -0x28(%rbp),%rax
movb   $0x2d,(%rax)
jmp    1496 <outfloat+0x386>
mov    -0x38(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x28(%rbp),%rax
jb     1462 <outfloat+0x352>
mov    -0x19(%rbp),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
jmp    143a <outfloat+0x32a>
cmpl   $0x0,-0x4c(%rbp)
je     1491 <outfloat+0x381>
movsbl -0x19(%rbp),%eax
cmp    $0x20,%eax
jne    1485 <outfloat+0x375>
mov    -0x38(%rbp),%rax
movb   $0x2d,(%rax)
jmp    148c <outfloat+0x37c>
mov    -0x28(%rbp),%rax
movb   $0x2d,(%rax)
jmp    1491 <outfloat+0x381>
jmp    1496 <outfloat+0x386>
mov    -0x28(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<outfloat>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r8,%r13
mov    %edx,%r14d
movapd %xmm0,%xmm3
movapd 0xec0(%rip),%xmm1
xorpd  %xmm0,%xmm1
xorpd  %xmm2,%xmm2
cmpltsd %xmm2,%xmm0
andpd  %xmm0,%xmm1
andnpd %xmm3,%xmm0
orpd   %xmm1,%xmm0
test   %esi,%esi
jle    11c9 <outfloat+0xa9>
lea    -0x1(%rsi),%edx
mov    %esi,%eax
and    $0x7,%eax
cmp    $0x7,%edx
jb     11a5 <outfloat+0x85>
mov    %esi,%edx
and    $0xfffffff8,%edx
movsd  0xe99(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0xfffffff8,%edx
jne    1180 <outfloat+0x60>
test   %eax,%eax
je     11c9 <outfloat+0xa9>
movsd  0xe5f(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mulsd  %xmm1,%xmm0
add    $0xffffffff,%eax
jne    11c0 <outfloat+0xa0>
cmp    $0x1,%esi
mov    %esi,%eax
sbb    $0x0,%eax
add    $0x2,%eax
movslq %edi,%r12
cmp    %edi,%eax
jle    11f0 <outfloat+0xd0>
mov    %r13,%rsi
xor    %eax,%eax
call   1040 <e_outfloat@plt>
add    %r13,%r12
mov    %r12,%r15
jmp    12e1 <outfloat+0x1c1>
addsd  0xe20(%rip),%xmm0
cvttsd2si %xmm0,%eax
lea    (%r12,%r13,1),%r15
lea    (%r12,%r13,1),%rbp
add    $0xffffffffffffffff,%rbp
test   %esi,%esi
jle    12b2 <outfloat+0x192>
movslq %esi,%rbx
mov    %r15,%r8
sub    %rbx,%r8
nopl   0x0(%rax)
movslq %eax,%rbx
imul   $0x66666667,%rbx,%rax
mov    %rax,%rdx
shr    $0x3f,%rdx
sar    $0x22,%rax
add    %edx,%eax
lea    (%rax,%rax,1),%edx
lea    (%rdx,%rdx,4),%edx
sub    %edx,%ebx
add    $0x30,%bl
mov    %bl,0x0(%rbp)
add    $0xffffffffffffffff,%rbp
cmp    %r8,%rbp
jae    1220 <outfloat+0x100>
lea    0x1(%rbp),%rdx
test   %esi,%esi
jle    1261 <outfloat+0x141>
add    $0xfffffffffffffffe,%rdx
movb   $0x2e,0x0(%rbp)
mov    %rdx,%rbp
test   %eax,%eax
je     12bb <outfloat+0x19b>
cmp    %r13,%rbp
jb     12d7 <outfloat+0x1b7>
test   %eax,%eax
je     12d7 <outfloat+0x1b7>
xchg   %ax,%ax
movslq %eax,%rdx
imul   $0x66666667,%rdx,%rax
mov    %rax,%rsi
shr    $0x3f,%rsi
sar    $0x22,%rax
add    %esi,%eax
lea    (%rax,%rax,1),%esi
lea    (%rsi,%rsi,4),%esi
mov    %edx,%ebx
sub    %esi,%ebx
add    $0x30,%bl
mov    %bl,0x0(%rbp)
add    $0xffffffffffffffff,%rbp
add    $0x9,%edx
cmp    %r13,%rbp
setb   %bl
jb     12ab <outfloat+0x18b>
cmp    $0x12,%edx
ja     1270 <outfloat+0x150>
cmp    $0x13,%edx
jb     12c9 <outfloat+0x1a9>
jmp    12d7 <outfloat+0x1b7>
mov    %r15,%rdx
test   %esi,%esi
jg     1256 <outfloat+0x136>
jmp    1261 <outfloat+0x141>
movb   $0x30,0x0(%rbp)
add    $0xffffffffffffffff,%rbp
cmp    %r13,%rbp
setb   %bl
xorpd  %xmm0,%xmm0
ucomisd %xmm3,%xmm0
jbe    12f3 <outfloat+0x1d3>
test   %bl,%bl
je     12f3 <outfloat+0x1d3>
mov    %r13,%rsi
xor    %eax,%eax
call   1040 <e_outfloat@plt>
mov    %r15,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
test   %ecx,%ecx
je     1370 <outfloat+0x250>
xorpd  %xmm0,%xmm0
xor    %r11d,%r11d
ucomisd %xmm3,%xmm0
seta   %r11b
lea    (%r11,%r13,1),%rdi
lea    0x1(%rbp),%rax
cmp    %r15,%rax
jae    1492 <outfloat+0x372>
lea    (%r12,%r13,1),%rcx
mov    %rbp,%rdx
not    %rdx
lea    (%rcx,%rdx,1),%r9
cmp    $0x20,%r9
jb     1480 <outfloat+0x360>
cmp    %rcx,%rdi
jae    1346 <outfloat+0x226>
add    %r11,%rcx
add    %rdx,%rcx
add    %r13,%rcx
cmp    %rcx,%rax
jb     1480 <outfloat+0x360>
mov    %r9,%r8
and    $0xffffffffffffffe0,%r8
lea    -0x20(%r8),%rcx
mov    %rcx,%rsi
shr    $0x5,%rsi
add    $0x1,%rsi
mov    %esi,%r10d
and    $0x3,%r10d
cmp    $0x60,%rcx
jae    13c2 <outfloat+0x2a2>
xor    %ecx,%ecx
jmp    142d <outfloat+0x30d>
cmp    %r13,%rbp
jb     13a1 <outfloat+0x281>
lea    -0x1(%rbp),%rax
lea    -0x1(%r13),%rdi
cmp    %rdi,%rax
cmovb  %rax,%rdi
mov    %rbp,%rdx
sub    %rdi,%rdx
add    $0x1,%rdi
movzbl %r14b,%esi
movapd %xmm3,(%rsp)
call   1030 <memset@plt>
movapd (%rsp),%xmm3
xorpd  %xmm0,%xmm0
ucomisd %xmm3,%xmm0
jbe    12e1 <outfloat+0x1c1>
cmp    $0x20,%r14b
jne    14c1 <outfloat+0x3a1>
movb   $0x2d,0x0(%rbp)
jmp    12e1 <outfloat+0x1c1>
and    $0xfffffffffffffffc,%rsi
lea    (%r11,%r13,1),%rdx
add    $0x70,%rdx
xor    %ecx,%ecx
movups 0x1(%rbp,%rcx,1),%xmm0
movups 0x11(%rbp,%rcx,1),%xmm1
movups %xmm0,-0x70(%rdx,%rcx,1)
movups %xmm1,-0x60(%rdx,%rcx,1)
movups 0x21(%rbp,%rcx,1),%xmm0
movups 0x31(%rbp,%rcx,1),%xmm1
movups %xmm0,-0x50(%rdx,%rcx,1)
movups %xmm1,-0x40(%rdx,%rcx,1)
movups 0x41(%rbp,%rcx,1),%xmm0
movups 0x51(%rbp,%rcx,1),%xmm1
movups %xmm0,-0x30(%rdx,%rcx,1)
movups %xmm1,-0x20(%rdx,%rcx,1)
movupd 0x61(%rbp,%rcx,1),%xmm0
movupd 0x71(%rbp,%rcx,1),%xmm1
movupd %xmm0,-0x10(%rdx,%rcx,1)
movupd %xmm1,(%rdx,%rcx,1)
sub    $0xffffffffffffff80,%rcx
add    $0xfffffffffffffffc,%rsi
jne    13d0 <outfloat+0x2b0>
test   %r10,%r10
je     146f <outfloat+0x34f>
add    %rcx,%r11
lea    (%r11,%r13,1),%rdx
add    $0x10,%rdx
add    %rbp,%rcx
add    $0x11,%rcx
shl    $0x5,%r10
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
movupd -0x10(%rcx,%rsi,1),%xmm0
movupd (%rcx,%rsi,1),%xmm1
movupd %xmm0,-0x10(%rdx,%rsi,1)
movupd %xmm1,(%rdx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r10
jne    1450 <outfloat+0x330>
add    %r8,%rdi
cmp    %r8,%r9
je     1492 <outfloat+0x372>
add    %r8,%rax
nopw   0x0(%rax,%rax,1)
movzbl (%rax),%ecx
mov    %cl,(%rdi)
add    $0x1,%rdi
add    $0x1,%rax
cmp    %r15,%rax
jb     1480 <outfloat+0x360>
cmp    %r15,%rdi
jae    14b3 <outfloat+0x393>
add    %r13,%r12
sub    %rdi,%r12
movzbl %r14b,%esi
mov    %r12,%rdx
movapd %xmm3,(%rsp)
call   1030 <memset@plt>
movapd (%rsp),%xmm3
xorpd  %xmm0,%xmm0
ucomisd %xmm3,%xmm0
jbe    12e1 <outfloat+0x1c1>
movb   $0x2d,0x0(%r13)
jmp    12e1 <outfloat+0x1c1>

LLVM IR (-O0):
define i8* @outfloat(double %0, i32 %1, i32 %2, i32 %3, i32 %4, i8* %5) {
%7 = alloca i8*
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8
%12 = alloca i32
%13 = alloca i8*
%14 = alloca i32
%15 = alloca i32
%16 = alloca i8*
%17 = alloca i8*
%18 = alloca i8*
%19 = alloca i32
%20 = trunc i32 %3 to i8
store double %0, double* %8
store i32 %1, i32* %9
store i32 %2, i32* %10
store i8 %20, i8* %11
store i32 %4, i32* %12
store i8* %5, i8** %13
%21 = load double, double* %8
%22 = fcmp olt double %21, 0.000000e+00
%23 = zext i1 %22 to i64
%24 = select i1 %22, i32 1, i32 0
store i32 %24, i32* %19
%25 = load i32, i32* %19
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %30
27: ; preds = %6
%28 = load double, double* %8
%29 = fneg double %28
store double %29, double* %8
br label %30
30: ; preds = %27, %6
store i32 0, i32* %14
br label %31
31: ; preds = %38, %30
%32 = load i32, i32* %14
%33 = load i32, i32* %10
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %41
35: ; preds = %31
%36 = load double, double* %8
%37 = fmul double %36, 1.000000e+01
store double %37, double* %8
br label %38
38: ; preds = %35
%39 = load i32, i32* %14
%40 = add nsw i32 %39, 1
store i32 %40, i32* %14
br label %31
41: ; preds = %31
%42 = load double, double* %8
%43 = fadd double %42, 5.000000e-01
%44 = fptosi double %43 to i32
store i32 %44, i32* %15
%45 = load i32, i32* %10
%46 = load i32, i32* %10
%47 = icmp eq i32 %46, 0
%48 = zext i1 %47 to i64
%49 = select i1 %47, i32 1, i32 2
%50 = add nsw i32 %45, %49
%51 = load i32, i32* %9
%52 = icmp sgt i32 %50, %51
br i1 %52, label %53, label %61
53: ; preds = %41
%54 = load i32, i32* %9
%55 = load i8*, i8** %13
%56 = call i32 (i32, i8*, ...) bitcast (i32 (...)* @e_outfloat to i32 (i32, i8*, ...)*)(i32 %54, i8* %55)
%57 = load i8*, i8** %13
%58 = load i32, i32* %9
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %57, i64 %59
store i8* %60, i8** %7
br label %229
61: ; preds = %41
%62 = load i8*, i8** %13
%63 = load i32, i32* %9
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds i8, i8* %62, i64 %64
%66 = getelementptr inbounds i8, i8* %65, i64 -1
store i8* %66, i8** %16
br label %67
67: ; preds = %86, %61
%68 = load i8*, i8** %16
%69 = load i8*, i8** %13
%70 = load i32, i32* %9
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8, i8* %69, i64 %71
%73 = load i32, i32* %10
%74 = sext i32 %73 to i64
%75 = sub i64 0, %74
%76 = getelementptr inbounds i8, i8* %72, i64 %75
%77 = icmp uge i8* %68, %76
br i1 %77, label %78, label %89
78: ; preds = %67
%79 = load i32, i32* %15
%80 = srem i32 %79, 10
%81 = add nsw i32 48, %80
%82 = trunc i32 %81 to i8
%83 = load i8*, i8** %16
store i8 %82, i8* %83
%84 = load i32, i32* %15
%85 = sdiv i32 %84, 10
store i32 %85, i32* %15
br label %86
86: ; preds = %78
%87 = load i8*, i8** %16
%88 = getelementptr inbounds i8, i8* %87, i32 -1
store i8* %88, i8** %16
br label %67
89: ; preds = %67
%90 = load i32, i32* %10
%91 = icmp sgt i32 %90, 0
br i1 %91, label %92, label %95
92: ; preds = %89
%93 = load i8*, i8** %16
%94 = getelementptr inbounds i8, i8* %93, i32 -1
store i8* %94, i8** %16
store i8 46, i8* %93
br label %95
95: ; preds = %92, %89
%96 = load i32, i32* %15
%97 = icmp eq i32 %96, 0
br i1 %97, label %98, label %101
98: ; preds = %95
%99 = load i8*, i8** %16
%100 = getelementptr inbounds i8, i8* %99, i32 -1
store i8* %100, i8** %16
store i8 48, i8* %99
br label %101
101: ; preds = %98, %95
br label %102
102: ; preds = %119, %101
%103 = load i8*, i8** %16
%104 = load i8*, i8** %13
%105 = icmp uge i8* %103, %104
br i1 %105, label %106, label %122
106: ; preds = %102
%107 = load i32, i32* %15
%108 = icmp eq i32 %107, 0
br i1 %108, label %109, label %110
109: ; preds = %106
br label %122
110: ; preds = %106
%111 = load i32, i32* %15
%112 = srem i32 %111, 10
%113 = add nsw i32 48, %112
%114 = trunc i32 %113 to i8
%115 = load i8*, i8** %16
store i8 %114, i8* %115
%116 = load i32, i32* %15
%117 = sdiv i32 %116, 10
store i32 %117, i32* %15
br label %118
118: ; preds = %110
br label %119
119: ; preds = %118
%120 = load i8*, i8** %16
%121 = getelementptr inbounds i8, i8* %120, i32 -1
store i8* %121, i8** %16
br label %102
122: ; preds = %109, %102
%123 = load i32, i32* %15
%124 = icmp ne i32 %123, 0
br i1 %124, label %125, label %133
125: ; preds = %122
%126 = load i32, i32* %9
%127 = load i8*, i8** %13
%128 = call i32 (i32, i8*, ...) bitcast (i32 (...)* @e_outfloat to i32 (i32, i8*, ...)*)(i32 %126, i8* %127)
%129 = load i8*, i8** %13
%130 = load i32, i32* %9
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i8, i8* %129, i64 %131
store i8* %132, i8** %7
br label %229
133: ; preds = %122
%134 = load i8*, i8** %16
%135 = load i8*, i8** %13
%136 = icmp ult i8* %134, %135
br i1 %136, label %137, label %148
137: ; preds = %133
%138 = load i32, i32* %19
%139 = icmp ne i32 %138, 0
br i1 %139, label %140, label %148
140: ; preds = %137
%141 = load i32, i32* %9
%142 = load i8*, i8** %13
%143 = call i32 (i32, i8*, ...) bitcast (i32 (...)* @e_outfloat to i32 (i32, i8*, ...)*)(i32 %141, i8* %142)
%144 = load i8*, i8** %13
%145 = load i32, i32* %9
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds i8, i8* %144, i64 %146
store i8* %147, i8** %7
br label %229
148: ; preds = %137, %133
%149 = load i32, i32* %12
%150 = icmp ne i32 %149, 0
br i1 %150, label %151, label %199
151: ; preds = %148
%152 = load i8*, i8** %16
%153 = getelementptr inbounds i8, i8* %152, i64 1
store i8* %153, i8** %18
%154 = load i32, i32* %19
%155 = icmp ne i32 %154, 0
br i1 %155, label %156, label %159
156: ; preds = %151
%157 = load i8*, i8** %13
%158 = getelementptr inbounds i8, i8* %157, i64 1
br label %161
159: ; preds = %151
%160 = load i8*, i8** %13
br label %161
161: ; preds = %159, %156
%162 = phi i8* [ %158, %156 ], [ %160, %159 ]
store i8* %162, i8** %17
br label %163
163: ; preds = %174, %161
%164 = load i8*, i8** %18
%165 = load i8*, i8** %13
%166 = load i32, i32* %9
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i8, i8* %165, i64 %167
%169 = icmp ult i8* %164, %168
br i1 %169, label %170, label %179
170: ; preds = %163
%171 = load i8*, i8** %18
%172 = load i8, i8* %171
%173 = load i8*, i8** %17
store i8 %172, i8* %173
br label %174
174: ; preds = %170
%175 = load i8*, i8** %18
%176 = getelementptr inbounds i8, i8* %175, i32 1
store i8* %176, i8** %18
%177 = load i8*, i8** %17
%178 = getelementptr inbounds i8, i8* %177, i32 1
store i8* %178, i8** %17
br label %163
179: ; preds = %163
br label %180
180: ; preds = %190, %179
%181 = load i8*, i8** %17
%182 = load i8*, i8** %13
%183 = load i32, i32* %9
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds i8, i8* %182, i64 %184
%186 = icmp ult i8* %181, %185
br i1 %186, label %187, label %193
187: ; preds = %180
%188 = load i8, i8* %11
%189 = load i8*, i8** %17
store i8 %188, i8* %189
br label %190
190: ; preds = %187
%191 = load i8*, i8** %17
%192 = getelementptr inbounds i8, i8* %191, i32 1
store i8* %192, i8** %17
br label %180
193: ; preds = %180
%194 = load i32, i32* %19
%195 = icmp ne i32 %194, 0
br i1 %195, label %196, label %198
196: ; preds = %193
%197 = load i8*, i8** %13
store i8 45, i8* %197
br label %198
198: ; preds = %196, %193
br label %224
199: ; preds = %148
%200 = load i8*, i8** %16
store i8* %200, i8** %17
br label %201
201: ; preds = %208, %199
%202 = load i8*, i8** %17
%203 = load i8*, i8** %13
%204 = icmp uge i8* %202, %203
br i1 %204, label %205, label %211
205: ; preds = %201
%206 = load i8, i8* %11
%207 = load i8*, i8** %17
store i8 %206, i8* %207
br label %208
208: ; preds = %205
%209 = load i8*, i8** %17
%210 = getelementptr inbounds i8, i8* %209, i32 -1
store i8* %210, i8** %17
br label %201
211: ; preds = %201
%212 = load i32, i32* %19
%213 = icmp ne i32 %212, 0
br i1 %213, label %214, label %223
214: ; preds = %211
%215 = load i8, i8* %11
%216 = sext i8 %215 to i32
%217 = icmp eq i32 %216, 32
br i1 %217, label %218, label %220
218: ; preds = %214
%219 = load i8*, i8** %16
store i8 45, i8* %219
br label %222
220: ; preds = %214
%221 = load i8*, i8** %13
store i8 45, i8* %221
br label %222
222: ; preds = %220, %218
br label %223
223: ; preds = %222, %211
br label %224
224: ; preds = %223, %198
%225 = load i8*, i8** %13
%226 = load i32, i32* %9
%227 = sext i32 %226 to i64
%228 = getelementptr inbounds i8, i8* %225, i64 %227
store i8* %228, i8** %7
br label %229
229: ; preds = %224, %140, %125, %53
%230 = load i8*, i8** %7
ret i8* %230
}

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