char *iwftoa(long double n, char s[32]) {
  static double PRECISION = 0.00000000000001;
  if (isnan(n)) {
    strcpy(s, "nan");
  } else if (isinf(n)) {
    strcpy(s, "inf");
  } else if (n == 0.0) {
    strcpy(s, "0");
  } else {
    int digit, m, m1;
    char *c = s;
    int neg = (n < 0);
    if (neg) {
      n = -n;
    }
    m = (int)log10l(n);
    int useExp = (m >= 14 || (neg && m >= 9) || m <= -9);
    if (neg) {
      *(c++) = '-';
    }
    if (useExp) {
      if (m < 0) {
        m -= 1;
      }
      n = n / pow(10.0, m);
      m1 = m;
      m = 0;
    }
    if (m < 1) {
      m = 0;
    }
    while (n > PRECISION || m >= 0) {
      double weight = pow(10.0, m);
      if ((weight > 0) && !isinf(weight)) {
        digit = (int)floorl(n / weight);
        n -= (digit * weight);
        *(c++) = '0' + digit;
      }
      if ((m == 0) && (n > 0)) {
        *(c++) = '.';
      }
      m--;
    }
    if (useExp) {
      int i, j;
      *(c++) = 'e';
      if (m1 > 0) {
        *(c++) = '+';
      } else {
        *(c++) = '-';
        m1 = -m1;
      }
      m = 0;
      while (m1 > 0) {
        *(c++) = '0' + m1 % 10;
        m1 /= 10;
        m++;
      }
      c -= m;
      for (i = 0, j = m - 1; i < j; i++, j--) {
        c[i] ^= c[j];
        c[j] ^= c[i];
        c[i] ^= c[j];
      }
      c += m;
    }
    *(c) = '\0';
  }
  return s;
}


x86 assembly (clang, -O0):
<iwftoa>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
fldt   0x10(%rbp)
fstpt  -0x10(%rbp)
mov    %rdi,-0x18(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
xor    %eax,%eax
call   1040 <isnan@plt>
cmp    $0x0,%eax
je     11a2 <iwftoa+0x42>
mov    -0x18(%rbp),%rdi
lea    0xe70(%rip),%rsi
call   1030 <strcpy@plt>
jmp    15a5 <iwftoa+0x445>
fldt   -0x10(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
xor    %eax,%eax
call   1080 <isinf@plt>
cmp    $0x0,%eax
je     11cf <iwftoa+0x6f>
mov    -0x18(%rbp),%rdi
lea    0xe47(%rip),%rsi
call   1030 <strcpy@plt>
jmp    15a0 <iwftoa+0x440>
fldt   -0x10(%rbp)
fldz
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jne    1200 <iwftoa+0xa0>
jp     1200 <iwftoa+0xa0>
jmp    11eb <iwftoa+0x8b>
mov    -0x18(%rbp),%rdi
lea    0xe1a(%rip),%rsi
call   1030 <strcpy@plt>
jmp    159b <iwftoa+0x43b>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
fldt   -0x10(%rbp)
fldz
fucomip %st(1),%st
fstp   %st(0)
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     122e <iwftoa+0xce>
fldt   -0x10(%rbp)
fchs
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
mov    %rsp,%rax
fstpt  (%rax)
call   1060 <log10l@plt>
fld    %st(0)
fstp   %st(0)
fnstcw -0x6a(%rbp)
movzwl -0x6a(%rbp),%eax
or     $0xc00,%eax
mov    %ax,-0x6c(%rbp)
fldcw  -0x6c(%rbp)
fistpl -0x4c(%rbp)
fldcw  -0x6a(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    $0x1,%al
cmpl   $0xe,-0x20(%rbp)
mov    %al,-0x71(%rbp)
jge    1290 <iwftoa+0x130>
cmpl   $0x0,-0x34(%rbp)
je     1286 <iwftoa+0x126>
mov    $0x1,%al
cmpl   $0x9,-0x20(%rbp)
mov    %al,-0x71(%rbp)
jge    1290 <iwftoa+0x130>
cmpl   $0xfffffff7,-0x20(%rbp)
setle  %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     12b7 <iwftoa+0x157>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x2d,(%rax)
cmpl   $0x0,-0x38(%rbp)
je     1309 <iwftoa+0x1a9>
cmpl   $0x0,-0x20(%rbp)
jge    12d4 <iwftoa+0x174>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x20(%rbp)
fldt   -0x10(%rbp)
fstpt  -0x7c(%rbp)
cvtsi2sdl -0x20(%rbp),%xmm1
movsd  0xd19(%rip),%xmm0
call   1050 <pow@plt>
fldt   -0x7c(%rbp)
movsd  %xmm0,-0x58(%rbp)
fldl   -0x58(%rbp)
fdivrp %st,%st(1)
fstpt  -0x10(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x1,-0x20(%rbp)
jge    131a <iwftoa+0x1ba>
movl   $0x0,-0x20(%rbp)
jmp    131f <iwftoa+0x1bf>
fldt   -0x10(%rbp)
fldl   0x2d28(%rip)
mov    $0x1,%al
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
mov    %al,-0x7d(%rbp)
ja     1348 <iwftoa+0x1e8>
jmp    133e <iwftoa+0x1de>
cmpl   $0x0,-0x20(%rbp)
setge  %al
mov    %al,-0x7d(%rbp)
mov    -0x7d(%rbp),%al
test   $0x1,%al
jne    1358 <iwftoa+0x1f8>
jmp    143e <iwftoa+0x2de>
cvtsi2sdl -0x20(%rbp),%xmm1
movsd  0xc9b(%rip),%xmm0
call   1050 <pow@plt>
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    13fe <iwftoa+0x29e>
movsd  -0x40(%rbp),%xmm0
mov    $0x1,%al
call   1080 <isinf@plt>
cmp    $0x0,%eax
jne    13fe <iwftoa+0x29e>
fldt   -0x10(%rbp)
fldl   -0x40(%rbp)
fdivrp %st,%st(1)
mov    %rsp,%rax
fstpt  (%rax)
call   1070 <floorl@plt>
fnstcw -0x6e(%rbp)
movzwl -0x6e(%rbp),%eax
or     $0xc00,%eax
mov    %ax,-0x70(%rbp)
fldcw  -0x70(%rbp)
fistpl -0x5c(%rbp)
fldcw  -0x6e(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
fldl   -0x68(%rbp)
fldt   -0x10(%rbp)
fsubp  %st,%st(1)
fstpt  -0x10(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
cmpl   $0x0,-0x20(%rbp)
jne    1430 <iwftoa+0x2d0>
fldt   -0x10(%rbp)
fldz
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jbe    1430 <iwftoa+0x2d0>
jmp    141e <iwftoa+0x2be>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x2e,(%rax)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    131f <iwftoa+0x1bf>
cmpl   $0x0,-0x38(%rbp)
je     1594 <iwftoa+0x434>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x65,(%rax)
cmpl   $0x0,-0x24(%rbp)
jle    147b <iwftoa+0x31b>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x2b,(%rax)
jmp    1495 <iwftoa+0x335>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x2d,(%rax)
xor    %eax,%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    14e3 <iwftoa+0x383>
mov    -0x24(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    149c <iwftoa+0x33c>
mov    -0x20(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    1583 <iwftoa+0x423>
mov    -0x30(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
xor    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x30(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
xor    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x30(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
xor    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x48(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x48(%rbp)
jmp    1509 <iwftoa+0x3a9>
mov    -0x20(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
jmp    15a0 <iwftoa+0x440>
jmp    15a5 <iwftoa+0x445>
mov    -0x18(%rbp),%rax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<iwftoa>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rdi,%r14
fldt   0x90(%rsp)
fld    %st(0)
fstpt  0x20(%rsp)
fstpt  (%rsp)
xor    %eax,%eax
call   1030 <isnan@plt>
test   %eax,%eax
je     1188 <iwftoa+0x38>
movl   $0x6e616e,(%r14)
jmp    1427 <iwftoa+0x2d7>
fldt   0x20(%rsp)
fstpt  (%rsp)
xor    %eax,%eax
call   1070 <isinf@plt>
test   %eax,%eax
je     11a6 <iwftoa+0x56>
movl   $0x666e69,(%r14)
jmp    1427 <iwftoa+0x2d7>
fldz
fldt   0x20(%rsp)
fucomip %st(1),%st
jne    11bf <iwftoa+0x6f>
jp     11bf <iwftoa+0x6f>
fstp   %st(0)
movw   $0x30,(%r14)
jmp    1427 <iwftoa+0x2d7>
fldt   0x20(%rsp)
fxch   %st(1)
fucomip %st(1),%st
fld    %st(0)
fchs
fxch   %st(1)
fcmovnbe %st(1),%st
fstp   %st(1)
fld    %st(0)
fstpt  0x2c(%rsp)
fstpt  (%rsp)
call   1050 <log10l@plt>
fnstcw 0x1a(%rsp)
movzwl 0x1a(%rsp),%eax
or     $0xc00,%eax
mov    %ax,0x1e(%rsp)
fldcw  0x1e(%rsp)
fistpl 0x3c(%rsp)
fldcw  0x1a(%rsp)
mov    0x3c(%rsp),%eax
mov    $0x1,%r15b
cmp    $0xd,%eax
jg     122b <iwftoa+0xdb>
fldz
fldt   0x20(%rsp)
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
seta   %cl
cmp    $0x9,%eax
setge  %dl
and    %cl,%dl
cmp    $0xfffffff8,%eax
setl   %r15b
or     %dl,%r15b
fldz
fldt   0x20(%rsp)
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
mov    %r14,%r13
jbe    1244 <iwftoa+0xf4>
lea    0x1(%r14),%r13
movb   $0x2d,(%r14)
test   %r15b,%r15b
je     1279 <iwftoa+0x129>
mov    %eax,%r12d
sar    $0x1f,%r12d
add    %eax,%r12d
cvtsi2sd %r12d,%xmm1
movsd  0xda0(%rip),%xmm0
call   1040 <pow@plt>
movsd  %xmm0,0x50(%rsp)
fldt   0x2c(%rsp)
fdivl  0x50(%rsp)
fstpt  0x2c(%rsp)
jmp    127d <iwftoa+0x12d>
test   %eax,%eax
jg     1280 <iwftoa+0x130>
xor    %eax,%eax
nop
mov    %eax,%ebp
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0xd6f(%rip),%xmm0
call   1040 <pow@plt>
ucomisd 0xd72(%rip),%xmm0
jbe    1330 <iwftoa+0x1e0>
movsd  %xmm0,0x20(%rsp)
mov    $0x1,%al
call   1070 <isinf@plt>
test   %eax,%eax
jne    1330 <iwftoa+0x1e0>
movsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x48(%rsp)
fldt   0x2c(%rsp)
fld    %st(0)
fstpt  0x2c(%rsp)
fdivl  0x48(%rsp)
fstpt  (%rsp)
call   1060 <floorl@plt>
fnstcw 0x18(%rsp)
movzwl 0x18(%rsp),%eax
or     $0xc00,%eax
mov    %ax,0x1c(%rsp)
fldcw  0x1c(%rsp)
fistpl 0x38(%rsp)
fldcw  0x18(%rsp)
mov    0x38(%rsp),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  0x20(%rsp),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x40(%rsp)
fldt   0x2c(%rsp)
fsubl  0x40(%rsp)
fstpt  0x2c(%rsp)
add    $0x30,%al
mov    %al,0x0(%r13)
add    $0x1,%r13
nopw   0x0(%rax,%rax,1)
mov    %ebp,%eax
sub    $0x1,%eax
jae    134c <iwftoa+0x1fc>
fldz
fldt   0x2c(%rsp)
fucomip %st(1),%st
fstp   %st(0)
jbe    134c <iwftoa+0x1fc>
movb   $0x2e,0x0(%r13)
add    $0x1,%r13
fldl   0xcb6(%rip)
fldt   0x2c(%rsp)
fucomip %st(1),%st
fstp   %st(0)
ja     1280 <iwftoa+0x130>
test   %ebp,%ebp
jg     1280 <iwftoa+0x130>
test   %r15b,%r15b
je     1422 <iwftoa+0x2d2>
movb   $0x65,0x0(%r13)
test   %r12d,%r12d
jle    1386 <iwftoa+0x236>
movb   $0x2b,0x1(%r13)
add    $0x2,%r13
jmp    139b <iwftoa+0x24b>
movb   $0x2d,0x1(%r13)
add    $0x2,%r13
test   %r12d,%r12d
je     1422 <iwftoa+0x2d2>
neg    %r12d
mov    $0x2,%eax
mov    $0xcccccccd,%edx
mov    %r13,%rcx
nopl   0x0(%rax,%rax,1)
mov    %r12d,%esi
imul   %rdx,%rsi
shr    $0x23,%rsi
lea    (%rsi,%rsi,1),%edi
lea    (%rdi,%rdi,4),%edi
mov    %r12d,%ebp
sub    %edi,%ebp
or     $0x30,%bpl
mov    %bpl,(%rcx)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rax
cmp    $0x9,%r12d
mov    %esi,%r12d
ja     13b0 <iwftoa+0x260>
cmp    $0x1,%eax
je     141f <iwftoa+0x2cf>
neg    %rax
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movzbl 0x0(%r13,%rdx,1),%ebx
xor    0x1(%r13,%rax,1),%bl
mov    %bl,0x0(%r13,%rdx,1)
xor    0x1(%r13,%rax,1),%bl
mov    %bl,0x1(%r13,%rax,1)
xor    %bl,0x0(%r13,%rdx,1)
add    $0x1,%rdx
lea    -0x1(%rax),%rsi
cmp    %rax,%rdx
mov    %rsi,%rax
jl     13f0 <iwftoa+0x2a0>
mov    %rcx,%r13
movb   $0x0,0x0(%r13)
mov    %r14,%rax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i8* @iwftoa(x86_fp80 %0, i8* returned %1) {
%3 = tail call i32 (x86_fp80, ...) bitcast (i32 (...)* @isnan to i32 (x86_fp80, ...)*)(x86_fp80 %0)
%4 = icmp eq i32 %3, 0
br i1 %4, label %7, label %5
5: ; preds = %2
%6 = bitcast i8* %1 to i32*
store i32 7233902, i32* %6
br label %134
7: ; preds = %2
%8 = tail call i32 (x86_fp80, ...) bitcast (i32 (...)* @isinf to i32 (x86_fp80, ...)*)(x86_fp80 %0)
%9 = icmp eq i32 %8, 0
br i1 %9, label %12, label %10
10: ; preds = %7
%11 = bitcast i8* %1 to i32*
store i32 6712937, i32* %11
br label %134
12: ; preds = %7
%13 = fcmp oeq x86_fp80 %0, 0xK00000000000000000000
br i1 %13, label %14, label %16
14: ; preds = %12
%15 = bitcast i8* %1 to i16*
store i16 48, i16* %15
br label %134
16: ; preds = %12
%17 = fcmp olt x86_fp80 %0, 0xK00000000000000000000
%18 = fneg x86_fp80 %0
%19 = select i1 %17, x86_fp80 %18, x86_fp80 %0
%20 = tail call x86_fp80 @log10l(x86_fp80 %19)
%21 = fptosi x86_fp80 %20 to i32
%22 = icmp sgt i32 %21, 13
br i1 %22, label %28, label %23
23: ; preds = %16
%24 = icmp sgt i32 %21, 8
%25 = select i1 %17, i1 %24, i1 false
%26 = icmp slt i32 %21, -8
%27 = select i1 %25, i1 true, i1 %26
br label %28
28: ; preds = %23, %16
%29 = phi i1 [ true, %16 ], [ %27, %23 ]
br i1 %17, label %30, label %32
30: ; preds = %28
%31 = getelementptr inbounds i8, i8* %1, i64 1
store i8 45, i8* %1
br label %32
32: ; preds = %30, %28
%33 = phi i8* [ %31, %30 ], [ %1, %28 ]
br i1 %29, label %34, label %41
34: ; preds = %32
%35 = ashr i32 %21, 31
%36 = add nsw i32 %35, %21
%37 = sitofp i32 %36 to double
%38 = tail call double @pow(double 1.000000e+01, double %37)
%39 = fpext double %38 to x86_fp80
%40 = fdiv x86_fp80 %19, %39
br label %43
41: ; preds = %32
%42 = icmp slt i32 %21, 1
br i1 %42, label %43, label %46
43: ; preds = %34, %41
%44 = phi x86_fp80 [ %40, %34 ], [ %19, %41 ]
%45 = phi i32 [ %36, %34 ], [ undef, %41 ]
br label %46
46: ; preds = %43, %41
%47 = phi x86_fp80 [ %44, %43 ], [ %19, %41 ]
%48 = phi i32 [ %45, %43 ], [ undef, %41 ]
%49 = phi i32 [ 0, %43 ], [ %21, %41 ]
br label %50
50: ; preds = %46, %80
%51 = phi x86_fp80 [ %74, %80 ], [ %47, %46 ]
%52 = phi i32 [ %82, %80 ], [ %49, %46 ]
%53 = phi i8* [ %81, %80 ], [ %33, %46 ]
%54 = sitofp i32 %52 to double
%55 = tail call double @pow(double 1.000000e+01, double %54)
%56 = fcmp ogt double %55, 0.000000e+00
br i1 %56, label %57, label %72
57: ; preds = %50
%58 = tail call i32 (double, ...) bitcast (i32 (...)* @isinf to i32 (double, ...)*)(double %55)
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %72
60: ; preds = %57
%61 = fpext double %55 to x86_fp80
%62 = fdiv x86_fp80 %51, %61
%63 = tail call x86_fp80 @llvm.floor.f80(x86_fp80 %62)
%64 = fptosi x86_fp80 %63 to i32
%65 = sitofp i32 %64 to double
%66 = fmul double %55, %65
%67 = fpext double %66 to x86_fp80
%68 = fsub x86_fp80 %51, %67
%69 = trunc i32 %64 to i8
%70 = add i8 %69, 48
%71 = getelementptr inbounds i8, i8* %53, i64 1
store i8 %70, i8* %53
br label %72
72: ; preds = %60, %57, %50
%73 = phi i8* [ %53, %57 ], [ %71, %60 ], [ %53, %50 ]
%74 = phi x86_fp80 [ %51, %57 ], [ %68, %60 ], [ %51, %50 ]
%75 = icmp eq i32 %52, 0
%76 = fcmp ogt x86_fp80 %74, 0xK00000000000000000000
%77 = select i1 %75, i1 %76, i1 false
br i1 %77, label %78, label %80
78: ; preds = %72
%79 = getelementptr inbounds i8, i8* %73, i64 1
store i8 46, i8* %73
br label %80
80: ; preds = %78, %72
%81 = phi i8* [ %79, %78 ], [ %73, %72 ]
%82 = add nsw i32 %52, -1
%83 = fcmp ogt x86_fp80 %74, 0xK3FD0B424DC35095CD800
%84 = icmp sgt i32 %52, 0
%85 = select i1 %83, i1 true, i1 %84
br i1 %85, label %50, label %86
86: ; preds = %80
br i1 %29, label %87, label %132
87: ; preds = %86
%88 = getelementptr inbounds i8, i8* %81, i64 1
store i8 101, i8* %81
%89 = icmp sgt i32 %48, 0
br i1 %89, label %90, label %92
90: ; preds = %87
store i8 43, i8* %88
%91 = getelementptr inbounds i8, i8* %81, i64 2
br label %96
92: ; preds = %87
store i8 45, i8* %88
%93 = sub nsw i32 0, %48
%94 = getelementptr inbounds i8, i8* %81, i64 2
%95 = icmp eq i32 %48, 0
br i1 %95, label %132, label %96
96: ; preds = %90, %92
%97 = phi i32 [ %93, %92 ], [ %48, %90 ]
%98 = phi i8* [ %94, %92 ], [ %91, %90 ]
br label %99
99: ; preds = %96, %99
%100 = phi i32 [ %108, %99 ], [ 0, %96 ]
%101 = phi i32 [ %107, %99 ], [ %97, %96 ]
%102 = phi i8* [ %106, %99 ], [ %98, %96 ]
%103 = urem i32 %101, 10
%104 = trunc i32 %103 to i8
%105 = or i8 %104, 48
%106 = getelementptr inbounds i8, i8* %102, i64 1
store i8 %105, i8* %102
%107 = udiv i32 %101, 10
%108 = add nuw nsw i32 %100, 1
%109 = icmp ult i32 %101, 10
br i1 %109, label %110, label %99
110: ; preds = %99
%111 = zext i32 %108 to i64
%112 = sub nsw i64 0, %111
%113 = getelementptr inbounds i8, i8* %106, i64 %112
%114 = icmp eq i32 %100, 0
br i1 %114, label %132, label %115
115: ; preds = %110
%116 = zext i32 %100 to i64
br label %117
117: ; preds = %115, %117
%118 = phi i64 [ 0, %115 ], [ %129, %117 ]
%119 = phi i64 [ %116, %115 ], [ %130, %117 ]
%120 = getelementptr inbounds i8, i8* %113, i64 %119
%121 = load i8, i8* %120
%122 = getelementptr inbounds i8, i8* %113, i64 %118
%123 = load i8, i8* %122
%124 = xor i8 %123, %121
store i8 %124, i8* %122
%125 = load i8, i8* %120
%126 = xor i8 %125, %124
store i8 %126, i8* %120
%127 = load i8, i8* %122
%128 = xor i8 %127, %126
store i8 %128, i8* %122
%129 = add nuw nsw i64 %118, 1
%130 = add nsw i64 %119, -1
%131 = icmp slt i64 %129, %130
br i1 %131, label %117, label %132
132: ; preds = %117, %92, %110, %86
%133 = phi i8* [ %81, %86 ], [ %106, %110 ], [ %94, %92 ], [ %106, %117 ]
store i8 0, i8* %133
br label %134
134: ; preds = %10, %132, %14, %5
ret i8* %1
}