char *number_float(char *str, double num, int size, int precision, int type) {
  char c, sign, tmp[66];
  unsigned int c0;
  unsigned long expnt = 10;
  int pres;
  unsigned int l;
  double r;
  int i;
  const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  if (type & 64)
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if (type & 16)
    type &= ~1;
  c = (type & 1) ? '0' : ' ';
  sign = 0;
  if (type & 2) {
    if (num < 0) {
      sign = '-';
      num = -num;
      size--;
    } else if (type & 4) {
      sign = '+';
      size--;
    } else if (type & 8) {
      sign = ' ';
      size--;
    }
  }
  if (precision == -1)
    precision = 10;
  pres = precision;
  for (i = 0; i < precision; i++) {
    expnt *= 10;
  }
  i = 0;
  l = (unsigned int)num;
  r = (num - (float)l);
  if (l == 0)
    tmp[i++] = '0';
  else
    while (l != 0)
      tmp[i++] = digits[({
        int __res;
        __res = ((unsigned long)l) % (unsigned)10;
        l = ((unsigned long)l) / (unsigned)10;
        __res;
      })];
  if (i > precision)
    precision = i;
  size -= i;
  if (!(type & (1 + 16)))
    while (size-- > 0)
      *str++ = ' ';
  if (sign)
    *str++ = sign;
  if (!(type & 16))
    while (size-- > 0)
      *str++ = c;
  while (i-- > 0)
    *str++ = tmp[i];
  *str++ = '.';
  for (i = 0; i < pres; i++) {
    c0 = (unsigned int)(r * 10);
    if (c0 < 0 || c0 > 9)
      *str++ = '0';
    else
      *str++ = digits[c0];
    r = r * 10 - (unsigned int)c0;
  }
  return str;
}


x86 assembly (clang, -O0):
<number_float>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movq   $0xa,-0x70(%rbp)
lea    0xedf(%rip),%rax
mov    %rax,-0x90(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     114d <number_float+0x4d>
lea    0xee7(%rip),%rax
mov    %rax,-0x90(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1165 <number_float+0x65>
mov    -0x1c(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%edx
and    $0x1,%edx
mov    $0x20,%eax
mov    $0x30,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,-0x1d(%rbp)
movb   $0x0,-0x1e(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     121e <number_float+0x11e>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11d2 <number_float+0xd2>
movb   $0x2d,-0x1e(%rbp)
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1219 <number_float+0x119>
mov    -0x1c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11f3 <number_float+0xf3>
movb   $0x2b,-0x1e(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1214 <number_float+0x114>
mov    -0x1c(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     120f <number_float+0x10f>
movb   $0x20,-0x1e(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1214 <number_float+0x114>
jmp    1219 <number_float+0x119>
jmp    121e <number_float+0x11e>
cmpl   $0xffffffff,-0x18(%rbp)
jne    122f <number_float+0x12f>
movl   $0xa,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x74(%rbp)
movl   $0x0,-0x84(%rbp)
mov    -0x84(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    126b <number_float+0x16b>
imul   $0xa,-0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    123f <number_float+0x13f>
movl   $0x0,-0x84(%rbp)
cvttsd2si -0x10(%rbp),%rax
mov    %eax,-0x78(%rbp)
movsd  -0x10(%rbp),%xmm0
mov    -0x78(%rbp),%eax
cvtsi2ss %rax,%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
cmpl   $0x0,-0x78(%rbp)
jne    12bf <number_float+0x1bf>
mov    -0x84(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x84(%rbp)
cltq
movb   $0x30,-0x60(%rbp,%rax,1)
jmp    1342 <number_float+0x242>
jmp    12c4 <number_float+0x1c4>
cmpl   $0x0,-0x78(%rbp)
je     133d <number_float+0x23d>
mov    -0x90(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x78(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
mov    %edx,%eax
mov    %eax,-0x94(%rbp)
mov    -0x78(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,%rcx
mov    -0xa0(%rbp),%rax
mov    %ecx,-0x78(%rbp)
mov    -0x94(%rbp),%ecx
mov    %ecx,-0x98(%rbp)
movslq -0x98(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x84(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x84(%rbp)
cltq
mov    %cl,-0x60(%rbp,%rax,1)
jmp    12c4 <number_float+0x1c4>
jmp    1342 <number_float+0x242>
mov    -0x84(%rbp),%eax
cmp    -0x18(%rbp),%eax
jle    135a <number_float+0x25a>
mov    -0x84(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x84(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x1c(%rbp),%eax
and    $0x11,%eax
cmp    $0x0,%eax
jne    13ac <number_float+0x2ac>
jmp    137c <number_float+0x27c>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jle    13a7 <number_float+0x2a7>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x20,(%rax)
jmp    137c <number_float+0x27c>
jmp    13ac <number_float+0x2ac>
cmpb   $0x0,-0x1e(%rbp)
je     13ca <number_float+0x2ca>
mov    -0x1e(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x1c(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    1410 <number_float+0x310>
jmp    13de <number_float+0x2de>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jle    140b <number_float+0x30b>
mov    -0x1d(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
jmp    13de <number_float+0x2de>
jmp    1410 <number_float+0x310>
jmp    1415 <number_float+0x315>
mov    -0x84(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x84(%rbp)
cmp    $0x0,%eax
jle    1450 <number_float+0x350>
movslq -0x84(%rbp),%rax
mov    -0x60(%rbp,%rax,1),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
jmp    1415 <number_float+0x315>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x2e,(%rax)
movl   $0x0,-0x84(%rbp)
mov    -0x84(%rbp),%eax
cmp    -0x74(%rbp),%eax
jge    152a <number_float+0x42a>
movsd  -0x80(%rbp),%xmm0
movsd  0xb78(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %eax,-0x64(%rbp)
cmpl   $0x0,-0x64(%rbp)
jb     14a8 <number_float+0x3a8>
cmpl   $0x9,-0x64(%rbp)
jbe    14bf <number_float+0x3bf>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x30,(%rax)
jmp    14dd <number_float+0x3dd>
mov    -0x90(%rbp),%rax
mov    -0x64(%rbp),%ecx
mov    (%rax,%rcx,1),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x64(%rbp),%eax
cvtsi2sd %rax,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xaf7(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    146c <number_float+0x36c>
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<number_float>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %esi,%r14d
mov    %rdi,%r13
test   $0x40,%cl
lea    0xeea(%rip),%rax
lea    0xf08(%rip),%r15
cmove  %rax,%r15
mov    %ecx,%ebp
and    $0xfffffffe,%ebp
test   $0x10,%cl
cmove  %ecx,%ebp
mov    $0x1,%r10b
test   $0x2,%bpl
jne    1152 <number_float+0x42>
xor    %r11d,%r11d
jmp    118c <number_float+0x7c>
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    116d <number_float+0x5d>
xorpd  0xe9c(%rip),%xmm0
add    $0xffffffff,%r14d
mov    $0x2d,%r11b
jmp    1189 <number_float+0x79>
test   $0x4,%bpl
jne    1182 <number_float+0x72>
test   $0x8,%bpl
je     114d <number_float+0x3d>
add    $0xffffffff,%r14d
mov    $0x20,%r11b
jmp    1189 <number_float+0x79>
add    $0xffffffff,%r14d
mov    $0x2b,%r11b
xor    %r10d,%r10d
cmp    $0xffffffff,%edx
mov    $0xa,%r8d
cmovne %edx,%r8d
cvttsd2si %xmm0,%r9
test   %r9d,%r9d
je     11db <number_float+0xcb>
xor    %r12d,%r12d
mov    $0xcccccccd,%eax
mov    %r9d,%ecx
xchg   %ax,%ax
mov    %ecx,%edx
imul   %rax,%rdx
shr    $0x23,%rdx
lea    (%rdx,%rdx,1),%esi
lea    (%rsi,%rsi,4),%esi
mov    %ecx,%edi
sub    %esi,%edi
movzbl (%r15,%rdi,1),%ebx
mov    %bl,0x30(%rsp,%r12,1)
add    $0x1,%r12
cmp    $0x9,%ecx
mov    %edx,%ecx
ja     11b0 <number_float+0xa0>
jmp    11e6 <number_float+0xd6>
movb   $0x30,0x30(%rsp)
mov    $0x1,%r12d
sub    %r12d,%r14d
test   $0x11,%bpl
je     11ff <number_float+0xef>
test   %r10b,%r10b
je     1261 <number_float+0x151>
test   $0x10,%bpl
je     126f <number_float+0x15f>
jmp    12b2 <number_float+0x1a2>
lea    -0x1(%r14),%eax
test   %r14d,%r14d
jle    13c8 <number_float+0x2b8>
mov    %eax,%ebx
lea    0x1(%rbx),%rdx
mov    %r13,%rdi
mov    $0x20,%esi
movapd %xmm0,0x10(%rsp)
mov    %r8d,%r14d
mov    %r9,0x28(%rsp)
mov    %r10d,0xc(%rsp)
mov    %r11d,0x8(%rsp)
call   1030 <memset@plt>
mov    0x8(%rsp),%r11d
mov    0xc(%rsp),%r10d
mov    0x28(%rsp),%r9
mov    %r14d,%r8d
movapd 0x10(%rsp),%xmm0
add    %rbx,%r13
add    $0x1,%r13
mov    $0xffffffff,%r14d
test   %r10b,%r10b
jne    11f4 <number_float+0xe4>
mov    %r11b,0x0(%r13)
add    $0x1,%r13
test   $0x10,%bpl
jne    12b2 <number_float+0x1a2>
test   %r14d,%r14d
jle    12b2 <number_float+0x1a2>
and    $0x1,%bpl
shl    $0x4,%bpl
or     $0x20,%bpl
mov    %r14d,%edx
movzbl %bpl,%esi
mov    %r13,%rdi
movapd %xmm0,0x10(%rsp)
mov    %r8d,%ebx
mov    %r9,%rbp
call   1030 <memset@plt>
mov    %rbp,%r9
mov    %ebx,%r8d
movapd 0x10(%rsp),%xmm0
add    $0xffffffff,%r14d
add    %r14,%r13
add    $0x1,%r13
mov    %r12d,%eax
test   %r12d,%r12d
mov    $0x1,%edx
mov    $0x1,%esi
cmovle %r12d,%esi
mov    %r12d,%ecx
sub    %esi,%ecx
cmp    $0x1f,%ecx
jb     13df <number_float+0x2cf>
test   %r12d,%r12d
cmovle %r12d,%edx
lea    -0x1(%r12),%esi
lea    0x30(%rsp),%rdi
add    %rsi,%rdi
add    $0x1,%rdi
cmp    %rdi,%r13
jae    130f <number_float+0x1ff>
sub    %edx,%r12d
lea    (%r12,%r13,1),%rdx
add    $0x1,%rdx
sub    %r12,%rsi
add    %rsp,%rsi
add    $0x30,%rsi
cmp    %rdx,%rsi
jb     13df <number_float+0x2cf>
add    $0x1,%rcx
mov    %rcx,%rsi
and    $0xffffffffffffffe0,%rsi
mov    %rax,%rdi
sub    %rsi,%rdi
lea    (%rsi,%r13,1),%rdx
add    $0xffffffffffffffff,%rax
xor    %ebp,%ebp
pxor   %xmm4,%xmm4
xchg   %ax,%ax
mov    %eax,%ebx
movdqu 0x11(%rsp,%rbx,1),%xmm1
movdqu 0x21(%rsp,%rbx,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm4,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm4,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm4,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm4,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,0x0(%r13,%rbp,1)
movdqu %xmm1,0x10(%r13,%rbp,1)
add    $0x20,%rbp
add    $0xffffffffffffffe0,%rax
cmp    %rbp,%rsi
jne    1330 <number_float+0x220>
cmp    %rsi,%rcx
jne    13d9 <number_float+0x2c9>
lea    (%rsi,%r13,1),%rax
add    $0xffffffffffffffff,%rax
jmp    1413 <number_float+0x303>
mov    %eax,%r14d
test   %r10b,%r10b
jne    11f4 <number_float+0xe4>
jmp    1261 <number_float+0x151>
mov    %rdi,%rax
mov    %rdx,%r13
lea    0x1(%rax),%ecx
add    $0xffffffff,%eax
add    %rsp,%rax
add    $0x30,%rax
xor    %edx,%edx
xor    %esi,%esi
movzbl (%rax,%rsi,1),%ebx
mov    %bl,0x0(%r13,%rdx,1)
add    $0xffffffffffffffff,%rsi
lea    (%rcx,%rsi,1),%edi
add    $0x1,%rdx
cmp    $0x1,%edi
jg     13f0 <number_float+0x2e0>
sub    %rsi,%r13
lea    -0x1(%r13),%rax
mov    %r13,%rdx
movb   $0x2e,(%rdx)
add    $0x2,%rax
test   %r8d,%r8d
jle    145e <number_float+0x34e>
mov    %r9d,%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %rcx,%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
cmp    $0x1,%r8d
jne    146d <number_float+0x35d>
test   $0x1,%r8b
je     145e <number_float+0x34e>
mulsd  0xbca(%rip),%xmm0
cvttsd2si %xmm0,%rdx
mov    $0x30,%cl
cmp    $0x9,%edx
ja     1458 <number_float+0x348>
mov    %edx,%ecx
mov    (%r15,%rcx,1),%cl
mov    %cl,(%rax)
add    $0x1,%rax
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r8d,%ecx
and    $0xfffffffe,%ecx
movsd  0xb95(%rip),%xmm2
jmp    149c <number_float+0x38c>
nopl   (%rax)
mov    %dl,0x1(%rax)
xorps  %xmm1,%xmm1
cvtsi2sd %rsi,%xmm1
mulsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
add    $0x2,%rax
add    $0xfffffffe,%ecx
je     1438 <number_float+0x328>
movapd %xmm0,%xmm1
mulsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rdi
mov    $0x30,%dl
mov    %edi,%esi
mov    $0x30,%bl
cmp    $0x9,%edi
ja     14b9 <number_float+0x3a9>
movzbl (%r15,%rsi,1),%ebx
xorps  %xmm1,%xmm1
cvtsi2sd %rsi,%xmm1
mov    %bl,(%rax)
mulsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm2,%xmm1
cvttsd2si %xmm1,%rdi
mov    %edi,%esi
cmp    $0x9,%edi
ja     1480 <number_float+0x370>
movzbl (%r15,%rsi,1),%edx
jmp    1480 <number_float+0x370>

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

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