char *number(char *buf, char *end, long long num, int base, int size,
             int precision, int type) {
  char c, sign, tmp[66];
  const char *digits;
  const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int i;
  digits = (type & 64) ? large_digits : small_digits;
  if (type & 16)
    type &= ~1;
  if (base < 2 || base > 36)
    return buf;
  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 {
    unsigned long long num2 = (unsigned long long)num;
    unsigned int base2 = (unsigned int)base;
    while (num2 != 0) {
      tmp[i++] = digits[num2 % base2];
      num2 /= base2;
    }
  }
  if (i > precision)
    precision = i;
  size -= precision;
  if (!(type & (1 + 16))) {
    while (size-- > 0) {
      if (buf <= end)
        *buf = ' ';
      ++buf;
    }
  }
  if (sign) {
    if (buf <= end)
      *buf = sign;
    ++buf;
  }
  if (type & 32) {
    if (base == 8) {
      if (buf <= end)
        *buf = '0';
      ++buf;
    } else if (base == 16) {
      if (buf <= end)
        *buf = '0';
      ++buf;
      if (buf <= end)
        *buf = digits[33];
      ++buf;
    }
  }
  if (!(type & 16)) {
    while (size-- > 0) {
      if (buf <= end)
        *buf = c;
      ++buf;
    }
  }
  while (i < precision--) {
    if (buf <= end)
      *buf = '0';
    ++buf;
  }
  while (i-- > 0) {
    if (buf <= end)
      *buf = tmp[i];
    ++buf;
  }
  while (size-- > 0) {
    if (buf <= end)
      *buf = ' ';
    ++buf;
  }
  return buf;
}


x86 assembly (clang, -O0):
<number>:
push   %rbp
mov    %rsp,%rbp
sub    $0x100,%rsp
mov    0x10(%rbp),%eax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
lea    -0xa0(%rbp),%rdi
lea    0xebd(%rip),%rsi
mov    $0x25,%edx
call   1030 <memcpy@plt>
lea    -0xd0(%rbp),%rdi
lea    0xed5(%rip),%rsi
mov    $0x25,%edx
call   1030 <memcpy@plt>
mov    0x10(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1187 <number+0x77>
lea    -0xd0(%rbp),%rax
mov    %rax,-0xf0(%rbp)
jmp    1195 <number+0x85>
lea    -0xa0(%rbp),%rax
mov    %rax,-0xf0(%rbp)
mov    -0xf0(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    0x10(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     11b8 <number+0xa8>
mov    0x10(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,0x10(%rbp)
cmpl   $0x2,-0x24(%rbp)
jl     11cc <number+0xbc>
cmpl   $0x24,-0x24(%rbp)
jle    11d9 <number+0xc9>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    15e0 <number+0x4d0>
mov    0x10(%rbp),%edx
and    $0x1,%edx
mov    $0x20,%eax
mov    $0x30,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,-0x2d(%rbp)
movb   $0x0,-0x2e(%rbp)
mov    0x10(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1278 <number+0x168>
cmpq   $0x0,-0x20(%rbp)
jge    122c <number+0x11c>
movb   $0x2d,-0x2e(%rbp)
xor    %eax,%eax
sub    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1273 <number+0x163>
mov    0x10(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     124d <number+0x13d>
movb   $0x2b,-0x2e(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    126e <number+0x15e>
mov    0x10(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1269 <number+0x159>
movb   $0x20,-0x2e(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    126e <number+0x15e>
jmp    1273 <number+0x163>
jmp    1278 <number+0x168>
mov    0x10(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     12bc <number+0x1ac>
cmpl   $0x10,-0x24(%rbp)
jne    129f <number+0x18f>
mov    -0x28(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    12b7 <number+0x1a7>
cmpl   $0x8,-0x24(%rbp)
jne    12b2 <number+0x1a2>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    12b7 <number+0x1a7>
jmp    12bc <number+0x1ac>
movl   $0x0,-0xd4(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    12ee <number+0x1de>
mov    -0xd4(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0xd4(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    1373 <number+0x263>
mov    -0x20(%rbp),%rax
mov    %rax,-0xe0(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0xe4(%rbp)
cmpq   $0x0,-0xe0(%rbp)
je     136e <number+0x25e>
mov    -0x78(%rbp),%rax
mov    %rax,-0xf8(%rbp)
mov    -0xe0(%rbp),%rax
mov    -0xe4(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    -0xf8(%rbp),%rax
mov    (%rax,%rdx,1),%cl
mov    -0xd4(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0xd4(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
mov    -0xe4(%rbp),%eax
mov    %eax,%ecx
mov    -0xe0(%rbp),%rax
xor    %edx,%edx
div    %rcx
mov    %rax,-0xe0(%rbp)
jmp    1302 <number+0x1f2>
jmp    1373 <number+0x263>
mov    -0xd4(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    138b <number+0x27b>
mov    -0xd4(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x28(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x28(%rbp)
mov    0x10(%rbp),%eax
and    $0x11,%eax
cmp    $0x0,%eax
jne    13e9 <number+0x2d9>
jmp    13aa <number+0x29a>
mov    -0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x28(%rbp)
cmp    $0x0,%eax
jle    13e4 <number+0x2d4>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     13d3 <number+0x2c3>
mov    -0x10(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    13aa <number+0x29a>
jmp    13e9 <number+0x2d9>
cmpb   $0x0,-0x2e(%rbp)
je     1416 <number+0x306>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     140a <number+0x2fa>
mov    -0x2e(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    0x10(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     14b1 <number+0x3a1>
cmpl   $0x8,-0x24(%rbp)
jne    1455 <number+0x345>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     1444 <number+0x334>
mov    -0x10(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14ac <number+0x39c>
cmpl   $0x10,-0x24(%rbp)
jne    14a7 <number+0x397>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     1474 <number+0x364>
mov    -0x10(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     149b <number+0x38b>
mov    -0x78(%rbp),%rax
mov    0x21(%rax),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14ac <number+0x39c>
jmp    14b1 <number+0x3a1>
mov    0x10(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    1506 <number+0x3f6>
jmp    14c5 <number+0x3b5>
mov    -0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x28(%rbp)
cmp    $0x0,%eax
jle    1501 <number+0x3f1>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     14f0 <number+0x3e0>
mov    -0x2d(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    14c5 <number+0x3b5>
jmp    1506 <number+0x3f6>
jmp    150b <number+0x3fb>
mov    -0xd4(%rbp),%eax
mov    -0x2c(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x2c(%rbp)
cmp    %ecx,%eax
jge    154a <number+0x43a>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     1539 <number+0x429>
mov    -0x10(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    150b <number+0x3fb>
jmp    154f <number+0x43f>
mov    -0xd4(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xd4(%rbp)
cmp    $0x0,%eax
jle    1599 <number+0x489>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     1588 <number+0x478>
movslq -0xd4(%rbp),%rax
mov    -0x70(%rbp,%rax,1),%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    154f <number+0x43f>
jmp    159e <number+0x48e>
mov    -0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x28(%rbp)
cmp    $0x0,%eax
jle    15d8 <number+0x4c8>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
ja     15c7 <number+0x4b7>
mov    -0x10(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    159e <number+0x48e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x100,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<number>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    0x70(%rsp),%r12d
movaps 0xef6(%rip),%xmm0
movaps %xmm0,-0x30(%rsp)
movaps 0xeda(%rip),%xmm0
movaps %xmm0,-0x40(%rsp)
movabs $0x7a797877767574,%rax
mov    %rax,-0x23(%rsp)
movaps 0xeff(%rip),%xmm0
movaps %xmm0,-0x60(%rsp)
movaps 0xee3(%rip),%xmm0
movaps %xmm0,-0x70(%rsp)
movabs $0x5a595857565554,%rax
mov    %rax,-0x53(%rsp)
test   $0x40,%r12b
lea    -0x40(%rsp),%rbx
lea    -0x70(%rsp),%r15
cmove  %rbx,%r15
mov    %r12d,%r14d
and    $0xfffffffe,%r14d
test   $0x10,%r12b
cmove  %r12d,%r14d
lea    -0x25(%rcx),%eax
cmp    $0xffffffdd,%eax
jb     15c0 <number+0x4c0>
mov    %rdx,%r10
mov    $0x1,%r13b
test   $0x2,%r14b
jne    11aa <number+0xaa>
movl   $0x0,-0x78(%rsp)
test   $0x20,%r14b
je     11ef <number+0xef>
jmp    11e1 <number+0xe1>
test   %r10,%r10
js     11c3 <number+0xc3>
test   $0x4,%r14b
jne    11ce <number+0xce>
test   $0x8,%r14b
je     119a <number+0x9a>
add    $0xffffffff,%r8d
mov    $0x20,%al
jmp    11d4 <number+0xd4>
neg    %r10
add    $0xffffffff,%r8d
mov    $0x2d,%al
jmp    11d4 <number+0xd4>
add    $0xffffffff,%r8d
mov    $0x2b,%al
mov    %eax,-0x78(%rsp)
xor    %r13d,%r13d
test   $0x20,%r14b
je     11ef <number+0xef>
cmp    $0x8,%ecx
je     1230 <number+0x130>
cmp    $0x10,%ecx
jne    11ef <number+0xef>
add    $0xfffffffe,%r8d
test   %r10,%r10
je     1239 <number+0x139>
mov    %ecx,%ebp
xor    %r11d,%r11d
jmp    121e <number+0x11e>
nopl   0x0(%rax,%rax,1)
mov    %r10,%rax
xor    %edx,%edx
div    %rbp
movzbl (%r15,%rdx,1),%edx
mov    %dl,-0x10(%rsp,%r11,1)
add    $0x1,%r11
cmp    %rbp,%r10
mov    %rax,%r10
jb     1244 <number+0x144>
mov    %r10,%rax
shr    $0x20,%rax
jne    1200 <number+0x100>
mov    %r10d,%eax
xor    %edx,%edx
div    %ebp
jmp    1208 <number+0x108>
add    $0xffffffff,%r8d
test   %r10,%r10
jne    11f4 <number+0xf4>
movb   $0x30,-0x10(%rsp)
mov    $0x1,%r11d
cmp    %r9d,%r11d
mov    %r9d,%edx
cmovg  %r11d,%edx
mov    %r8d,%r15d
sub    %edx,%r15d
test   $0x11,%r14b
je     1272 <number+0x172>
test   %r13b,%r13b
je     133c <number+0x23c>
test   $0x20,%r14b
jne    1351 <number+0x251>
jmp    1367 <number+0x267>
lea    -0x1(%r15),%r10d
test   %r15d,%r15d
jle    12b7 <number+0x1b7>
test   $0x3,%r15b
mov    %r13d,-0x74(%rsp)
je     12ce <number+0x1ce>
mov    %rbx,%r15
sub    %dl,%r8b
movzbl %r8b,%eax
and    $0x3,%eax
xor    %ebx,%ebx
jmp    12a8 <number+0x1a8>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    %ebx,%eax
je     12c1 <number+0x1c1>
lea    (%rdi,%rbx,1),%rbp
cmp    %rsi,%rbp
ja     12a0 <number+0x1a0>
movb   $0x20,0x0(%rbp)
jmp    12a0 <number+0x1a0>
mov    %r10d,%r15d
test   %r13b,%r13b
jne    1263 <number+0x163>
jmp    133c <number+0x23c>
mov    %r10d,%ebp
sub    %ebx,%ebp
add    %rbx,%rdi
mov    %r15,%rbx
jmp    12d1 <number+0x1d1>
mov    %r10d,%ebp
mov    $0xffffffff,%r15d
cmp    $0x3,%r10d
jb     132e <number+0x22e>
add    $0x4,%ebp
add    $0x3,%rdi
jmp    12fc <number+0x1fc>
cs nopw 0x0(%rax,%rax,1)
add    $0xfffffffc,%ebp
add    $0x4,%rdi
cmp    $0x3,%ebp
jle    132a <number+0x22a>
lea    -0x3(%rdi),%rax
cmp    %rsi,%rax
ja     1308 <number+0x208>
movb   $0x20,(%rax)
lea    -0x2(%rdi),%rax
cmp    %rsi,%rax
ja     1314 <number+0x214>
movb   $0x20,(%rax)
lea    -0x1(%rdi),%rax
cmp    %rsi,%rax
ja     1320 <number+0x220>
movb   $0x20,(%rax)
cmp    %rsi,%rdi
ja     12f0 <number+0x1f0>
movb   $0x20,(%rdi)
jmp    12f0 <number+0x1f0>
add    $0xfffffffffffffffd,%rdi
mov    -0x74(%rsp),%r13d
test   %r13b,%r13b
jne    1263 <number+0x163>
cmp    %rsi,%rdi
ja     1347 <number+0x247>
mov    -0x78(%rsp),%eax
mov    %al,(%rdi)
add    $0x1,%rdi
test   $0x20,%r14b
je     1367 <number+0x267>
cmp    $0x10,%ecx
je     13c8 <number+0x2c8>
cmp    $0x8,%ecx
jne    1367 <number+0x267>
cmp    %rsi,%rdi
ja     1363 <number+0x263>
movb   $0x30,(%rdi)
add    $0x1,%rdi
test   $0x10,%r14b
jne    145e <number+0x35e>
lea    -0x1(%r15),%ebp
test   %r15d,%r15d
jle    13b7 <number+0x2b7>
and    $0x1,%r14b
shl    $0x4,%r14b
or     $0x20,%r14b
test   $0x3,%r15b
je     13fb <number+0x2fb>
and    $0x3,%r15d
xor    %ebx,%ebx
jmp    13a9 <number+0x2a9>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rbx
cmp    %ebx,%r15d
je     13bf <number+0x2bf>
lea    (%rdi,%rbx,1),%rax
cmp    %rsi,%rax
ja     13a0 <number+0x2a0>
mov    %r14b,(%rax)
jmp    13a0 <number+0x2a0>
mov    %ebp,%r15d
jmp    145e <number+0x35e>
mov    %ebp,%ecx
sub    %ebx,%ecx
add    %rbx,%rdi
jmp    13fd <number+0x2fd>
cmp    %rsi,%rdi
ja     13d0 <number+0x2d0>
movb   $0x30,(%rdi)
lea    0x1(%rdi),%rax
cmp    %rsi,%rax
ja     13eb <number+0x2eb>
test   $0x40,%r12b
lea    -0x70(%rsp),%rcx
cmove  %rbx,%rcx
mov    0x21(%rcx),%cl
mov    %cl,(%rax)
add    $0x2,%rdi
test   $0x10,%r14b
je     1371 <number+0x271>
jmp    145e <number+0x35e>
mov    %ebp,%ecx
mov    $0xffffffff,%r15d
cmp    $0x3,%ebp
jb     145e <number+0x35e>
add    $0x4,%ecx
add    $0x3,%rdi
jmp    142c <number+0x32c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0xfffffffc,%ecx
add    $0x4,%rdi
cmp    $0x3,%ecx
jle    145a <number+0x35a>
lea    -0x3(%rdi),%rax
cmp    %rsi,%rax
ja     1438 <number+0x338>
mov    %r14b,(%rax)
lea    -0x2(%rdi),%rax
cmp    %rsi,%rax
ja     1444 <number+0x344>
mov    %r14b,(%rax)
lea    -0x1(%rdi),%rax
cmp    %rsi,%rax
ja     1450 <number+0x350>
mov    %r14b,(%rax)
cmp    %rsi,%rdi
ja     1420 <number+0x320>
mov    %r14b,(%rdi)
jmp    1420 <number+0x320>
add    $0xfffffffffffffffd,%rdi
cmp    %r9d,%r11d
jge    14fe <number+0x3fe>
mov    %edx,%eax
sub    %r11d,%eax
mov    %r11d,%ecx
not    %ecx
add    %edx,%ecx
test   $0x3,%al
je     14ab <number+0x3ab>
mov    %edx,%eax
sub    %r11b,%al
movzbl %al,%ebp
and    $0x3,%ebp
xor    %ebx,%ebx
jmp    1498 <number+0x398>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    %ebx,%ebp
je     14a6 <number+0x3a6>
lea    (%rdi,%rbx,1),%rax
cmp    %rsi,%rax
ja     1490 <number+0x390>
movb   $0x30,(%rax)
jmp    1490 <number+0x390>
sub    %ebx,%edx
add    %rbx,%rdi
cmp    $0x3,%ecx
jb     14fe <number+0x3fe>
add    $0x3,%rdi
jmp    14c9 <number+0x3c9>
cs nopw 0x0(%rax,%rax,1)
add    $0x4,%rdi
cmp    %edx,%r11d
jge    14fa <number+0x3fa>
lea    -0x3(%rdi),%rax
cmp    %rsi,%rax
ja     14d5 <number+0x3d5>
movb   $0x30,(%rax)
lea    -0x2(%rdi),%rax
cmp    %rsi,%rax
ja     14e1 <number+0x3e1>
movb   $0x30,(%rax)
lea    -0x1(%rdi),%rax
cmp    %rsi,%rax
ja     14ed <number+0x3ed>
movb   $0x30,(%rax)
add    $0xfffffffc,%edx
cmp    %rsi,%rdi
ja     14c0 <number+0x3c0>
movb   $0x30,(%rdi)
jmp    14c0 <number+0x3c0>
add    $0xfffffffffffffffd,%rdi
lea    0x1(%r11),%ecx
add    $0xffffffff,%r11d
lea    (%rsp,%r11,1),%rdx
add    $0xfffffffffffffff0,%rdx
jmp    1520 <number+0x420>
add    $0x1,%rdi
add    $0xffffffff,%ecx
add    $0xffffffffffffffff,%rdx
cmp    $0x1,%ecx
jle    152c <number+0x42c>
cmp    %rsi,%rdi
ja     1510 <number+0x410>
movzbl (%rdx),%eax
mov    %al,(%rdi)
jmp    1510 <number+0x410>
test   %r15d,%r15d
jle    15c0 <number+0x4c0>
lea    -0x1(%r15),%ecx
test   $0x3,%r15b
je     156d <number+0x46d>
mov    %r15d,%eax
and    $0x3,%eax
xor    %edx,%edx
jmp    1558 <number+0x458>
nopl   0x0(%rax)
add    $0x1,%rdx
cmp    %edx,%eax
je     1567 <number+0x467>
lea    (%rdi,%rdx,1),%rbp
cmp    %rsi,%rbp
ja     1550 <number+0x450>
movb   $0x20,(%rdi,%rdx,1)
jmp    1550 <number+0x450>
sub    %edx,%r15d
add    %rdx,%rdi
cmp    $0x3,%ecx
jb     15c0 <number+0x4c0>
add    $0xffffffff,%r15d
add    $0x3,%rdi
jmp    158e <number+0x48e>
nopl   0x0(%rax)
add    $0xfffffffc,%r15d
add    $0x4,%rdi
cmp    $0xfffffffe,%r15d
jae    15bc <number+0x4bc>
lea    -0x3(%rdi),%rax
cmp    %rsi,%rax
ja     159a <number+0x49a>
movb   $0x20,(%rax)
lea    -0x2(%rdi),%rax
cmp    %rsi,%rax
ja     15a6 <number+0x4a6>
movb   $0x20,(%rax)
lea    -0x1(%rdi),%rax
cmp    %rsi,%rax
ja     15b2 <number+0x4b2>
movb   $0x20,(%rax)
cmp    %rsi,%rdi
ja     1580 <number+0x480>
movb   $0x20,(%rdi)
jmp    1580 <number+0x480>
add    $0xfffffffffffffffd,%rdi
mov    %rdi,%rax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@__const.number.small_digits = [37 x i8] c"0123456789abcdefghijklmnopqrstuvwxyz\00"
@__const.number.large_digits = [37 x i8] c"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\00"
define i8* @number(i8* writeonly %0, i8* readnone %1, i64 %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = alloca [66 x i8]
%9 = alloca [37 x i8]
%10 = alloca [37 x i8]
%11 = getelementptr inbounds [66 x i8], [66 x i8]* %8, i64 0, i64 0
%12 = getelementptr inbounds [37 x i8], [37 x i8]* %9, i64 0, i64 0
%13 = getelementptr inbounds [37 x i8], [37 x i8]* %10, i64 0, i64 0
%14 = and i32 %6, 64
%15 = icmp eq i32 %14, 0
%16 = select i1 %15, i8* %12, i8* %13
%17 = and i32 %6, 16
%18 = icmp eq i32 %17, 0
%19 = and i32 %6, -2
%20 = select i1 %18, i32 %6, i32 %19
%21 = add i32 %3, -37
%22 = icmp ult i32 %21, -35
br i1 %22, label %308, label %23
23: ; preds = %7
%24 = and i32 %20, 1
%25 = icmp eq i32 %24, 0
%26 = select i1 %25, i8 32, i8 48
%27 = and i32 %20, 2
%28 = icmp eq i32 %27, 0
br i1 %28, label %44, label %29
29: ; preds = %23
%30 = icmp slt i64 %2, 0
br i1 %30, label %31, label %34
31: ; preds = %29
%32 = sub nsw i64 0, %2
%33 = add nsw i32 %4, -1
br label %44
34: ; preds = %29
%35 = and i32 %20, 4
%36 = icmp eq i32 %35, 0
br i1 %36, label %39, label %37
37: ; preds = %34
%38 = add nsw i32 %4, -1
br label %44
39: ; preds = %34
%40 = and i32 %20, 8
%41 = icmp eq i32 %40, 0
br i1 %41, label %44, label %42
42: ; preds = %39
%43 = add nsw i32 %4, -1
br label %44
44: ; preds = %31, %39, %42, %37, %23
%45 = phi i32 [ %33, %31 ], [ %38, %37 ], [ %43, %42 ], [ %4, %39 ], [ %4, %23 ]
%46 = phi i64 [ %32, %31 ], [ %2, %37 ], [ %2, %42 ], [ %2, %39 ], [ %2, %23 ]
%47 = phi i1 [ false, %31 ], [ false, %37 ], [ false, %42 ], [ true, %39 ], [ true, %23 ]
%48 = phi i8 [ 45, %31 ], [ 43, %37 ], [ 32, %42 ], [ 0, %39 ], [ 0, %23 ]
%49 = and i32 %20, 32
%50 = icmp eq i32 %49, 0
br i1 %50, label %56, label %51
51: ; preds = %44
switch i32 %3, label %56 [
i32 16, label %52
i32 8, label %54
]
52: ; preds = %51
%53 = add nsw i32 %45, -2
br label %56
54: ; preds = %51
%55 = add nsw i32 %45, -1
br label %56
56: ; preds = %51, %52, %54, %44
%57 = phi i32 [ %53, %52 ], [ %55, %54 ], [ %45, %44 ], [ %45, %51 ]
%58 = icmp eq i64 %46, 0
br i1 %58, label %61, label %59
59: ; preds = %56
%60 = zext i32 %3 to i64
br label %62
61: ; preds = %56
store i8 48, i8* %11
br label %74
62: ; preds = %59, %62
%63 = phi i64 [ 0, %59 ], [ %68, %62 ]
%64 = phi i64 [ %46, %59 ], [ %70, %62 ]
%65 = urem i64 %64, %60
%66 = getelementptr inbounds i8, i8* %16, i64 %65
%67 = load i8, i8* %66
%68 = add nuw i64 %63, 1
%69 = getelementptr inbounds [66 x i8], [66 x i8]* %8, i64 0, i64 %63
store i8 %67, i8* %69
%70 = udiv i64 %64, %60
%71 = icmp ult i64 %64, %60
br i1 %71, label %72, label %62
72: ; preds = %62
%73 = trunc i64 %68 to i32
br label %74
74: ; preds = %72, %61
%75 = phi i32 [ 1, %61 ], [ %73, %72 ]
%76 = icmp sgt i32 %75, %5
%77 = select i1 %76, i32 %75, i32 %5
%78 = sub i32 %57, %77
%79 = and i32 %20, 17
%80 = icmp eq i32 %79, 0
br i1 %80, label %81, label %124
81: ; preds = %74
%82 = add i32 %78, -1
%83 = icmp sgt i32 %78, 0
br i1 %83, label %84, label %124
84: ; preds = %81
%85 = and i32 %78, 3
%86 = icmp eq i32 %85, 0
br i1 %86, label %98, label %87
87: ; preds = %84, %93
%88 = phi i32 [ %95, %93 ], [ %82, %84 ]
%89 = phi i8* [ %94, %93 ], [ %0, %84 ]
%90 = phi i32 [ %96, %93 ], [ 0, %84 ]
%91 = icmp ugt i8* %89, %1
br i1 %91, label %93, label %92
92: ; preds = %87
store i8 32, i8* %89
br label %93
93: ; preds = %92, %87
%94 = getelementptr inbounds i8, i8* %89, i64 1
%95 = add nsw i32 %88, -1
%96 = add i32 %90, 1
%97 = icmp eq i32 %96, %85
br i1 %97, label %98, label %87
98: ; preds = %93, %84
%99 = phi i32 [ %82, %84 ], [ %95, %93 ]
%100 = phi i8* [ %0, %84 ], [ %94, %93 ]
%101 = phi i8* [ undef, %84 ], [ %94, %93 ]
%102 = icmp ult i32 %82, 3
br i1 %102, label %124, label %103
103: ; preds = %98, %120
%104 = phi i32 [ %122, %120 ], [ %99, %98 ]
%105 = phi i8* [ %121, %120 ], [ %100, %98 ]
%106 = icmp ugt i8* %105, %1
br i1 %106, label %108, label %107
107: ; preds = %103
store i8 32, i8* %105
br label %108
108: ; preds = %107, %103
%109 = getelementptr inbounds i8, i8* %105, i64 1
%110 = icmp ugt i8* %109, %1
br i1 %110, label %112, label %111
111: ; preds = %108
store i8 32, i8* %109
br label %112
112: ; preds = %111, %108
%113 = getelementptr inbounds i8, i8* %105, i64 2
%114 = icmp ugt i8* %113, %1
br i1 %114, label %116, label %115
115: ; preds = %112
store i8 32, i8* %113
br label %116
116: ; preds = %115, %112
%117 = getelementptr inbounds i8, i8* %105, i64 3
%118 = icmp ugt i8* %117, %1
br i1 %118, label %120, label %119
119: ; preds = %116
store i8 32, i8* %117
br label %120
120: ; preds = %119, %116
%121 = getelementptr inbounds i8, i8* %105, i64 4
%122 = add nsw i32 %104, -4
%123 = icmp sgt i32 %104, 3
br i1 %123, label %103, label %124
124: ; preds = %98, %120, %81, %74
%125 = phi i32 [ %78, %74 ], [ %82, %81 ], [ -1, %120 ], [ -1, %98 ]
%126 = phi i8* [ %0, %74 ], [ %0, %81 ], [ %101, %98 ], [ %121, %120 ]
br i1 %47, label %132, label %127
127: ; preds = %124
%128 = icmp ugt i8* %126, %1
br i1 %128, label %130, label %129
129: ; preds = %127
store i8 %48, i8* %126
br label %130
130: ; preds = %129, %127
%131 = getelementptr inbounds i8, i8* %126, i64 1
br label %132
132: ; preds = %130, %124
%133 = phi i8* [ %131, %130 ], [ %126, %124 ]
br i1 %50, label %154, label %134
134: ; preds = %132
switch i32 %3, label %154 [
i32 8, label %135
i32 16, label %140
]
135: ; preds = %134
%136 = icmp ugt i8* %133, %1
br i1 %136, label %138, label %137
137: ; preds = %135
store i8 48, i8* %133
br label %138
138: ; preds = %137, %135
%139 = getelementptr inbounds i8, i8* %133, i64 1
br label %154
140: ; preds = %134
%141 = icmp ugt i8* %133, %1
br i1 %141, label %143, label %142
142: ; preds = %140
store i8 48, i8* %133
br label %143
143: ; preds = %142, %140
%144 = getelementptr inbounds i8, i8* %133, i64 1
%145 = icmp ugt i8* %144, %1
br i1 %145, label %152, label %146
146: ; preds = %143
%147 = getelementptr inbounds [37 x i8], [37 x i8]* %9, i64 0, i64 33
%148 = getelementptr inbounds [37 x i8], [37 x i8]* %10, i64 0, i64 33
%149 = load i8, i8* %147
%150 = load i8, i8* %148
%151 = select i1 %15, i8 %149, i8 %150
store i8 %151, i8* %144
br label %152
152: ; preds = %146, %143
%153 = getelementptr inbounds i8, i8* %133, i64 2
br label %154
154: ; preds = %134, %138, %152, %132
%155 = phi i8* [ %139, %138 ], [ %153, %152 ], [ %133, %132 ], [ %133, %134 ]
%156 = and i32 %20, 16
%157 = icmp eq i32 %156, 0
br i1 %157, label %158, label %201
158: ; preds = %154
%159 = add i32 %125, -1
%160 = icmp sgt i32 %125, 0
br i1 %160, label %161, label %201
161: ; preds = %158
%162 = and i32 %125, 3
%163 = icmp eq i32 %162, 0
br i1 %163, label %175, label %164
164: ; preds = %161, %170
%165 = phi i32 [ %172, %170 ], [ %159, %161 ]
%166 = phi i8* [ %171, %170 ], [ %155, %161 ]
%167 = phi i32 [ %173, %170 ], [ 0, %161 ]
%168 = icmp ugt i8* %166, %1
br i1 %168, label %170, label %169
169: ; preds = %164
store i8 %26, i8* %166
br label %170
170: ; preds = %169, %164
%171 = getelementptr inbounds i8, i8* %166, i64 1
%172 = add nsw i32 %165, -1
%173 = add i32 %167, 1
%174 = icmp eq i32 %173, %162
br i1 %174, label %175, label %164
175: ; preds = %170, %161
%176 = phi i32 [ %159, %161 ], [ %172, %170 ]
%177 = phi i8* [ %155, %161 ], [ %171, %170 ]
%178 = phi i8* [ undef, %161 ], [ %171, %170 ]
%179 = icmp ult i32 %159, 3
br i1 %179, label %201, label %180
180: ; preds = %175, %197
%181 = phi i32 [ %199, %197 ], [ %176, %175 ]
%182 = phi i8* [ %198, %197 ], [ %177, %175 ]
%183 = icmp ugt i8* %182, %1
br i1 %183, label %185, label %184
184: ; preds = %180
store i8 %26, i8* %182
br label %185
185: ; preds = %184, %180
%186 = getelementptr inbounds i8, i8* %182, i64 1
%187 = icmp ugt i8* %186, %1
br i1 %187, label %189, label %188
188: ; preds = %185
store i8 %26, i8* %186
br label %189
189: ; preds = %188, %185
%190 = getelementptr inbounds i8, i8* %182, i64 2
%191 = icmp ugt i8* %190, %1
br i1 %191, label %193, label %192
192: ; preds = %189
store i8 %26, i8* %190
br label %193
193: ; preds = %192, %189
%194 = getelementptr inbounds i8, i8* %182, i64 3
%195 = icmp ugt i8* %194, %1
br i1 %195, label %197, label %196
196: ; preds = %193
store i8 %26, i8* %194
br label %197
197: ; preds = %196, %193
%198 = getelementptr inbounds i8, i8* %182, i64 4
%199 = add nsw i32 %181, -4
%200 = icmp sgt i32 %181, 3
br i1 %200, label %180, label %201
201: ; preds = %175, %197, %158, %154
%202 = phi i32 [ %125, %154 ], [ %159, %158 ], [ -1, %197 ], [ -1, %175 ]
%203 = phi i8* [ %155, %154 ], [ %155, %158 ], [ %178, %175 ], [ %198, %197 ]
%204 = icmp slt i32 %75, %5
br i1 %204, label %205, label %227
205: ; preds = %201
%206 = sub i32 %77, %75
%207 = xor i32 %75, -1
%208 = add i32 %77, %207
%209 = and i32 %206, 3
%210 = icmp eq i32 %209, 0
br i1 %210, label %222, label %211
211: ; preds = %205, %218
%212 = phi i32 [ %215, %218 ], [ %77, %205 ]
%213 = phi i8* [ %219, %218 ], [ %203, %205 ]
%214 = phi i32 [ %220, %218 ], [ 0, %205 ]
%215 = add nsw i32 %212, -1
%216 = icmp ugt i8* %213, %1
br i1 %216, label %218, label %217
217: ; preds = %211
store i8 48, i8* %213
br label %218
218: ; preds = %217, %211
%219 = getelementptr inbounds i8, i8* %213, i64 1
%220 = add i32 %214, 1
%221 = icmp eq i32 %220, %209
br i1 %221, label %222, label %211
222: ; preds = %218, %205
%223 = phi i32 [ %77, %205 ], [ %215, %218 ]
%224 = phi i8* [ %203, %205 ], [ %219, %218 ]
%225 = phi i8* [ undef, %205 ], [ %219, %218 ]
%226 = icmp ult i32 %208, 3
br i1 %226, label %227, label %230
227: ; preds = %222, %248, %201
%228 = phi i8* [ %203, %201 ], [ %225, %222 ], [ %249, %248 ]
%229 = zext i32 %75 to i64
br label %273
230: ; preds = %222, %248
%231 = phi i32 [ %245, %248 ], [ %223, %222 ]
%232 = phi i8* [ %249, %248 ], [ %224, %222 ]
%233 = icmp ugt i8* %232, %1
br i1 %233, label %235, label %234
234: ; preds = %230
store i8 48, i8* %232
br label %235
235: ; preds = %234, %230
%236 = getelementptr inbounds i8, i8* %232, i64 1
%237 = icmp ugt i8* %236, %1
br i1 %237, label %239, label %238
238: ; preds = %235
store i8 48, i8* %236
br label %239
239: ; preds = %238, %235
%240 = getelementptr inbounds i8, i8* %232, i64 2
%241 = icmp ugt i8* %240, %1
br i1 %241, label %243, label %242
242: ; preds = %239
store i8 48, i8* %240
br label %243
243: ; preds = %242, %239
%244 = getelementptr inbounds i8, i8* %232, i64 3
%245 = add nsw i32 %231, -4
%246 = icmp ugt i8* %244, %1
br i1 %246, label %248, label %247
247: ; preds = %243
store i8 48, i8* %244
br label %248
248: ; preds = %247, %243
%249 = getelementptr inbounds i8, i8* %232, i64 4
%250 = icmp slt i32 %75, %245
br i1 %250, label %230, label %227
251: ; preds = %282
%252 = icmp sgt i32 %202, 0
br i1 %252, label %253, label %308
253: ; preds = %251
%254 = add i32 %202, -1
%255 = and i32 %202, 3
%256 = icmp eq i32 %255, 0
br i1 %256, label %268, label %257
257: ; preds = %253, %264
%258 = phi i32 [ %261, %264 ], [ %202, %253 ]
%259 = phi i8* [ %265, %264 ], [ %283, %253 ]
%260 = phi i32 [ %266, %264 ], [ 0, %253 ]
%261 = add nsw i32 %258, -1
%262 = icmp ugt i8* %259, %1
br i1 %262, label %264, label %263
263: ; preds = %257
store i8 32, i8* %259
br label %264
264: ; preds = %263, %257
%265 = getelementptr inbounds i8, i8* %259, i64 1
%266 = add i32 %260, 1
%267 = icmp eq i32 %266, %255
br i1 %267, label %268, label %257
268: ; preds = %264, %253
%269 = phi i32 [ %202, %253 ], [ %261, %264 ]
%270 = phi i8* [ %283, %253 ], [ %265, %264 ]
%271 = phi i8* [ undef, %253 ], [ %265, %264 ]
%272 = icmp ult i32 %254, 3
br i1 %272, label %308, label %286
273: ; preds = %227, %282
%274 = phi i64 [ %229, %227 ], [ %276, %282 ]
%275 = phi i8* [ %228, %227 ], [ %283, %282 ]
%276 = add nsw i64 %274, -1
%277 = icmp ugt i8* %275, %1
br i1 %277, label %282, label %278
278: ; preds = %273
%279 = and i64 %276, 4294967295
%280 = getelementptr inbounds [66 x i8], [66 x i8]* %8, i64 0, i64 %279
%281 = load i8, i8* %280
store i8 %281, i8* %275
br label %282
282: ; preds = %278, %273
%283 = getelementptr inbounds i8, i8* %275, i64 1
%284 = trunc i64 %274 to i32
%285 = icmp sgt i32 %284, 1
br i1 %285, label %273, label %251
286: ; preds = %268, %304
%287 = phi i32 [ %301, %304 ], [ %269, %268 ]
%288 = phi i8* [ %305, %304 ], [ %270, %268 ]
%289 = icmp ugt i8* %288, %1
br i1 %289, label %291, label %290
290: ; preds = %286
store i8 32, i8* %288
br label %291
291: ; preds = %290, %286
%292 = getelementptr inbounds i8, i8* %288, i64 1
%293 = icmp ugt i8* %292, %1
br i1 %293, label %295, label %294
294: ; preds = %291
store i8 32, i8* %292
br label %295
295: ; preds = %294, %291
%296 = getelementptr inbounds i8, i8* %288, i64 2
%297 = icmp ugt i8* %296, %1
br i1 %297, label %299, label %298
298: ; preds = %295
store i8 32, i8* %296
br label %299
299: ; preds = %298, %295
%300 = getelementptr inbounds i8, i8* %288, i64 3
%301 = add nsw i32 %287, -4
%302 = icmp ugt i8* %300, %1
br i1 %302, label %304, label %303
303: ; preds = %299
store i8 32, i8* %300
br label %304
304: ; preds = %303, %299
%305 = getelementptr inbounds i8, i8* %288, i64 4
%306 = add i32 %287, -5
%307 = icmp ult i32 %306, -2
br i1 %307, label %286, label %308
308: ; preds = %268, %304, %251, %7
%309 = phi i8* [ %0, %7 ], [ %283, %251 ], [ %271, %268 ], [ %305, %304 ]
ret i8* %309
}