char *number(char *str, int num, int base, int size, int precision, int type) {
  char c, sign, tmp[36];
  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' : ' ';
  if (type & 2 && num < 0) {
    sign = '-';
    num = -num;
  } else
    sign = (type & 4) ? '+' : ((type & 8) ? ' ' : 0);
  if (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[num % base];
      num = num / 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    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
lea    0xee0(%rip),%rax
mov    %rax,-0x58(%rbp)
mov    -0x24(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     113e <number+0x3e>
lea    0xeeb(%rip),%rax
mov    %rax,-0x58(%rbp)
mov    -0x24(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1156 <number+0x56>
mov    -0x24(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x2,-0x18(%rbp)
jl     116a <number+0x6a>
cmpl   $0x24,-0x18(%rbp)
jle    1177 <number+0x77>
movq   $0x0,-0x8(%rbp)
jmp    1492 <number+0x392>
mov    -0x24(%rbp),%edx
and    $0x1,%edx
mov    $0x20,%eax
mov    $0x30,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,-0x25(%rbp)
mov    -0x24(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11ba <number+0xba>
cmpl   $0x0,-0x14(%rbp)
jge    11ba <number+0xba>
movb   $0x2d,-0x26(%rbp)
xor    %eax,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    11f2 <number+0xf2>
mov    -0x24(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11d6 <number+0xd6>
mov    $0x2b,%eax
mov    %eax,-0x60(%rbp)
jmp    11ec <number+0xec>
mov    -0x24(%rbp),%edx
and    $0x8,%edx
xor    %eax,%eax
mov    $0x20,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    %al,-0x26(%rbp)
cmpb   $0x0,-0x26(%rbp)
je     1205 <number+0x105>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     1249 <number+0x149>
cmpl   $0x10,-0x18(%rbp)
jne    122c <number+0x12c>
mov    -0x1c(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x1c(%rbp)
jmp    1244 <number+0x144>
cmpl   $0x8,-0x18(%rbp)
jne    123f <number+0x13f>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
jmp    1244 <number+0x144>
jmp    1249 <number+0x149>
movl   $0x0,-0x5c(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1271 <number+0x171>
mov    -0x5c(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x5c(%rbp)
cltq
movb   $0x30,-0x50(%rbp,%rax,1)
jmp    12be <number+0x1be>
jmp    1276 <number+0x176>
cmpl   $0x0,-0x14(%rbp)
je     12b9 <number+0x1b9>
mov    -0x58(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x14(%rbp),%eax
cltd
idivl  -0x18(%rbp)
mov    -0x68(%rbp),%rax
movslq %edx,%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x5c(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x5c(%rbp)
cltq
mov    %cl,-0x50(%rbp,%rax,1)
mov    -0x14(%rbp),%eax
cltd
idivl  -0x18(%rbp)
mov    %eax,-0x14(%rbp)
jmp    1276 <number+0x176>
jmp    12be <number+0x1be>
mov    -0x5c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jle    12d0 <number+0x1d0>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%ecx
mov    -0x1c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
and    $0x11,%eax
cmp    $0x0,%eax
jne    131f <number+0x21f>
jmp    12ef <number+0x1ef>
mov    -0x1c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
cmp    $0x0,%eax
jle    131a <number+0x21a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    12ef <number+0x1ef>
jmp    131f <number+0x21f>
cmpb   $0x0,-0x26(%rbp)
je     133d <number+0x23d>
mov    -0x26(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     13ab <number+0x2ab>
cmpl   $0x8,-0x18(%rbp)
jne    136d <number+0x26d>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    13a6 <number+0x2a6>
cmpl   $0x10,-0x18(%rbp)
jne    13a1 <number+0x2a1>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
mov    -0x58(%rbp),%rax
mov    0x21(%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13a6 <number+0x2a6>
jmp    13ab <number+0x2ab>
mov    -0x24(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    13f1 <number+0x2f1>
jmp    13bf <number+0x2bf>
mov    -0x1c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
cmp    $0x0,%eax
jle    13ec <number+0x2ec>
mov    -0x25(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13bf <number+0x2bf>
jmp    13f1 <number+0x2f1>
jmp    13f6 <number+0x2f6>
mov    -0x5c(%rbp),%eax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x20(%rbp)
cmp    %ecx,%eax
jge    1423 <number+0x323>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    13f6 <number+0x2f6>
jmp    1428 <number+0x328>
mov    -0x5c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x5c(%rbp)
cmp    $0x0,%eax
jle    145a <number+0x35a>
movslq -0x5c(%rbp),%rax
mov    -0x50(%rbp,%rax,1),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1428 <number+0x328>
jmp    145f <number+0x35f>
mov    -0x1c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
cmp    $0x0,%eax
jle    148a <number+0x38a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    145f <number+0x35f>
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    $0x38,%rsp
mov    %r9d,%r12d
mov    %edx,%ebp
mov    %esi,%eax
test   $0x40,%r12b
lea    0xed0(%rip),%rdx
lea    0xeee(%rip),%rsi
cmove  %rdx,%rsi
mov    %r9d,%ebx
and    $0xfffffffe,%ebx
test   $0x10,%r12b
cmove  %r9d,%ebx
lea    -0x25(%rbp),%edx
cmp    $0xffffffdd,%edx
jae    1158 <number+0x48>
xor    %ebx,%ebx
jmp    1385 <number+0x275>
mov    %rdi,%r13
test   %eax,%eax
jns    116d <number+0x5d>
mov    %ebx,%edx
and    $0x2,%edx
je     116d <number+0x5d>
neg    %eax
mov    $0x2d,%dil
jmp    1185 <number+0x75>
lea    0x0(,%rbx,4),%edx
and    $0x20,%dl
test   $0x4,%bl
movzbl %dl,%edx
mov    $0x2b,%edi
cmove  %edx,%edi
cmp    $0x1,%dil
adc    $0xffffffff,%ecx
test   $0x20,%bl
je     119e <number+0x8e>
cmp    $0x8,%ebp
je     11c9 <number+0xb9>
cmp    $0x10,%ebp
jne    119e <number+0x8e>
add    $0xfffffffe,%ecx
test   %eax,%eax
je     11d0 <number+0xc0>
xor    %r15d,%r15d
cs nopw 0x0(%rax,%rax,1)
nop
cltd
idiv   %ebp
movslq %edx,%rdx
movzbl (%rsi,%rdx,1),%edx
mov    %dl,0x10(%rsp,%r15,1)
add    $0x1,%r15
test   %eax,%eax
jne    11b0 <number+0xa0>
jmp    11db <number+0xcb>
add    $0xffffffff,%ecx
test   %eax,%eax
jne    11a2 <number+0x92>
movb   $0x30,0x10(%rsp)
mov    $0x1,%r15d
cmp    %r8d,%r15d
mov    %r8d,%r14d
cmovg  %r15d,%r14d
sub    %r14d,%ecx
test   $0x11,%bl
jne    1231 <number+0x121>
lea    -0x1(%rcx),%eax
test   %ecx,%ecx
jle    1457 <number+0x347>
mov    %eax,%eax
mov    %rax,0x8(%rsp)
lea    0x1(%rax),%rdx
mov    %edi,(%rsp)
mov    %r13,%rdi
mov    $0x20,%esi
mov    %r8d,0x4(%rsp)
call   1030 <memset@plt>
mov    (%rsp),%edi
mov    0x4(%rsp),%r8d
mov    0x8(%rsp),%rax
add    %rax,%r13
add    $0x1,%r13
mov    $0xffffffff,%ecx
test   %dil,%dil
je     123e <number+0x12e>
mov    %dil,0x0(%r13)
add    $0x1,%r13
test   $0x20,%bl
je     1256 <number+0x146>
cmp    $0x10,%ebp
je     1292 <number+0x182>
cmp    $0x8,%ebp
jne    1256 <number+0x146>
movb   $0x30,0x0(%r13)
add    $0x1,%r13
test   $0x10,%bl
jne    12b0 <number+0x1a0>
lea    -0x1(%rcx),%ebp
test   %ecx,%ecx
jle    128e <number+0x17e>
and    $0x1,%bl
shl    $0x4,%bl
or     $0x20,%bl
mov    %ecx,%edx
movzbl %bl,%esi
mov    %r13,%rdi
mov    %r8d,%ebx
call   1030 <memset@plt>
mov    %ebx,%r8d
mov    %ebp,%eax
add    %rax,%r13
add    $0x1,%r13
mov    $0xffffffff,%ecx
jmp    12b0 <number+0x1a0>
mov    %ebp,%ecx
jmp    12b0 <number+0x1a0>
movzbl %r12b,%eax
shr    $0x6,%eax
movb   $0x30,0x0(%r13)
shl    $0x5,%al
or     $0x58,%al
mov    %al,0x1(%r13)
add    $0x2,%r13
test   $0x10,%bl
je     125b <number+0x14b>
cmp    %r8d,%r15d
jge    12db <number+0x1cb>
mov    %r15d,%eax
not    %eax
add    %eax,%r14d
lea    0x1(%r14),%rdx
mov    %r13,%rdi
mov    $0x30,%esi
mov    %rcx,%rbx
call   1030 <memset@plt>
mov    %rbx,%rcx
add    %r14,%r13
add    $0x1,%r13
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     1335 <number+0x225>
test   %r15d,%r15d
cmovle %r15d,%edx
lea    -0x1(%r15),%esi
lea    0x10(%rsp),%rdi
add    %rsi,%rdi
add    $0x1,%rdi
cmp    %rdi,%r13
jae    1397 <number+0x287>
sub    %edx,%r15d
lea    (%r15,%r13,1),%rdx
add    $0x1,%rdx
sub    %r15,%rsi
add    %rsp,%rsi
add    $0x10,%rsi
cmp    %rdx,%rsi
jae    1397 <number+0x287>
mov    %rax,%rdx
mov    %r13,%rbx
lea    0x1(%rdx),%eax
add    $0xffffffff,%edx
lea    (%rsp,%rdx,1),%rsi
add    $0x10,%rsi
nopl   0x0(%rax)
movzbl (%rsi),%edx
mov    %dl,(%rbx)
add    $0x1,%rbx
add    $0xffffffff,%eax
add    $0xffffffffffffffff,%rsi
cmp    $0x1,%eax
jg     1350 <number+0x240>
test   %ecx,%ecx
jle    1385 <number+0x275>
mov    %ecx,%edx
mov    %rbx,%rdi
mov    $0x20,%esi
mov    %rcx,%rbp
call   1030 <memset@plt>
add    $0xffffffff,%ebp
add    %rbp,%rbx
add    $0x1,%rbx
mov    %rbx,%rax
add    $0x38,%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,%r13,1),%rbx
add    $0xffffffffffffffff,%rax
xor    %edi,%edi
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
mov    %eax,%ebp
movdqu -0xf(%rsp,%rbp,1),%xmm1
movdqu 0x1(%rsp,%rbp,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(%r13,%rdi,1)
movdqu %xmm1,0x10(%r13,%rdi,1)
add    $0x20,%rdi
add    $0xffffffffffffffe0,%rax
cmp    %rdi,%rsi
jne    13c0 <number+0x2b0>
cmp    %rsi,%r8
jne    133b <number+0x22b>
jmp    1365 <number+0x255>
mov    %eax,%ecx
test   %dil,%dil
jne    1236 <number+0x126>
jmp    123e <number+0x12e>

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

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