char *number(char *str, 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 (num < 0) {
      sign = '-';
      num = -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) {
      int t = ((long long)num) % (unsigned int)base;
      tmp[i++] = digits[t];
      num = ((long long)num) / (unsigned int)base;
    }
  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
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    0xedf(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     113f <number+0x3f>
lea    0xeea(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1157 <number+0x57>
mov    -0x28(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x2,-0x1c(%rbp)
jl     116b <number+0x6b>
cmpl   $0x24,-0x1c(%rbp)
jle    1178 <number+0x78>
movq   $0x0,-0x8(%rbp)
jmp    14af <number+0x3af>
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     1217 <number+0x117>
cmpq   $0x0,-0x18(%rbp)
jge    11cb <number+0xcb>
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    1212 <number+0x112>
mov    -0x28(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11ec <number+0xec>
movb   $0x2b,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    120d <number+0x10d>
mov    -0x28(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1208 <number+0x108>
movb   $0x20,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    120d <number+0x10d>
jmp    1212 <number+0x112>
jmp    1217 <number+0x117>
mov    -0x28(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     125b <number+0x15b>
cmpl   $0x10,-0x1c(%rbp)
jne    123e <number+0x13e>
mov    -0x20(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    1256 <number+0x156>
cmpl   $0x8,-0x1c(%rbp)
jne    1251 <number+0x151>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1256 <number+0x156>
jmp    125b <number+0x15b>
movl   $0x0,-0x7c(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1284 <number+0x184>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x7c(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    12db <number+0x1db>
jmp    1289 <number+0x189>
cmpq   $0x0,-0x18(%rbp)
je     12d6 <number+0x1d6>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
cqto
idiv   %rcx
mov    %edx,%eax
mov    %eax,-0x80(%rbp)
mov    -0x78(%rbp),%rax
movslq -0x80(%rbp),%rcx
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)
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
cqto
idiv   %rcx
mov    %rax,-0x18(%rbp)
jmp    1289 <number+0x189>
jmp    12db <number+0x1db>
mov    -0x7c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    12ed <number+0x1ed>
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    133c <number+0x23c>
jmp    130c <number+0x20c>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    1337 <number+0x237>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    130c <number+0x20c>
jmp    133c <number+0x23c>
cmpb   $0x0,-0x2a(%rbp)
je     135a <number+0x25a>
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     13c8 <number+0x2c8>
cmpl   $0x8,-0x1c(%rbp)
jne    138a <number+0x28a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    13c3 <number+0x2c3>
cmpl   $0x10,-0x1c(%rbp)
jne    13be <number+0x2be>
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    13c3 <number+0x2c3>
jmp    13c8 <number+0x2c8>
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    140e <number+0x30e>
jmp    13dc <number+0x2dc>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    1409 <number+0x309>
mov    -0x29(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13dc <number+0x2dc>
jmp    140e <number+0x30e>
jmp    1413 <number+0x313>
mov    -0x7c(%rbp),%eax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x24(%rbp)
cmp    %ecx,%eax
jge    1440 <number+0x340>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    1413 <number+0x313>
jmp    1445 <number+0x345>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x7c(%rbp)
cmp    $0x0,%eax
jle    1477 <number+0x377>
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    1445 <number+0x345>
jmp    147c <number+0x37c>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    14a7 <number+0x3a7>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    147c <number+0x37c>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
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),%rdx
lea    0xeec(%rip),%rcx
cmove  %rdx,%rcx
mov    %r13d,%ebx
and    $0xfffffffe,%ebx
test   $0x10,%r13b
cmove  %r13d,%ebx
lea    -0x25(%r9),%edx
cmp    $0xffffffdd,%edx
jae    115b <number+0x4b>
xor    %ebx,%ebx
jmp    13d5 <number+0x2c5>
mov    %rsi,%rax
mov    %rdi,%rbp
mov    $0x1,%dil
test   $0x2,%bl
jne    1173 <number+0x63>
xor    %r10d,%r10d
test   $0x20,%bl
je     11b5 <number+0xa5>
jmp    11a5 <number+0x95>
test   %rax,%rax
js     118b <number+0x7b>
test   $0x4,%bl
jne    1197 <number+0x87>
test   $0x8,%bl
je     1169 <number+0x59>
add    $0xffffffff,%r14d
mov    $0x20,%r10b
jmp    119e <number+0x8e>
neg    %rax
add    $0xffffffff,%r14d
mov    $0x2d,%r10b
jmp    119e <number+0x8e>
add    $0xffffffff,%r14d
mov    $0x2b,%r10b
xor    %edi,%edi
test   $0x20,%bl
je     11b5 <number+0xa5>
cmp    $0x8,%r9d
je     11f9 <number+0xe9>
cmp    $0x10,%r9d
jne    11b5 <number+0xa5>
add    $0xfffffffe,%r14d
test   %rax,%rax
je     1202 <number+0xf2>
mov    %r9d,%esi
xor    %r15d,%r15d
jmp    11ea <number+0xda>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
cqto
idiv   %rsi
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%edx
mov    %dl,0x20(%rsp,%r15,1)
add    $0x1,%r15
test   %rax,%rax
je     120d <number+0xfd>
mov    %rax,%rdx
shr    $0x20,%rdx
jne    11d0 <number+0xc0>
xor    %edx,%edx
div    %esi
jmp    11d5 <number+0xc5>
add    $0xffffffff,%r14d
test   %rax,%rax
jne    11ba <number+0xaa>
movb   $0x30,0x20(%rsp)
mov    $0x1,%r15d
cmp    %r8d,%r15d
mov    %r8d,%r12d
cmovg  %r15d,%r12d
sub    %r12d,%r14d
test   $0x11,%bl
je     122b <number+0x11b>
test   %dil,%dil
je     1284 <number+0x174>
test   $0x20,%bl
jne    1291 <number+0x181>
jmp    12a5 <number+0x195>
lea    -0x1(%r14),%eax
test   %r14d,%r14d
jle    14a5 <number+0x395>
mov    %eax,%r14d
lea    0x1(%r14),%rdx
mov    %edi,0x10(%rsp)
mov    %rbp,%rdi
mov    $0x20,%esi
mov    %r8d,0x14(%rsp)
mov    %r9,0x18(%rsp)
mov    %r10d,0xc(%rsp)
call   1030 <memset@plt>
mov    0xc(%rsp),%r10d
mov    0x10(%rsp),%edi
mov    0x18(%rsp),%r9
mov    0x14(%rsp),%r8d
add    %r14,%rbp
add    $0x1,%rbp
mov    $0xffffffff,%r14d
test   %dil,%dil
jne    1224 <number+0x114>
mov    %r10b,0x0(%rbp)
add    $0x1,%rbp
test   $0x20,%bl
je     12a5 <number+0x195>
cmp    $0x10,%r9d
je     12e7 <number+0x1d7>
cmp    $0x8,%r9d
jne    12a5 <number+0x195>
movb   $0x30,0x0(%rbp)
add    $0x1,%rbp
test   $0x10,%bl
jne    1303 <number+0x1f3>
lea    -0x1(%r14),%r13d
test   %r14d,%r14d
jle    12e2 <number+0x1d2>
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    1303 <number+0x1f3>
mov    %r13d,%r14d
jmp    1303 <number+0x1f3>
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     12aa <number+0x19a>
cmp    %r8d,%r15d
jge    1329 <number+0x219>
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     1383 <number+0x273>
test   %r15d,%r15d
cmovle %r15d,%edx
lea    -0x1(%r15),%esi
lea    0x20(%rsp),%rdi
add    %rsi,%rdi
add    $0x1,%rdi
cmp    %rdi,%rbp
jae    13e7 <number+0x2d7>
sub    %edx,%r15d
lea    (%r15,%rbp,1),%rdx
add    $0x1,%rdx
sub    %r15,%rsi
add    %rsp,%rsi
add    $0x20,%rsi
cmp    %rdx,%rsi
jae    13e7 <number+0x2d7>
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     13a0 <number+0x290>
test   %r14d,%r14d
jle    13d5 <number+0x2c5>
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    1410 <number+0x300>
cmp    %rsi,%r8
jne    1389 <number+0x279>
jmp    13b5 <number+0x2a5>
mov    %eax,%r14d
test   %dil,%dil
jne    1224 <number+0x114>
jmp    1284 <number+0x174>

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

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