int make_decode_table(int number_symbols, int table_size, unsigned char *length,
                      unsigned short *table) {
  register unsigned char bit_num = 0;
  register int symbol;
  unsigned int leaf;
  unsigned int table_mask, bit_mask, pos, fill, next_symbol, reverse;
  int myabort = 0;
  pos = 0;
  bit_mask = table_mask = 1 << table_size;
  bit_mask >>= 1;
  bit_num++;
  while ((!myabort) && (bit_num <= table_size)) {
    for (symbol = 0; symbol < number_symbols; symbol++) {
      if (length[symbol] == bit_num) {
        reverse = pos;
        leaf = 0;
        fill = table_size;
        do {
          leaf = (leaf << 1) + (reverse & 1);
          reverse >>= 1;
        } while (--fill);
        if ((pos += bit_mask) > table_mask) {
          myabort = 1;
          break;
        }
        fill = bit_mask;
        next_symbol = 1 << bit_num;
        do {
          table[leaf] = symbol;
          leaf += next_symbol;
        } while (--fill);
      }
    }
    bit_mask >>= 1;
    bit_num++;
  }
  if ((!myabort) && (pos != table_mask)) {
    for (symbol = pos; symbol < table_mask; symbol++) {
      reverse = symbol;
      leaf = 0;
      fill = table_size;
      do {
        leaf = (leaf << 1) + (reverse & 1);
        reverse >>= 1;
      } while (--fill);
      table[leaf] = 0;
    }
    next_symbol = table_mask >> 1;
    pos <<= 16;
    table_mask <<= 16;
    bit_mask = 32768;
    while ((!myabort) && (bit_num <= 16)) {
      for (symbol = 0; symbol < number_symbols; symbol++) {
        if (length[symbol] == bit_num) {
          reverse = pos >> 16;
          leaf = 0;
          fill = table_size;
          do {
            leaf = (leaf << 1) + (reverse & 1);
            reverse >>= 1;
          } while (--fill);
          for (fill = 0; fill < bit_num - table_size; fill++) {
            if (table[leaf] == 0) {
              table[(next_symbol << 1)] = 0;
              table[(next_symbol << 1) + 1] = 0;
              table[leaf] = next_symbol++;
            }
            leaf = table[leaf] << 1;
            leaf += (pos >> (15 - fill)) & 1;
          }
          table[leaf] = symbol;
          if ((pos += bit_mask) > table_mask) {
            myabort = 1;
            break;
          }
        }
      }
      bit_mask >>= 1;
      bit_num++;
    }
  }
  if (pos != table_mask)
    myabort = 1;
  return (myabort);
}


x86 assembly (clang, -O0):
<make_decode_table>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movb   $0x0,-0x19(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x8(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,-0x28(%rbp)
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x19(%rbp),%al
add    $0x1,%al
mov    %al,-0x19(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x40(%rbp)
mov    %al,-0x41(%rbp)
jne    1161 <make_decode_table+0x61>
movzbl -0x19(%rbp),%eax
cmp    -0x8(%rbp),%eax
setle  %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    1171 <make_decode_table+0x71>
jmp    1267 <make_decode_table+0x167>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1251 <make_decode_table+0x151>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    123e <make_decode_table+0x13e>
mov    -0x30(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    -0x3c(%rbp),%ecx
and    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x3c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmp    $0x0,%eax
jne    11af <make_decode_table+0xaf>
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
cmp    -0x28(%rbp),%eax
jbe    11f9 <make_decode_table+0xf9>
movl   $0x1,-0x40(%rbp)
jmp    1251 <make_decode_table+0x151>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x34(%rbp)
movzbl -0x19(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0x38(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmp    $0x0,%eax
jne    120d <make_decode_table+0x10d>
jmp    123e <make_decode_table+0x13e>
jmp    1243 <make_decode_table+0x143>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1178 <make_decode_table+0x78>
mov    -0x2c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x19(%rbp),%al
add    $0x1,%al
mov    %al,-0x19(%rbp)
jmp    1145 <make_decode_table+0x45>
cmpl   $0x0,-0x40(%rbp)
jne    14a8 <make_decode_table+0x3a8>
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     14a8 <make_decode_table+0x3a8>
mov    -0x30(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x28(%rbp),%eax
jae    12e9 <make_decode_table+0x1e9>
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    -0x3c(%rbp),%ecx
and    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x3c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmp    $0x0,%eax
jne    12a2 <make_decode_table+0x1a2>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movw   $0x0,(%rax,%rcx,2)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1283 <make_decode_table+0x183>
mov    -0x28(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%eax
shl    $0x10,%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
shl    $0x10,%eax
mov    %eax,-0x28(%rbp)
movl   $0x8000,-0x2c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x40(%rbp)
mov    %al,-0x42(%rbp)
jne    1327 <make_decode_table+0x227>
movzbl -0x19(%rbp),%eax
cmp    $0x10,%eax
setle  %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
test   $0x1,%al
jne    1337 <make_decode_table+0x237>
jmp    14a3 <make_decode_table+0x3a3>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    148d <make_decode_table+0x38d>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
movzbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
jne    147a <make_decode_table+0x37a>
mov    -0x30(%rbp),%eax
shr    $0x10,%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    -0x3c(%rbp),%ecx
and    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x3c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmp    $0x0,%eax
jne    1378 <make_decode_table+0x278>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
movzbl -0x19(%rbp),%ecx
sub    -0x8(%rbp),%ecx
cmp    %ecx,%eax
jae    1446 <make_decode_table+0x346>
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movzwl (%rax,%rcx,2),%eax
cmp    $0x0,%eax
jne    1411 <make_decode_table+0x311>
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
mov    %ecx,%ecx
movw   $0x0,(%rax,%rcx,2)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movw   $0x0,(%rax,%rcx,2)
mov    -0x38(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x38(%rbp)
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
movzwl (%rax,%rcx,2),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x30(%rbp),%eax
mov    $0xf,%ecx
sub    -0x34(%rbp),%ecx
shr    %cl,%eax
and    $0x1,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    13ab <make_decode_table+0x2ab>
mov    -0x20(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0x2c(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
cmp    -0x28(%rbp),%eax
jbe    1475 <make_decode_table+0x375>
movl   $0x1,-0x40(%rbp)
jmp    148d <make_decode_table+0x38d>
jmp    147a <make_decode_table+0x37a>
jmp    147f <make_decode_table+0x37f>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    133e <make_decode_table+0x23e>
mov    -0x2c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x19(%rbp),%al
add    $0x1,%al
mov    %al,-0x19(%rbp)
jmp    130b <make_decode_table+0x20b>
jmp    14a8 <make_decode_table+0x3a8>
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     14bb <make_decode_table+0x3bb>
movl   $0x1,-0x40(%rbp)
mov    -0x40(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_decode_table>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,%rax
mov    %esi,%r15d
mov    $0x1,%r11d
mov    %r15d,%ecx
shl    %cl,%r11d
mov    $0x1,%ecx
mov    %r11d,%r10d
shr    %r10d
test   %esi,%esi
mov    %r15,-0x18(%rsp)
mov    %rdx,-0x10(%rsp)
mov    %edi,-0x54(%rsp)
jle    140c <make_decode_table+0x30c>
mov    %rdx,%r9
mov    %edi,%r14d
lea    -0x1(%r15),%edx
mov    %edx,-0x1c(%rsp)
mov    %r15d,%edx
and    $0x3,%edx
mov    %edx,-0x58(%rsp)
mov    %r15d,%edx
and    $0xfffffffc,%edx
mov    %edx,-0x24(%rsp)
xor    %r13d,%r13d
mov    %r10d,%edx
mov    %rdx,-0x50(%rsp)
mov    %r14,-0x40(%rsp)
jmp    11a6 <make_decode_table+0xa6>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    -0x50(%rsp),%rdx
shr    %edx
mov    %rdx,-0x50(%rsp)
lea    0x1(%rcx),%r12d
movzbl %r12b,%ecx
mov    -0x18(%rsp),%r15
cmp    %r15d,%ecx
mov    -0x54(%rsp),%edi
jg     162d <make_decode_table+0x52d>
test   %edi,%edi
jle    1180 <make_decode_table+0x80>
mov    $0x1,%ebp
shl    %cl,%ebp
mov    -0x50(%rsp),%rdx
lea    -0x1(%rdx),%esi
mov    %esi,-0x20(%rsp)
mov    %edx,%esi
and    $0x7ffffff0,%esi
lea    -0x10(%rsi),%edi
mov    %edi,-0x28(%rsp)
mov    %rsi,-0x8(%rsp)
shl    %cl,%esi
mov    %esi,-0x30(%rsp)
shr    $0x4,%edi
add    $0x1,%edi
and    $0xf,%edx
mov    %edx,-0x34(%rsp)
mov    %edi,%edx
and    $0x3,%edx
mov    %edx,-0x44(%rsp)
and    $0xfffffffc,%edi
mov    %edi,-0x2c(%rsp)
lea    0x0(%rbp,%rbp,2),%r12d
lea    0x0(%rbp,%rbp,1),%r15d
xor    %r8d,%r8d
jmp    1222 <make_decode_table+0x122>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    -0x40(%rsp),%r14
add    $0x1,%r8
cmp    %r14,%r8
je     1180 <make_decode_table+0x80>
cmp    %cl,(%r9,%r8,1)
jne    1215 <make_decode_table+0x115>
xor    %edi,%edi
mov    %r13d,%ebx
cmpl   $0x3,-0x1c(%rsp)
jb     126f <make_decode_table+0x16f>
xor    %edi,%edi
mov    -0x24(%rsp),%esi
mov    %r13d,%ebx
nopl   (%rax)
mov    %ebx,%edx
and    $0x1,%edx
shl    $0x2,%edx
lea    (%rdx,%rdi,8),%edx
mov    %ebx,%edi
and    $0x2,%edi
or     %edx,%edi
mov    %ebx,%edx
shr    $0x2,%edx
and    $0x1,%edx
or     %edi,%edx
mov    %ebx,%edi
shr    $0x3,%edi
and    $0x1,%edi
lea    (%rdi,%rdx,2),%edi
shr    $0x4,%ebx
add    $0xfffffffc,%esi
jne    1240 <make_decode_table+0x140>
cmpl   $0x0,-0x58(%rsp)
mov    -0x50(%rsp),%r14
je     128f <make_decode_table+0x18f>
mov    -0x58(%rsp),%edx
nop
mov    %ebx,%esi
and    $0x1,%esi
lea    (%rsi,%rdi,2),%edi
shr    %ebx
add    $0xffffffff,%edx
jne    1280 <make_decode_table+0x180>
add    %r14d,%r13d
cmp    %r11d,%r13d
ja     1402 <make_decode_table+0x302>
cmp    $0x10,%r14d
jb     1380 <make_decode_table+0x280>
mov    %edi,%edx
add    -0x20(%rsp),%edx
setb   %dl
test   %ecx,%ecx
jne    1380 <make_decode_table+0x280>
test   %dl,%dl
jne    1380 <make_decode_table+0x280>
xor    %r14d,%r14d
movd   %r8d,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
cmpl   $0x30,-0x28(%rsp)
jb     1334 <make_decode_table+0x234>
xor    %r14d,%r14d
mov    -0x2c(%rsp),%ebx
xchg   %ax,%ax
mov    %r14d,%edx
shl    %cl,%edx
add    %edi,%edx
movdqu %xmm0,(%rax,%rdx,2)
lea    0x10(%r14),%esi
shl    %cl,%esi
movdqu %xmm0,0x10(%rax,%rdx,2)
add    %edi,%esi
movdqu %xmm0,(%rax,%rsi,2)
movdqu %xmm0,0x10(%rax,%rsi,2)
lea    0x20(%r14),%edx
shl    %cl,%edx
add    %edi,%edx
movdqu %xmm0,(%rax,%rdx,2)
movdqu %xmm0,0x10(%rax,%rdx,2)
lea    0x30(%r14),%edx
shl    %cl,%edx
add    %edi,%edx
movdqu %xmm0,(%rax,%rdx,2)
movdqu %xmm0,0x10(%rax,%rdx,2)
add    $0x40,%r14d
add    $0xfffffffc,%ebx
jne    12e0 <make_decode_table+0x1e0>
cmpl   $0x0,-0x44(%rsp)
je     135b <make_decode_table+0x25b>
mov    -0x44(%rsp),%edx
nop
mov    %r14d,%esi
shl    %cl,%esi
add    %edi,%esi
movdqu %xmm0,(%rax,%rsi,2)
movdqu %xmm0,0x10(%rax,%rsi,2)
add    $0x10,%r14d
add    $0xffffffff,%edx
jne    1340 <make_decode_table+0x240>
mov    -0x8(%rsp),%rdx
cmp    %edx,-0x50(%rsp)
je     1210 <make_decode_table+0x110>
add    -0x30(%rsp),%edi
mov    -0x34(%rsp),%edx
mov    %edx,%ebx
jmp    1383 <make_decode_table+0x283>
cs nopw 0x0(%rax,%rax,1)
mov    %r14d,%ebx
lea    -0x1(%rbx),%r14d
mov    %ebx,%edx
and    $0x3,%edx
je     13bb <make_decode_table+0x2bb>
mov    %r11d,%r9d
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %edi,%r11d
mov    %r8w,(%rax,%r11,2)
add    %ebp,%edi
add    $0x1,%esi
cmp    %esi,%edx
jne    13a0 <make_decode_table+0x2a0>
sub    %esi,%ebx
mov    %r9d,%r11d
mov    -0x10(%rsp),%r9
cmp    $0x3,%r14d
jb     1210 <make_decode_table+0x110>
mov    -0x40(%rsp),%r14
nopw   0x0(%rax,%rax,1)
mov    %edi,%edx
mov    %r8w,(%rax,%rdx,2)
lea    (%rdi,%rbp,1),%edx
mov    %r8w,(%rax,%rdx,2)
add    %ebp,%edx
lea    (%r15,%rdi,1),%esi
mov    %r8w,(%rax,%rsi,2)
add    %ebp,%edx
add    %r12d,%edi
mov    %r8w,(%rax,%rdi,2)
add    %ebp,%edx
mov    %edx,%edi
add    $0xfffffffc,%ebx
jne    13d0 <make_decode_table+0x2d0>
jmp    1215 <make_decode_table+0x115>
mov    $0x1,%ecx
jmp    1617 <make_decode_table+0x517>
mov    $0x1,%r12b
xor    %r13d,%r13d
lea    -0x1(%r15),%r9d
mov    %r15d,%edi
and    $0x3,%edi
mov    %r15d,%r8d
and    $0xfffffffc,%r8d
mov    %r13d,%ebp
jmp    1440 <make_decode_table+0x340>
nopl   0x0(%rax,%rax,1)
mov    %ecx,%ecx
movw   $0x0,(%rax,%rcx,2)
add    $0x1,%ebp
cmp    %r11d,%ebp
je     14b4 <make_decode_table+0x3b4>
xor    %ecx,%ecx
mov    %ebp,%ebx
cmp    $0x3,%r9d
jb     148f <make_decode_table+0x38f>
xor    %ecx,%ecx
mov    %r8d,%edx
mov    %ebp,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %ebx,%esi
and    $0x1,%esi
shl    $0x2,%esi
lea    (%rsi,%rcx,8),%ecx
mov    %ebx,%esi
and    $0x2,%esi
or     %ecx,%esi
mov    %ebx,%ecx
shr    $0x2,%ecx
and    $0x1,%ecx
or     %esi,%ecx
mov    %ebx,%esi
shr    $0x3,%esi
and    $0x1,%esi
lea    (%rsi,%rcx,2),%ecx
shr    $0x4,%ebx
add    $0xfffffffc,%edx
jne    1460 <make_decode_table+0x360>
test   %edi,%edi
je     1430 <make_decode_table+0x330>
mov    %edi,%edx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %ebx,%esi
and    $0x1,%esi
lea    (%rsi,%rcx,2),%ecx
shr    %ebx
add    $0xffffffff,%edx
jne    14a0 <make_decode_table+0x3a0>
jmp    1430 <make_decode_table+0x330>
mov    -0x54(%rsp),%edi
shl    $0x10,%r13d
shl    $0x10,%r11d
xor    %ecx,%ecx
cmp    $0x10,%r12b
ja     1617 <make_decode_table+0x517>
mov    %r11d,%r8d
mov    %edi,%r9d
lea    -0x1(%r15),%r11d
mov    %r15d,%r14d
and    $0x3,%r14d
mov    %r15d,%ecx
and    $0xfffffffc,%ecx
mov    %ecx,-0x58(%rsp)
mov    $0x8000,%r15d
jmp    150b <make_decode_table+0x40b>
nop
shr    %r15d
lea    0x1(%r12),%edx
xor    %ecx,%ecx
cmp    $0x10,%r12b
mov    %edx,%r12d
mov    -0x54(%rsp),%edi
jae    1614 <make_decode_table+0x514>
test   %edi,%edi
jle    14f0 <make_decode_table+0x3f0>
movzbl %r12b,%ebx
sub    -0x18(%rsp),%ebx
xor    %ebp,%ebp
jmp    153b <make_decode_table+0x43b>
nopl   0x0(%rax,%rax,1)
mov    %edi,%ecx
mov    %bp,(%rax,%rcx,2)
add    %r15d,%r13d
cmp    %r8d,%r13d
ja     160f <make_decode_table+0x50f>
add    $0x1,%rbp
cmp    %r9,%rbp
je     14f0 <make_decode_table+0x3f0>
mov    -0x10(%rsp),%rcx
cmp    %r12b,(%rcx,%rbp,1)
jne    1532 <make_decode_table+0x432>
mov    %r13d,%ecx
shr    $0x10,%ecx
xor    %edi,%edi
cmp    $0x3,%r11d
jb     158f <make_decode_table+0x48f>
xor    %edi,%edi
mov    -0x58(%rsp),%edx
nopw   0x0(%rax,%rax,1)
mov    %ecx,%esi
and    $0x1,%esi
shl    $0x2,%esi
lea    (%rsi,%rdi,8),%esi
mov    %ecx,%edi
and    $0x2,%edi
or     %esi,%edi
mov    %ecx,%esi
shr    $0x2,%esi
and    $0x1,%esi
or     %edi,%esi
mov    %ecx,%edi
shr    $0x3,%edi
and    $0x1,%edi
lea    (%rdi,%rsi,2),%edi
shr    $0x4,%ecx
add    $0xfffffffc,%edx
jne    1560 <make_decode_table+0x460>
test   %r14d,%r14d
je     15af <make_decode_table+0x4af>
mov    %r14d,%edx
nopw   0x0(%rax,%rax,1)
mov    %ecx,%esi
and    $0x1,%esi
lea    (%rsi,%rdi,2),%edi
shr    %ecx
add    $0xffffffff,%edx
jne    15a0 <make_decode_table+0x4a0>
test   %ebx,%ebx
je     1520 <make_decode_table+0x420>
xor    %esi,%esi
mov    $0xf,%ecx
jmp    15dc <make_decode_table+0x4dc>
movzwl %di,%edx
mov    %r13d,%edi
shr    %cl,%edi
and    $0x1,%edi
lea    (%rdi,%rdx,2),%edi
add    $0x1,%esi
add    $0xffffffff,%ecx
cmp    %ebx,%esi
jae    1520 <make_decode_table+0x420>
mov    %edi,%edx
movzwl (%rax,%rdx,2),%edi
test   %di,%di
jne    15c0 <make_decode_table+0x4c0>
lea    (%r10,%r10,1),%edi
movw   $0x0,(%rax,%rdi,2)
lea    (%r10,%r10,1),%edi
add    $0x1,%edi
movw   $0x0,(%rax,%rdi,2)
mov    %r10w,(%rax,%rdx,2)
mov    %r10d,%edi
lea    0x1(%r10),%edx
mov    %edx,%r10d
jmp    15c0 <make_decode_table+0x4c0>
mov    $0x1,%ecx
mov    %r8d,%r11d
cmp    %r11d,%r13d
mov    $0x1,%eax
cmove  %ecx,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ecx,%ecx
cmp    %r11d,%r13d
jne    1639 <make_decode_table+0x539>
mov    %r11d,%r13d
jmp    1617 <make_decode_table+0x517>
jb     1412 <make_decode_table+0x312>
jmp    14b8 <make_decode_table+0x3b8>

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

LLVM IR (-O2):
define i32 @make_decode_table(i32 %0, i32 %1, i8* nocapture %2, i16* nocapture %3) {
%5 = shl nuw i32 1, %1
%6 = lshr i32 %5, 1
%7 = icmp sgt i32 %1, 0
br i1 %7, label %8, label %199
8: ; preds = %4
%9 = icmp sgt i32 %0, 0
%10 = zext i32 %0 to i64
%11 = add i32 %1, -1
%12 = and i32 %1, 3
%13 = icmp ult i32 %11, 3
%14 = and i32 %1, -4
%15 = icmp eq i32 %12, 0
br label %16
16: ; preds = %8, %189
%17 = phi i32 [ 1, %8 ], [ %193, %189 ]
%18 = phi i32 [ 0, %8 ], [ %190, %189 ]
%19 = phi i32 [ %6, %8 ], [ %191, %189 ]
%20 = trunc i32 %17 to i8
br i1 %9, label %21, label %189
21: ; preds = %16
%22 = shl i32 1, %17
%23 = add nsw i32 %19, -1
%24 = and i32 %19, 2147483632
%25 = add nsw i32 %24, -16
%26 = lshr exact i32 %25, 4
%27 = add nuw nsw i32 %26, 1
%28 = icmp ult i32 %19, 16
%29 = icmp ne i32 %17, 0
%30 = and i32 %19, 2147483632
%31 = shl i32 %30, %17
%32 = and i32 %19, 15
%33 = and i32 %27, 3
%34 = icmp ult i32 %25, 48
%35 = and i32 %27, 536870908
%36 = icmp eq i32 %33, 0
%37 = icmp eq i32 %19, %30
br label %38
38: ; preds = %21, %185
%39 = phi i64 [ 0, %21 ], [ %187, %185 ]
%40 = phi i32 [ %18, %21 ], [ %186, %185 ]
%41 = getelementptr inbounds i8, i8* %2, i64 %39
%42 = load i8, i8* %41
%43 = icmp eq i8 %42, %20
br i1 %43, label %44, label %185
44: ; preds = %38
br i1 %13, label %65, label %45
45: ; preds = %44, %45
%46 = phi i32 [ %61, %45 ], [ 0, %44 ]
%47 = phi i32 [ %62, %45 ], [ %40, %44 ]
%48 = phi i32 [ %63, %45 ], [ 0, %44 ]
%49 = shl i32 %46, 3
%50 = shl i32 %47, 2
%51 = and i32 %50, 4
%52 = or i32 %49, %51
%53 = and i32 %47, 2
%54 = or i32 %53, %52
%55 = lshr i32 %47, 2
%56 = and i32 %55, 1
%57 = or i32 %56, %54
%58 = lshr i32 %47, 3
%59 = shl i32 %57, 1
%60 = and i32 %58, 1
%61 = or i32 %60, %59
%62 = lshr i32 %47, 4
%63 = add i32 %48, 4
%64 = icmp eq i32 %63, %14
br i1 %64, label %65, label %45
65: ; preds = %45, %44
%66 = phi i32 [ undef, %44 ], [ %61, %45 ]
%67 = phi i32 [ 0, %44 ], [ %61, %45 ]
%68 = phi i32 [ %40, %44 ], [ %62, %45 ]
br i1 %15, label %79, label %69
69: ; preds = %65, %69
%70 = phi i32 [ %75, %69 ], [ %67, %65 ]
%71 = phi i32 [ %76, %69 ], [ %68, %65 ]
%72 = phi i32 [ %77, %69 ], [ 0, %65 ]
%73 = shl i32 %70, 1
%74 = and i32 %71, 1
%75 = or i32 %74, %73
%76 = lshr i32 %71, 1
%77 = add i32 %72, 1
%78 = icmp eq i32 %77, %12
br i1 %78, label %79, label %69
79: ; preds = %69, %65
%80 = phi i32 [ %66, %65 ], [ %75, %69 ]
%81 = add i32 %40, %19
%82 = icmp ugt i32 %81, %5
br i1 %82, label %364, label %83
83: ; preds = %79
%84 = trunc i64 %39 to i16
br i1 %28, label %148, label %85
85: ; preds = %83
%86 = xor i32 %80, -1
%87 = icmp ugt i32 %23, %86
%88 = or i1 %29, %87
br i1 %88, label %148, label %89
89: ; preds = %85
%90 = add i32 %80, %31
%91 = insertelement <8 x i16> poison, i16 %84, i64 0
%92 = shufflevector <8 x i16> %91, <8 x i16> poison, <8 x i32> zeroinitializer
%93 = insertelement <8 x i16> poison, i16 %84, i64 0
%94 = shufflevector <8 x i16> %93, <8 x i16> poison, <8 x i32> zeroinitializer
br i1 %34, label %132, label %95
95: ; preds = %89, %95
%96 = phi i32 [ %129, %95 ], [ 0, %89 ]
%97 = phi i32 [ %130, %95 ], [ 0, %89 ]
%98 = shl i32 %96, %17
%99 = add i32 %80, %98
%100 = zext i32 %99 to i64
%101 = getelementptr inbounds i16, i16* %3, i64 %100
%102 = bitcast i16* %101 to <8 x i16>*
store <8 x i16> %92, <8 x i16>* %102
%103 = getelementptr inbounds i16, i16* %101, i64 8
%104 = bitcast i16* %103 to <8 x i16>*
store <8 x i16> %94, <8 x i16>* %104
%105 = or i32 %96, 16
%106 = shl i32 %105, %17
%107 = add i32 %80, %106
%108 = zext i32 %107 to i64
%109 = getelementptr inbounds i16, i16* %3, i64 %108
%110 = bitcast i16* %109 to <8 x i16>*
store <8 x i16> %92, <8 x i16>* %110
%111 = getelementptr inbounds i16, i16* %109, i64 8
%112 = bitcast i16* %111 to <8 x i16>*
store <8 x i16> %94, <8 x i16>* %112
%113 = or i32 %96, 32
%114 = shl i32 %113, %17
%115 = add i32 %80, %114
%116 = zext i32 %115 to i64
%117 = getelementptr inbounds i16, i16* %3, i64 %116
%118 = bitcast i16* %117 to <8 x i16>*
store <8 x i16> %92, <8 x i16>* %118
%119 = getelementptr inbounds i16, i16* %117, i64 8
%120 = bitcast i16* %119 to <8 x i16>*
store <8 x i16> %94, <8 x i16>* %120
%121 = or i32 %96, 48
%122 = shl i32 %121, %17
%123 = add i32 %80, %122
%124 = zext i32 %123 to i64
%125 = getelementptr inbounds i16, i16* %3, i64 %124
%126 = bitcast i16* %125 to <8 x i16>*
store <8 x i16> %92, <8 x i16>* %126
%127 = getelementptr inbounds i16, i16* %125, i64 8
%128 = bitcast i16* %127 to <8 x i16>*
store <8 x i16> %94, <8 x i16>* %128
%129 = add nuw i32 %96, 64
%130 = add i32 %97, 4
%131 = icmp eq i32 %130, %35
br i1 %131, label %132, label %95
132: ; preds = %95, %89
%133 = phi i32 [ 0, %89 ], [ %129, %95 ]
br i1 %36, label %147, label %134
134: ; preds = %132, %134
%135 = phi i32 [ %144, %134 ], [ %133, %132 ]
%136 = phi i32 [ %145, %134 ], [ 0, %132 ]
%137 = shl i32 %135, %17
%138 = add i32 %80, %137
%139 = zext i32 %138 to i64
%140 = getelementptr inbounds i16, i16* %3, i64 %139
%141 = bitcast i16* %140 to <8 x i16>*
store <8 x i16> %92, <8 x i16>* %141
%142 = getelementptr inbounds i16, i16* %140, i64 8
%143 = bitcast i16* %142 to <8 x i16>*
store <8 x i16> %94, <8 x i16>* %143
%144 = add nuw i32 %135, 16
%145 = add i32 %136, 1
%146 = icmp eq i32 %145, %33
br i1 %146, label %147, label %134
147: ; preds = %134, %132
br i1 %37, label %185, label %148
148: ; preds = %85, %83, %147
%149 = phi i32 [ %80, %85 ], [ %80, %83 ], [ %90, %147 ]
%150 = phi i32 [ %19, %85 ], [ %19, %83 ], [ %32, %147 ]
%151 = add nsw i32 %150, -1
%152 = and i32 %150, 3
%153 = icmp eq i32 %152, 0
br i1 %153, label %164, label %154
154: ; preds = %148, %154
%155 = phi i32 [ %160, %154 ], [ %149, %148 ]
%156 = phi i32 [ %161, %154 ], [ %150, %148 ]
%157 = phi i32 [ %162, %154 ], [ 0, %148 ]
%158 = zext i32 %155 to i64
%159 = getelementptr inbounds i16, i16* %3, i64 %158
store i16 %84, i16* %159
%160 = add i32 %155, %22
%161 = add i32 %156, -1
%162 = add i32 %157, 1
%163 = icmp eq i32 %162, %152
br i1 %163, label %164, label %154
164: ; preds = %154, %148
%165 = phi i32 [ %149, %148 ], [ %160, %154 ]
%166 = phi i32 [ %150, %148 ], [ %161, %154 ]
%167 = icmp ult i32 %151, 3
br i1 %167, label %185, label %168
168: ; preds = %164, %168
%169 = phi i32 [ %182, %168 ], [ %165, %164 ]
%170 = phi i32 [ %183, %168 ], [ %166, %164 ]
%171 = zext i32 %169 to i64
%172 = getelementptr inbounds i16, i16* %3, i64 %171
store i16 %84, i16* %172
%173 = add i32 %169, %22
%174 = zext i32 %173 to i64
%175 = getelementptr inbounds i16, i16* %3, i64 %174
store i16 %84, i16* %175
%176 = add i32 %173, %22
%177 = zext i32 %176 to i64
%178 = getelementptr inbounds i16, i16* %3, i64 %177
store i16 %84, i16* %178
%179 = add i32 %176, %22
%180 = zext i32 %179 to i64
%181 = getelementptr inbounds i16, i16* %3, i64 %180
store i16 %84, i16* %181
%182 = add i32 %179, %22
%183 = add i32 %170, -4
%184 = icmp eq i32 %183, 0
br i1 %184, label %185, label %168
185: ; preds = %164, %168, %147, %38
%186 = phi i32 [ %40, %38 ], [ %81, %147 ], [ %81, %168 ], [ %81, %164 ]
%187 = add nuw nsw i64 %39, 1
%188 = icmp eq i64 %187, %10
br i1 %188, label %189, label %38
189: ; preds = %185, %16
%190 = phi i32 [ %18, %16 ], [ %186, %185 ]
%191 = lshr i32 %19, 1
%192 = add i8 %20, 1
%193 = zext i8 %192 to i32
%194 = icmp sgt i32 %193, %1
br i1 %194, label %195, label %16
195: ; preds = %189
%196 = icmp eq i32 %190, %5
br i1 %196, label %364, label %197
197: ; preds = %195
%198 = icmp ult i32 %190, %5
br i1 %198, label %199, label %249
199: ; preds = %4, %197
%200 = phi i32 [ %190, %197 ], [ 0, %4 ]
%201 = phi i8 [ %192, %197 ], [ 1, %4 ]
%202 = add i32 %1, -1
%203 = and i32 %1, 3
%204 = icmp ult i32 %202, 3
%205 = and i32 %1, -4
%206 = icmp eq i32 %203, 0
br label %207
207: ; preds = %199, %243
%208 = phi i32 [ %247, %243 ], [ %200, %199 ]
br i1 %204, label %229, label %209
209: ; preds = %207, %209
%210 = phi i32 [ %225, %209 ], [ 0, %207 ]
%211 = phi i32 [ %226, %209 ], [ %208, %207 ]
%212 = phi i32 [ %227, %209 ], [ 0, %207 ]
%213 = shl i32 %210, 3
%214 = shl i32 %211, 2
%215 = and i32 %214, 4
%216 = or i32 %213, %215
%217 = and i32 %211, 2
%218 = or i32 %217, %216
%219 = lshr i32 %211, 2
%220 = and i32 %219, 1
%221 = or i32 %220, %218
%222 = lshr i32 %211, 3
%223 = shl i32 %221, 1
%224 = and i32 %222, 1
%225 = or i32 %224, %223
%226 = lshr i32 %211, 4
%227 = add i32 %212, 4
%228 = icmp eq i32 %227, %205
br i1 %228, label %229, label %209
229: ; preds = %209, %207
%230 = phi i32 [ undef, %207 ], [ %225, %209 ]
%231 = phi i32 [ 0, %207 ], [ %225, %209 ]
%232 = phi i32 [ %208, %207 ], [ %226, %209 ]
br i1 %206, label %243, label %233
233: ; preds = %229, %233
%234 = phi i32 [ %239, %233 ], [ %231, %229 ]
%235 = phi i32 [ %240, %233 ], [ %232, %229 ]
%236 = phi i32 [ %241, %233 ], [ 0, %229 ]
%237 = shl i32 %234, 1
%238 = and i32 %235, 1
%239 = or i32 %238, %237
%240 = lshr i32 %235, 1
%241 = add i32 %236, 1
%242 = icmp eq i32 %241, %203
br i1 %242, label %243, label %233
243: ; preds = %233, %229
%244 = phi i32 [ %230, %229 ], [ %239, %233 ]
%245 = zext i32 %244 to i64
%246 = getelementptr inbounds i16, i16* %3, i64 %245
store i16 0, i16* %246
%247 = add nuw nsw i32 %208, 1
%248 = icmp eq i32 %247, %5
br i1 %248, label %249, label %207
249: ; preds = %243, %197
%250 = phi i32 [ %190, %197 ], [ %200, %243 ]
%251 = phi i8 [ %192, %197 ], [ %201, %243 ]
%252 = shl i32 %250, 16
%253 = shl i32 %5, 16
%254 = icmp ult i8 %251, 17
br i1 %254, label %255, label %364
255: ; preds = %249
%256 = icmp sgt i32 %0, 0
%257 = zext i32 %0 to i64
%258 = add i32 %1, -1
%259 = and i32 %1, 3
%260 = icmp ult i32 %258, 3
%261 = and i32 %1, -4
%262 = icmp eq i32 %259, 0
br label %263
263: ; preds = %255, %358
%264 = phi i32 [ %6, %255 ], [ %360, %358 ]
%265 = phi i32 [ %252, %255 ], [ %359, %358 ]
%266 = phi i32 [ 32768, %255 ], [ %361, %358 ]
%267 = phi i8 [ %251, %255 ], [ %362, %358 ]
br i1 %256, label %268, label %358
268: ; preds = %263
%269 = zext i8 %267 to i32
%270 = sub nsw i32 %269, %1
%271 = icmp eq i32 %270, 0
br label %272
272: ; preds = %268, %353
%273 = phi i64 [ 0, %268 ], [ %356, %353 ]
%274 = phi i32 [ %264, %268 ], [ %355, %353 ]
%275 = phi i32 [ %265, %268 ], [ %354, %353 ]
%276 = getelementptr inbounds i8, i8* %2, i64 %273
%277 = load i8, i8* %276
%278 = icmp eq i8 %277, %267
br i1 %278, label %279, label %353
279: ; preds = %272
%280 = lshr i32 %275, 16
br i1 %260, label %301, label %281
281: ; preds = %279, %281
%282 = phi i32 [ %297, %281 ], [ 0, %279 ]
%283 = phi i32 [ %298, %281 ], [ %280, %279 ]
%284 = phi i32 [ %299, %281 ], [ 0, %279 ]
%285 = shl i32 %282, 3
%286 = shl nuw nsw i32 %283, 2
%287 = and i32 %286, 4
%288 = or i32 %285, %287
%289 = and i32 %283, 2
%290 = or i32 %289, %288
%291 = lshr i32 %283, 2
%292 = and i32 %291, 1
%293 = or i32 %292, %290
%294 = lshr i32 %283, 3
%295 = shl i32 %293, 1
%296 = and i32 %294, 1
%297 = or i32 %296, %295
%298 = lshr i32 %283, 4
%299 = add i32 %284, 4
%300 = icmp eq i32 %299, %261
br i1 %300, label %301, label %281
301: ; preds = %281, %279
%302 = phi i32 [ undef, %279 ], [ %297, %281 ]
%303 = phi i32 [ 0, %279 ], [ %297, %281 ]
%304 = phi i32 [ %280, %279 ], [ %298, %281 ]
br i1 %262, label %315, label %305
305: ; preds = %301, %305
%306 = phi i32 [ %311, %305 ], [ %303, %301 ]
%307 = phi i32 [ %312, %305 ], [ %304, %301 ]
%308 = phi i32 [ %313, %305 ], [ 0, %301 ]
%309 = shl i32 %306, 1
%310 = and i32 %307, 1
%311 = or i32 %310, %309
%312 = lshr i32 %307, 1
%313 = add i32 %308, 1
%314 = icmp eq i32 %313, %259
br i1 %314, label %315, label %305
315: ; preds = %305, %301
%316 = phi i32 [ %302, %301 ], [ %311, %305 ]
br i1 %271, label %345, label %317
317: ; preds = %315, %334
%318 = phi i32 [ %336, %334 ], [ %274, %315 ]
%319 = phi i32 [ %343, %334 ], [ 0, %315 ]
%320 = phi i32 [ %342, %334 ], [ %316, %315 ]
%321 = zext i32 %320 to i64
%322 = getelementptr inbounds i16, i16* %3, i64 %321
%323 = load i16, i16* %322
%324 = icmp eq i16 %323, 0
br i1 %324, label %325, label %334
325: ; preds = %317
%326 = shl i32 %318, 1
%327 = zext i32 %326 to i64
%328 = getelementptr inbounds i16, i16* %3, i64 %327
store i16 0, i16* %328
%329 = or i32 %326, 1
%330 = zext i32 %329 to i64
%331 = getelementptr inbounds i16, i16* %3, i64 %330
store i16 0, i16* %331
%332 = add i32 %318, 1
%333 = trunc i32 %318 to i16
store i16 %333, i16* %322
br label %334
334: ; preds = %325, %317
%335 = phi i16 [ %333, %325 ], [ %323, %317 ]
%336 = phi i32 [ %332, %325 ], [ %318, %317 ]
%337 = zext i16 %335 to i32
%338 = shl nuw nsw i32 %337, 1
%339 = sub i32 15, %319
%340 = lshr i32 %275, %339
%341 = and i32 %340, 1
%342 = or i32 %338, %341
%343 = add nuw i32 %319, 1
%344 = icmp ult i32 %343, %270
br i1 %344, label %317, label %345
345: ; preds = %334, %315
%346 = phi i32 [ %316, %315 ], [ %342, %334 ]
%347 = phi i32 [ %274, %315 ], [ %336, %334 ]
%348 = trunc i64 %273 to i16
%349 = zext i32 %346 to i64
%350 = getelementptr inbounds i16, i16* %3, i64 %349
store i16 %348, i16* %350
%351 = add i32 %275, %266
%352 = icmp ugt i32 %351, %253
br i1 %352, label %364, label %353
353: ; preds = %272, %345
%354 = phi i32 [ %351, %345 ], [ %275, %272 ]
%355 = phi i32 [ %347, %345 ], [ %274, %272 ]
%356 = add nuw nsw i64 %273, 1
%357 = icmp eq i64 %356, %257
br i1 %357, label %358, label %272
358: ; preds = %353, %263
%359 = phi i32 [ %265, %263 ], [ %354, %353 ]
%360 = phi i32 [ %264, %263 ], [ %355, %353 ]
%361 = lshr i32 %266, 1
%362 = add nuw nsw i8 %267, 1
%363 = icmp ult i8 %267, 16
br i1 %363, label %263, label %364
364: ; preds = %79, %358, %345, %249, %195
%365 = phi i32 [ %5, %195 ], [ %253, %249 ], [ %253, %345 ], [ %253, %358 ], [ %5, %79 ]
%366 = phi i32 [ %5, %195 ], [ %252, %249 ], [ %351, %345 ], [ %359, %358 ], [ %81, %79 ]
%367 = phi i32 [ 0, %195 ], [ 0, %249 ], [ 1, %345 ], [ 0, %358 ], [ 1, %79 ]
%368 = icmp eq i32 %366, %365
%369 = select i1 %368, i32 %367, i32 1
ret i32 %369
}