char *number(char *str, unsigned long long num, int base, int size,
             int precision, int type) {
  char c, sign, tmp[66];
  const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  int i;
  if (type & 64) {
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  }
  if (type & 16) {
    type &= ~1;
  }
  if (base < 2 || base > 36) {
    return 0;
  }
  c = (type & 1) ? '0' : ' ';
  sign = 0;
  if (type & 2) {
    if ((signed long long)num < 0) {
      sign = '-';
      num = -(signed long long)num;
      size--;
    } else if (type & 4) {
      sign = '+';
      size--;
    } else if (type & 8) {
      sign = ' ';
      size--;
    }
  }
  if (type & 32) {
    if (base == 16) {
      size -= 2;
    } else if (base == 8) {
      size--;
    }
  }
  i = 0;
  if (num == 0) {
    tmp[i++] = '0';
  } else
    while (num != 0) {
      tmp[i++] = digits[({
        unsigned int __base = (base);
        unsigned int __rem;
        __rem = ((unsigned long long)(num)) % __base;
        (num) = ((unsigned long long)(num)) / __base;
        __rem;
      })];
    }
  if (i > precision) {
    precision = i;
  }
  size -= precision;
  if (!(type & (1 + 16)))
    while (size-- > 0) {
      *str++ = ' ';
    }
  if (sign) {
    *str++ = sign;
  }
  if (type & 32) {
    if (base == 8) {
      *str++ = '0';
    } else if (base == 16) {
      *str++ = '0';
      *str++ = digits[33];
    }
  }
  if (!(type & 16))
    while (size-- > 0) {
      *str++ = c;
    }
  while (i < precision--) {
    *str++ = '0';
  }
  while (i-- > 0) {
    *str++ = tmp[i];
  }
  while (size-- > 0) {
    *str++ = ' ';
  }
  return str;
}


x86 assembly (clang, -O0):
<number>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
lea    0xedb(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1143 <number+0x43>
lea    0xee6(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     115b <number+0x5b>
mov    -0x28(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x2,-0x1c(%rbp)
jl     116f <number+0x6f>
cmpl   $0x24,-0x1c(%rbp)
jle    117c <number+0x7c>
movq   $0x0,-0x8(%rbp)
jmp    14db <number+0x3db>
mov    -0x28(%rbp),%edx
and    $0x1,%edx
mov    $0x20,%eax
mov    $0x30,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,-0x29(%rbp)
movb   $0x0,-0x2a(%rbp)
mov    -0x28(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     121b <number+0x11b>
cmpq   $0x0,-0x18(%rbp)
jge    11cf <number+0xcf>
movb   $0x2d,-0x2a(%rbp)
xor    %eax,%eax
sub    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1216 <number+0x116>
mov    -0x28(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11f0 <number+0xf0>
movb   $0x2b,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1211 <number+0x111>
mov    -0x28(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     120c <number+0x10c>
movb   $0x20,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1211 <number+0x111>
jmp    1216 <number+0x116>
jmp    121b <number+0x11b>
mov    -0x28(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     125f <number+0x15f>
cmpl   $0x10,-0x1c(%rbp)
jne    1242 <number+0x142>
mov    -0x20(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    125a <number+0x15a>
cmpl   $0x8,-0x1c(%rbp)
jne    1255 <number+0x155>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    125a <number+0x15a>
jmp    125f <number+0x15f>
movl   $0x0,-0x7c(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1288 <number+0x188>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x7c(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    1307 <number+0x207>
jmp    128d <number+0x18d>
cmpq   $0x0,-0x18(%rbp)
je     1302 <number+0x202>
mov    -0x78(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %edx,%eax
mov    %eax,-0x84(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x80(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,%rcx
mov    -0x90(%rbp),%rax
mov    %rcx,-0x18(%rbp)
mov    -0x84(%rbp),%ecx
mov    %ecx,-0x88(%rbp)
mov    -0x88(%rbp),%ecx
mov    (%rax,%rcx,1),%cl
mov    -0x7c(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x7c(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
jmp    128d <number+0x18d>
jmp    1307 <number+0x207>
mov    -0x7c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    1319 <number+0x219>
mov    -0x7c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
and    $0x11,%eax
cmp    $0x0,%eax
jne    1368 <number+0x268>
jmp    1338 <number+0x238>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    1363 <number+0x263>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    1338 <number+0x238>
jmp    1368 <number+0x268>
cmpb   $0x0,-0x2a(%rbp)
je     1386 <number+0x286>
mov    -0x2a(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     13f4 <number+0x2f4>
cmpl   $0x8,-0x1c(%rbp)
jne    13b6 <number+0x2b6>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    13ef <number+0x2ef>
cmpl   $0x10,-0x1c(%rbp)
jne    13ea <number+0x2ea>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
mov    -0x78(%rbp),%rax
mov    0x21(%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13ef <number+0x2ef>
jmp    13f4 <number+0x2f4>
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    143a <number+0x33a>
jmp    1408 <number+0x308>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    1435 <number+0x335>
mov    -0x29(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1408 <number+0x308>
jmp    143a <number+0x33a>
jmp    143f <number+0x33f>
mov    -0x7c(%rbp),%eax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x24(%rbp)
cmp    %ecx,%eax
jge    146c <number+0x36c>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    143f <number+0x33f>
jmp    1471 <number+0x371>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x7c(%rbp)
cmp    $0x0,%eax
jle    14a3 <number+0x3a3>
movslq -0x7c(%rbp),%rax
mov    -0x70(%rbp,%rax,1),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1471 <number+0x371>
jmp    14a8 <number+0x3a8>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    14d3 <number+0x3d3>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    14a8 <number+0x3a8>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<number>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r9d,%r13d
mov    %ecx,%r14d
mov    %edx,%r9d
test   $0x40,%r13b
lea    0xece(%rip),%rax
lea    0xeec(%rip),%rcx
cmove  %rax,%rcx
mov    %r13d,%ebx
and    $0xfffffffe,%ebx
test   $0x10,%r13b
cmove  %r13d,%ebx
lea    -0x25(%r9),%eax
cmp    $0xffffffdd,%eax
jae    115b <number+0x4b>
xor    %ebx,%ebx
jmp    13c5 <number+0x2b5>
mov    %rdi,%rbp
mov    $0x1,%r10b
test   $0x2,%bl
jne    1170 <number+0x60>
xor    %r11d,%r11d
test   $0x20,%bl
je     11b3 <number+0xa3>
jmp    11a3 <number+0x93>
test   %rsi,%rsi
js     1188 <number+0x78>
test   $0x4,%bl
jne    1194 <number+0x84>
test   $0x8,%bl
je     1166 <number+0x56>
add    $0xffffffff,%r14d
mov    $0x20,%r11b
jmp    119b <number+0x8b>
neg    %rsi
add    $0xffffffff,%r14d
mov    $0x2d,%r11b
jmp    119b <number+0x8b>
add    $0xffffffff,%r14d
mov    $0x2b,%r11b
xor    %r10d,%r10d
test   $0x20,%bl
je     11b3 <number+0xa3>
cmp    $0x8,%r9d
je     11ee <number+0xde>
cmp    $0x10,%r9d
jne    11b3 <number+0xa3>
add    $0xfffffffe,%r14d
test   %rsi,%rsi
je     11f7 <number+0xe7>
mov    %r9d,%edi
xor    %r15d,%r15d
jmp    11dd <number+0xcd>
mov    %rsi,%rax
xor    %edx,%edx
div    %rdi
movzbl (%rcx,%rdx,1),%edx
mov    %dl,0x20(%rsp,%r15,1)
add    $0x1,%r15
cmp    %rdi,%rsi
mov    %rax,%rsi
jb     1202 <number+0xf2>
mov    %rsi,%rax
shr    $0x20,%rax
jne    11c0 <number+0xb0>
mov    %esi,%eax
xor    %edx,%edx
div    %edi
jmp    11c8 <number+0xb8>
add    $0xffffffff,%r14d
test   %rsi,%rsi
jne    11b8 <number+0xa8>
movb   $0x30,0x20(%rsp)
mov    $0x1,%r15d
cmp    %r8d,%r15d
mov    %r8d,%r12d
cmovg  %r15d,%r12d
sub    %r12d,%r14d
test   $0x11,%bl
je     1220 <number+0x110>
test   %r10b,%r10b
je     127b <number+0x16b>
test   $0x20,%bl
jne    1288 <number+0x178>
jmp    129c <number+0x18c>
lea    -0x1(%r14),%eax
test   %r14d,%r14d
jle    1495 <number+0x385>
mov    %eax,%r14d
lea    0x1(%r14),%rdx
mov    %rbp,%rdi
mov    $0x20,%esi
mov    %r8d,0x14(%rsp)
mov    %r9,0x18(%rsp)
mov    %r10d,0x10(%rsp)
mov    %r11d,0xc(%rsp)
call   1030 <memset@plt>
mov    0xc(%rsp),%r11d
mov    0x10(%rsp),%r10d
mov    0x18(%rsp),%r9
mov    0x14(%rsp),%r8d
add    %r14,%rbp
add    $0x1,%rbp
mov    $0xffffffff,%r14d
test   %r10b,%r10b
jne    1219 <number+0x109>
mov    %r11b,0x0(%rbp)
add    $0x1,%rbp
test   $0x20,%bl
je     129c <number+0x18c>
cmp    $0x10,%r9d
je     12de <number+0x1ce>
cmp    $0x8,%r9d
jne    129c <number+0x18c>
movb   $0x30,0x0(%rbp)
add    $0x1,%rbp
test   $0x10,%bl
jne    12fa <number+0x1ea>
lea    -0x1(%r14),%r13d
test   %r14d,%r14d
jle    12d9 <number+0x1c9>
and    $0x1,%bl
shl    $0x4,%bl
or     $0x20,%bl
mov    %r14d,%edx
movzbl %bl,%esi
mov    %rbp,%rdi
mov    %r8d,%ebx
call   1030 <memset@plt>
mov    %ebx,%r8d
mov    %r13d,%eax
add    %rax,%rbp
add    $0x1,%rbp
mov    $0xffffffff,%r14d
jmp    12fa <number+0x1ea>
mov    %r13d,%r14d
jmp    12fa <number+0x1ea>
test   $0x40,%r13b
sete   %al
movb   $0x30,0x0(%rbp)
shl    $0x5,%al
or     $0x58,%al
mov    %al,0x1(%rbp)
add    $0x2,%rbp
test   $0x10,%bl
je     12a1 <number+0x191>
cmp    %r8d,%r15d
jge    1320 <number+0x210>
mov    %r15d,%eax
not    %eax
add    %eax,%r12d
lea    0x1(%r12),%rdx
mov    %rbp,%rdi
mov    $0x30,%esi
call   1030 <memset@plt>
add    %r12,%rbp
add    $0x1,%rbp
mov    %r15d,%eax
test   %r15d,%r15d
mov    $0x1,%edx
mov    $0x1,%esi
cmovle %r15d,%esi
mov    %r15d,%r8d
sub    %esi,%r8d
cmp    $0x1f,%r8d
jb     1376 <number+0x266>
test   %r15d,%r15d
cmovle %r15d,%edx
lea    -0x1(%r15),%esi
lea    0x20(%rsp),%rdi
add    %rsi,%rdi
add    $0x1,%rdi
cmp    %rdi,%rbp
jae    13d7 <number+0x2c7>
sub    %edx,%r15d
lea    (%r15,%rbp,1),%rdx
add    $0x1,%rdx
sub    %r15,%rsi
add    %rsp,%rsi
add    $0x20,%rsi
cmp    %rdx,%rsi
jae    13d7 <number+0x2c7>
mov    %rax,%rdx
mov    %rbp,%rbx
lea    0x1(%rdx),%eax
add    $0xffffffff,%edx
lea    (%rsp,%rdx,1),%rcx
add    $0x20,%rcx
nopw   0x0(%rax,%rax,1)
movzbl (%rcx),%edx
mov    %dl,(%rbx)
add    $0x1,%rbx
add    $0xffffffff,%eax
add    $0xffffffffffffffff,%rcx
cmp    $0x1,%eax
jg     1390 <number+0x280>
test   %r14d,%r14d
jle    13c5 <number+0x2b5>
mov    %r14d,%edx
mov    %rbx,%rdi
mov    $0x20,%esi
call   1030 <memset@plt>
add    $0xffffffff,%r14d
add    %r14,%rbx
add    $0x1,%rbx
mov    %rbx,%rax
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0x1,%r8
mov    %r8,%rsi
and    $0xffffffffffffffe0,%rsi
mov    %rax,%rdx
sub    %rsi,%rdx
lea    (%rsi,%rbp,1),%rbx
add    $0xffffffffffffffff,%rax
xor    %edi,%edi
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
mov    %eax,%ecx
movdqu 0x1(%rsp,%rcx,1),%xmm1
movdqu 0x11(%rsp,%rcx,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,0x0(%rbp,%rdi,1)
movdqu %xmm1,0x10(%rbp,%rdi,1)
add    $0x20,%rdi
add    $0xffffffffffffffe0,%rax
cmp    %rdi,%rsi
jne    1400 <number+0x2f0>
cmp    %rsi,%r8
jne    137c <number+0x26c>
jmp    13a5 <number+0x295>
mov    %eax,%r14d
test   %r10b,%r10b
jne    1219 <number+0x109>
jmp    127b <number+0x16b>

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

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