#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef size_t uint8_t;
typedef int uint32_t;
typedef size_t uint16_t;

/* Variables and functions */
size_t crc_xmodem_update(size_t, size_t);
int /*<<< orphan*/ encode_turbo(size_t *, size_t *, size_t *, size_t, int);
uint16_t channel_encode(uint8_t *input, uint8_t *output,
                        uint16_t interleaver_len, uint32_t int_coeff,
                        uint8_t rate) {
  uint16_t full_bytes = (interleaver_len - 16) >> 3;
  uint8_t remaining_bits = (interleaver_len - 16) & 0x7;
  uint16_t crc = 0xFFFF;
  uint8_t i;
  for (i = 0; i < full_bytes; i++)
    crc = crc_xmodem_update(crc, input[i]);
  uint8_t mask = 0;
  for (i = 0; i < remaining_bits; i++)
    mask = (mask >> 1) | 0x80;
  if (mask > 0)
    crc = crc_xmodem_update(crc, mask & input[full_bytes]);
  mask = 1 << (7 - remaining_bits);
  uint8_t *ptr = &input[full_bytes];
  input[full_bytes] = 0;
  input[full_bytes + 1] = 0;
  for (i = 0; i < 16; i++) {
    if (crc & 0x8000)
      *ptr |= mask;
    crc <<= 1;
    mask >>= 1;
    if (mask == 0) {
      mask = 0x80;
      ptr++;
    }
  }
  for (i = 0; i < 4; i++)
    output[i] = 0x55;
  uint32_t sync = 0x9A52E716;
  for (i = 4 + 4 - 1; i >= 4; i--) {
    output[i] = sync & 0xFF;
    sync >>= 8;
  }
  uint16_t size_f = ((int_coeff >> 17) & 0xFC) | (uint16_t)(rate & 0x3);
  size_f |= (size_f << 4) & 0xF00;
  size_f &= 0xF0F;
  for (i = 0; i < 2 * 4; i += 8) {
    if (((size_f & ((uint16_t)1 << (i + 1))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 2))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 3))) > 0))
      size_f |= ((uint16_t)1 << (i + 4));
    if (((size_f & ((uint16_t)1 << (i + 0))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 2))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 3))) > 0))
      size_f |= ((uint16_t)1 << (i + 5));
    if (((size_f & ((uint16_t)1 << (i + 0))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 1))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 3))) > 0))
      size_f |= ((uint16_t)1 << (i + 6));
    if (((size_f & ((uint16_t)1 << (i + 0))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 1))) > 0) ^
        ((size_f & ((uint16_t)1 << (i + 2))) > 0))
      size_f |= ((uint16_t)1 << (i + 7));
  }
  uint8_t addr = 0;
  mask = 0x80;
  for (i = 0; i < 16; i++) {
    if (size_f & (uint16_t)1 << (addr))
      output[4 + 4 + (i >> 3)] |= mask;
    mask >>= 1;
    if (mask == 0)
      mask = 0x80;
    addr = addr + 8;
    if (addr > 15) {
      addr = addr - 16;
      addr += 1;
      if (addr >= 8)
        addr -= 8;
    }
  }
  full_bytes = (interleaver_len + 4) >> 3;
  remaining_bits = (interleaver_len + 4) & 0x7;
  if (remaining_bits > 0)
    full_bytes++;
  encode_turbo(input, &output[4 + 4 + 2], &output[4 + 4 + 2 + full_bytes + 1],
               interleaver_len, int_coeff);
  size_f = 4 * 8 + 4 * 8 + 2 * 8 + 8 * full_bytes + 1 * 8;
  if (rate == 0)
    size_f += (interleaver_len + 4) >> 2;
  else if (rate == 1)
    size_f += ((interleaver_len + 4) * 7) / 13;
  else if (rate == 2)
    size_f += (interleaver_len + 4);
  else
    size_f += 2 * (interleaver_len + 4);
  return size_f;
}


x86 assembly (clang, -O0):
<channel_encode>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x10,%rax
shr    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x10,%rax
and    $0x7,%rax
mov    %rax,-0x38(%rbp)
movq   $0xffff,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    11a6 <channel_encode+0x86>
mov    -0x40(%rbp),%rdi
mov    -0x8(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rsi
call   1030 <crc_xmodem_update@plt>
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    116e <channel_encode+0x4e>
movq   $0x0,-0x50(%rbp)
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x38(%rbp),%rax
jae    11e7 <channel_encode+0xc7>
mov    -0x50(%rbp),%rax
shr    $0x1,%rax
or     $0x80,%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    11b6 <channel_encode+0x96>
cmpq   $0x0,-0x50(%rbp)
jbe    120f <channel_encode+0xef>
mov    -0x40(%rbp),%rdi
mov    -0x50(%rbp),%rsi
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
and    (%rax,%rcx,8),%rsi
call   1030 <crc_xmodem_update@plt>
mov    %rax,-0x40(%rbp)
mov    $0x7,%eax
sub    -0x38(%rbp),%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
cltq
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movq   $0x0,0x8(%rax,%rcx,8)
movq   $0x0,-0x48(%rbp)
cmpq   $0x10,-0x48(%rbp)
jae    12dd <channel_encode+0x1bd>
mov    -0x40(%rbp),%rax
and    $0x8000,%rax
cmp    $0x0,%rax
je     1290 <channel_encode+0x170>
mov    -0x50(%rbp),%rcx
mov    -0x58(%rbp),%rax
or     (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x40(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x50(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    12c7 <channel_encode+0x1a7>
movq   $0x80,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x58(%rbp)
jmp    12cc <channel_encode+0x1ac>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1263 <channel_encode+0x143>
movq   $0x0,-0x48(%rbp)
cmpq   $0x4,-0x48(%rbp)
jae    1311 <channel_encode+0x1f1>
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
movq   $0x55,(%rax,%rcx,8)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    12e5 <channel_encode+0x1c5>
movl   $0x9a52e716,-0x5c(%rbp)
movq   $0x7,-0x48(%rbp)
cmpq   $0x4,-0x48(%rbp)
jb     135c <channel_encode+0x23c>
mov    -0x5c(%rbp),%eax
and    $0xff,%eax
movslq %eax,%rdx
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x5c(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    1320 <channel_encode+0x200>
mov    -0x1c(%rbp),%eax
sar    $0x11,%eax
and    $0xfc,%eax
cltq
mov    -0x28(%rbp),%rcx
and    $0x3,%rcx
or     %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
shl    $0x4,%rax
and    $0xf00,%rax
or     -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
and    $0xf0f,%rax
mov    %rax,-0x68(%rbp)
movq   $0x0,-0x48(%rbp)
cmpq   $0x8,-0x48(%rbp)
jae    1675 <channel_encode+0x555>
mov    -0x68(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    %rdx,%rcx
and    %rcx,%rax
cmp    $0x0,%rax
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0x80(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x2,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0x80(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0x78(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x3,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0x78(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
cmp    $0x0,%eax
je     1452 <channel_encode+0x332>
mov    -0x48(%rbp),%rcx
add    $0x4,%rcx
mov    $0x1,%eax
shl    %cl,%rax
or     -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    $0x0,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    %rdx,%rcx
and    %rcx,%rax
cmp    $0x0,%rax
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0x90(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x2,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0x90(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0x88(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x3,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0x88(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
cmp    $0x0,%eax
je     1501 <channel_encode+0x3e1>
mov    -0x48(%rbp),%rcx
add    $0x5,%rcx
mov    $0x1,%eax
shl    %cl,%rax
or     -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    $0x0,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    %rdx,%rcx
and    %rcx,%rax
cmp    $0x0,%rax
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0xa0(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0xa0(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0x98(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x3,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0x98(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
cmp    $0x0,%eax
je     15b0 <channel_encode+0x490>
mov    -0x48(%rbp),%rcx
add    $0x6,%rcx
mov    $0x1,%eax
shl    %cl,%rax
or     -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    $0x0,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    %rdx,%rcx
and    %rcx,%rax
cmp    $0x0,%rax
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0xb0(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0xb0(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
mov    -0x68(%rbp),%rcx
mov    %rcx,-0xa8(%rbp)
mov    -0x48(%rbp),%rcx
add    $0x2,%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    -0xa8(%rbp),%rcx
and    %rdx,%rcx
cmp    $0x0,%rcx
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %ecx,%eax
cmp    $0x0,%eax
je     165f <channel_encode+0x53f>
mov    -0x48(%rbp),%rcx
add    $0x7,%rcx
mov    $0x1,%eax
shl    %cl,%rax
or     -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    1664 <channel_encode+0x544>
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
jmp    13a4 <channel_encode+0x284>
movq   $0x0,-0x70(%rbp)
movq   $0x80,-0x50(%rbp)
movq   $0x0,-0x48(%rbp)
cmpq   $0x10,-0x48(%rbp)
jae    1754 <channel_encode+0x634>
mov    -0x68(%rbp),%rax
mov    -0x70(%rbp),%rcx
mov    $0x1,%edx
shl    %cl,%rdx
mov    %rdx,%rcx
and    %rcx,%rax
cmp    $0x0,%rax
je     16d4 <channel_encode+0x5b4>
mov    -0x50(%rbp),%rdx
mov    -0x10(%rbp),%rax
mov    -0x48(%rbp),%rcx
shr    $0x3,%rcx
add    $0x8,%rcx
or     (%rax,%rcx,8),%rdx
mov    %rdx,(%rax,%rcx,8)
mov    -0x50(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    16f3 <channel_encode+0x5d3>
movq   $0x80,-0x50(%rbp)
mov    -0x70(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x70(%rbp)
cmpq   $0xf,-0x70(%rbp)
jbe    173e <channel_encode+0x61e>
mov    -0x70(%rbp),%rax
sub    $0x10,%rax
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x70(%rbp)
cmpq   $0x8,-0x70(%rbp)
jb     1739 <channel_encode+0x619>
mov    -0x70(%rbp),%rax
sub    $0x8,%rax
mov    %rax,-0x70(%rbp)
jmp    173e <channel_encode+0x61e>
jmp    1743 <channel_encode+0x623>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    168d <channel_encode+0x56d>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
shr    $0x3,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
and    $0x7,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jbe    178b <channel_encode+0x66b>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
add    $0x50,%rsi
mov    -0x10(%rbp),%rdx
mov    -0x30(%rbp),%rax
add    $0xa,%rax
add    $0x1,%rax
shl    $0x3,%rax
add    %rax,%rdx
mov    -0x18(%rbp),%rcx
mov    -0x1c(%rbp),%r8d
call   1040 <encode_turbo@plt>
mov    -0x30(%rbp),%rax
shl    $0x3,%rax
add    $0x50,%rax
add    $0x8,%rax
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x28(%rbp)
jne    17f3 <channel_encode+0x6d3>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
shr    $0x2,%rax
add    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    185f <channel_encode+0x73f>
cmpq   $0x1,-0x28(%rbp)
jne    1821 <channel_encode+0x701>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
imul   $0x7,%rax,%rax
mov    $0xd,%ecx
xor    %edx,%edx
div    %rcx
add    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    185a <channel_encode+0x73a>
cmpq   $0x2,-0x28(%rbp)
jne    1841 <channel_encode+0x721>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
add    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    1855 <channel_encode+0x735>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
shl    $0x1,%rax
add    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
jmp    185a <channel_encode+0x73a>
jmp    185f <channel_encode+0x73f>
mov    -0x68(%rbp),%rax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<channel_encode>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r8,0x10(%rsp)
mov    %ecx,0x4(%rsp)
mov    %rsi,%r13
mov    %rdi,%r9
lea    -0x10(%rdx),%rcx
mov    %rcx,%r14
shr    $0x3,%r14
mov    %rdx,0x8(%rsp)
mov    %edx,%ebx
and    $0x7,%ebx
mov    $0xffff,%eax
cmp    $0x8,%rcx
jb     119b <channel_encode+0x7b>
cmp    $0x2,%r14
mov    $0x1,%r15d
cmovae %r14,%r15
mov    $0xffff,%eax
xor    %r12d,%r12d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    (%r9,%r12,8),%rsi
mov    %rax,%rdi
mov    %r9,%rbp
call   1030 <crc_xmodem_update@plt>
mov    %rbp,%r9
add    $0x1,%r12
cmp    %r12,%r15
jne    1180 <channel_encode+0x60>
cmp    $0x6,%rbx
ja     11bd <channel_encode+0x9d>
mov    $0x80,%esi
lea    0xe83(%rip),%rcx
movslq (%rcx,%rbx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
mov    $0xc0,%esi
jmp    11de <channel_encode+0xbe>
mov    $0xfe,%esi
jmp    11de <channel_encode+0xbe>
mov    $0xe0,%esi
jmp    11de <channel_encode+0xbe>
mov    $0xf0,%esi
jmp    11de <channel_encode+0xbe>
mov    $0xf8,%esi
jmp    11de <channel_encode+0xbe>
mov    $0xfc,%esi
and    (%r9,%r14,8),%esi
mov    %rax,%rdi
mov    %r9,%rbp
call   1030 <crc_xmodem_update@plt>
mov    %rbp,%r9
xor    $0x7,%bl
mov    $0x1,%esi
mov    %ebx,%ecx
shl    %cl,%esi
lea    (%r9,%r14,8),%rdi
xorps  %xmm0,%xmm0
movups %xmm0,(%r9,%r14,8)
mov    $0x10,%ecx
mov    $0x80,%edx
mov    0x10(%rsp),%r15
mov    0x4(%rsp),%r8d
jmp    1242 <channel_encode+0x122>
xchg   %ax,%ax
shl    $0x2,%rax
mov    %rbx,%rsi
shr    %rsi
xor    %ebp,%ebp
cmp    $0x2,%rbx
setb   %bpl
cmovb  %rdx,%rsi
lea    (%rdi,%rbp,8),%rdi
add    $0xfffffffffffffffe,%rcx
je     1270 <channel_encode+0x150>
test   $0x8000,%eax
je     124c <channel_encode+0x12c>
or     %rsi,(%rdi)
mov    %rsi,%rbx
shr    %rbx
xor    %ebp,%ebp
cmp    $0x2,%rsi
setb   %bpl
cmovb  %rdx,%rbx
lea    (%rdi,%rbp,8),%rdi
test   $0x4000,%eax
je     1220 <channel_encode+0x100>
or     %rbx,(%rdi)
jmp    1220 <channel_encode+0x100>
movaps 0xd89(%rip),%xmm0
movups %xmm0,0x0(%r13)
movups %xmm0,0x10(%r13)
movaps 0xd88(%rip),%xmm0
movups %xmm0,0x30(%r13)
movaps 0xd8c(%rip),%xmm0
movups %xmm0,0x20(%r13)
mov    %r8d,%edx
shr    $0x11,%edx
and    $0xfc,%edx
mov    %r15d,%eax
and    $0x3,%eax
or     %edx,%eax
shl    $0x4,%edx
or     %eax,%edx
and    $0xf0f,%edx
mov    %r15d,%eax
and    $0x2,%eax
shr    %eax
mov    %r8d,%edi
shr    $0x13,%edi
mov    %edi,%ebx
and    $0x1,%bl
xor    %al,%bl
mov    %r8d,%esi
shr    $0x14,%esi
mov    %esi,%ecx
and    $0x1,%cl
xor    %bl,%cl
movzbl %cl,%ecx
shl    $0x4,%rcx
or     %rdx,%rcx
mov    %r15d,%edx
xor    %dil,%dl
xor    %sil,%dl
movzbl %dl,%edx
and    $0x1,%edx
shl    $0x5,%rdx
or     %rcx,%rdx
xor    %r15b,%al
xor    %al,%sil
movzbl %sil,%ecx
and    $0x1,%ecx
shl    $0x6,%rcx
xor    %dil,%al
movzbl %al,%eax
and    $0x1,%eax
shl    $0x7,%rax
or     %rcx,%rax
or     %rdx,%rax
mov    $0x80,%edx
xor    %ecx,%ecx
mov    $0x80,%edi
xor    %ebx,%ebx
jmp    136b <channel_encode+0x24b>
xchg   %ax,%ax
mov    %rdi,%rsi
shr    %rsi
cmp    $0x2,%rdi
cmovb  %rdx,%rsi
lea    0x8(%rcx),%rdi
add    $0xfffffffffffffff9,%rcx
cmp    $0x8,%rcx
mov    $0x0,%ebp
cmovb  %rcx,%rbp
cmp    $0x10,%rdi
cmovb  %rdi,%rbp
add    $0x1,%rbx
mov    %rbp,%rcx
mov    %rsi,%rdi
cmp    $0x10,%rbx
je     1385 <channel_encode+0x265>
mov    $0x1,%ebp
shl    %cl,%rbp
test   %eax,%ebp
je     1330 <channel_encode+0x210>
mov    %rbx,%rsi
and    $0xfffffffffffffff8,%rsi
or     %rdi,0x40(%rsi,%r13,1)
jmp    1330 <channel_encode+0x210>
mov    0x8(%rsp),%rcx
lea    0x4(%rcx),%r14
mov    %r14,%rbx
shr    $0x3,%rbx
mov    %r14d,%eax
and    $0x7,%eax
cmp    $0x1,%rax
sbb    $0xffffffffffffffff,%rbx
lea    0x58(,%rbx,8),%rdx
add    %r13,%rdx
add    $0x50,%r13
mov    %r9,%rdi
mov    %r13,%rsi
call   1040 <encode_turbo@plt>
cmp    $0x2,%r15
je     13f8 <channel_encode+0x2d8>
cmp    $0x1,%r15
je     13d4 <channel_encode+0x2b4>
test   %r15,%r15
jne    13f5 <channel_encode+0x2d5>
shr    $0x2,%r14
jmp    13f8 <channel_encode+0x2d8>
lea    0x0(,%r14,8),%rax
sub    %r14,%rax
movabs $0x4ec4ec4ec4ec4ec5,%rcx
ec c4 4e
mul    %rcx
mov    %rdx,%r14
shr    $0x2,%r14
jmp    13f8 <channel_encode+0x2d8>
add    %r14,%r14
lea    (%r14,%rbx,8),%rax
add    $0x58,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i64 @channel_encode(i64* %0, i64* %1, i64 %2, i32 %3, i64 %4) {
%6 = add i64 %2, -16
%7 = lshr i64 %6, 3
%8 = and i64 %2, 7
%9 = icmp ult i64 %6, 8
br i1 %9, label %12, label %10
10: ; preds = %5
%11 = call i64 @llvm.umax.i64(i64 %7, i64 1)
br label %14
12: ; preds = %14, %5
%13 = phi i64 [ 65535, %5 ], [ %19, %14 ]
switch i64 %8, label %22 [
i64 0, label %34
i64 1, label %28
i64 2, label %23
i64 3, label %24
i64 4, label %25
i64 5, label %26
i64 6, label %27
]
14: ; preds = %10, %14
%15 = phi i64 [ %20, %14 ], [ 0, %10 ]
%16 = phi i64 [ %19, %14 ], [ 65535, %10 ]
%17 = getelementptr inbounds i64, i64* %0, i64 %15
%18 = load i64, i64* %17
%19 = tail call i64 @crc_xmodem_update(i64 %16, i64 %18)
%20 = add nuw nsw i64 %15, 1
%21 = icmp eq i64 %20, %11
br i1 %21, label %12, label %14
22: ; preds = %12
br label %28
23: ; preds = %12
br label %28
24: ; preds = %12
br label %28
25: ; preds = %12
br label %28
26: ; preds = %12
br label %28
27: ; preds = %12
br label %28
28: ; preds = %12, %27, %26, %25, %24, %23, %22
%29 = phi i64 [ 254, %22 ], [ 128, %12 ], [ 192, %23 ], [ 224, %24 ], [ 240, %25 ], [ 248, %26 ], [ 252, %27 ]
%30 = getelementptr inbounds i64, i64* %0, i64 %7
%31 = load i64, i64* %30
%32 = and i64 %31, %29
%33 = tail call i64 @crc_xmodem_update(i64 %13, i64 %32)
br label %34
34: ; preds = %12, %28
%35 = phi i64 [ %33, %28 ], [ %13, %12 ]
%36 = trunc i64 %8 to i32
%37 = xor i32 %36, 7
%38 = shl nuw i32 1, %37
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds i64, i64* %0, i64 %7
%41 = bitcast i64* %40 to <2 x i64>*
store <2 x i64> zeroinitializer, <2 x i64>* %41
br label %42
42: ; preds = %64, %34
%43 = phi i64* [ %40, %34 ], [ %69, %64 ]
%44 = phi i64 [ %39, %34 ], [ %67, %64 ]
%45 = phi i64 [ 0, %34 ], [ %70, %64 ]
%46 = phi i64 [ %35, %34 ], [ %53, %64 ]
%47 = and i64 %46, 32768
%48 = icmp eq i64 %47, 0
br i1 %48, label %52, label %49
49: ; preds = %42
%50 = load i64, i64* %43
%51 = or i64 %50, %44
store i64 %51, i64* %43
br label %52
52: ; preds = %49, %42
%53 = shl i64 %46, 2
%54 = lshr i64 %44, 1
%55 = icmp ult i64 %44, 2
%56 = select i1 %55, i64 128, i64 %54
%57 = zext i1 %55 to i64
%58 = getelementptr i64, i64* %43, i64 %57
%59 = and i64 %46, 16384
%60 = icmp eq i64 %59, 0
br i1 %60, label %64, label %61
61: ; preds = %52
%62 = load i64, i64* %58
%63 = or i64 %62, %56
store i64 %63, i64* %58
br label %64
64: ; preds = %61, %52
%65 = lshr i64 %56, 1
%66 = icmp ult i64 %56, 2
%67 = select i1 %66, i64 128, i64 %65
%68 = zext i1 %66 to i64
%69 = getelementptr i64, i64* %58, i64 %68
%70 = add nuw nsw i64 %45, 2
%71 = icmp eq i64 %70, 16
br i1 %71, label %72, label %42
72: ; preds = %64
%73 = bitcast i64* %1 to <2 x i64>*
store <2 x i64> <i64 85, i64 85>, <2 x i64>* %73
%74 = getelementptr inbounds i64, i64* %1, i64 2
%75 = bitcast i64* %74 to <2 x i64>*
store <2 x i64> <i64 85, i64 85>, <2 x i64>* %75
%76 = getelementptr inbounds i64, i64* %1, i64 6
%77 = bitcast i64* %76 to <2 x i64>*
store <2 x i64> <i64 231, i64 22>, <2 x i64>* %77
%78 = getelementptr inbounds i64, i64* %1, i64 4
%79 = bitcast i64* %78 to <2 x i64>*
store <2 x i64> <i64 154, i64 82>, <2 x i64>* %79
%80 = lshr i32 %3, 17
%81 = and i32 %80, 252
%82 = zext i32 %81 to i64
%83 = and i64 %4, 3
%84 = or i64 %83, %82
%85 = shl nuw nsw i64 %82, 4
%86 = or i64 %84, %85
%87 = and i64 %86, 3855
%88 = and i64 %4, 2
%89 = icmp ne i64 %88, 0
%90 = and i64 %82, 4
%91 = icmp ne i64 %90, 0
%92 = xor i1 %89, %91
%93 = and i64 %82, 8
%94 = icmp ne i64 %93, 0
%95 = xor i1 %94, %92
%96 = select i1 %95, i64 16, i64 0
%97 = or i64 %96, %87
%98 = and i64 %4, 1
%99 = icmp ne i64 %98, 0
%100 = xor i1 %99, %91
%101 = xor i1 %94, %100
%102 = select i1 %101, i64 32, i64 0
%103 = or i64 %102, %97
%104 = xor i1 %99, %89
%105 = xor i1 %94, %104
%106 = select i1 %105, i64 64, i64 0
%107 = or i64 %106, %103
%108 = xor i1 %91, %104
%109 = select i1 %108, i64 128, i64 0
%110 = or i64 %109, %107
br label %111
111: ; preds = %72, %124
%112 = phi i64 [ 0, %72 ], [ %133, %124 ]
%113 = phi i64 [ 128, %72 ], [ %127, %124 ]
%114 = phi i64 [ 0, %72 ], [ %134, %124 ]
%115 = shl nuw i64 1, %112
%116 = and i64 %115, %110
%117 = icmp eq i64 %116, 0
br i1 %117, label %124, label %118
118: ; preds = %111
%119 = lshr i64 %114, 3
%120 = add nuw nsw i64 %119, 8
%121 = getelementptr inbounds i64, i64* %1, i64 %120
%122 = load i64, i64* %121
%123 = or i64 %122, %113
store i64 %123, i64* %121
br label %124
124: ; preds = %118, %111
%125 = lshr i64 %113, 1
%126 = icmp ult i64 %113, 2
%127 = select i1 %126, i64 128, i64 %125
%128 = add i64 %112, 8
%129 = icmp ugt i64 %128, 15
%130 = add i64 %112, -7
%131 = icmp ugt i64 %130, 7
%132 = select i1 %131, i64 0, i64 %130
%133 = select i1 %129, i64 %132, i64 %128
%134 = add nuw nsw i64 %114, 1
%135 = icmp eq i64 %134, 16
br i1 %135, label %136, label %111
136: ; preds = %124
%137 = add i64 %2, 4
%138 = lshr i64 %137, 3
%139 = and i64 %137, 7
%140 = icmp ne i64 %139, 0
%141 = zext i1 %140 to i64
%142 = add nuw nsw i64 %138, %141
%143 = getelementptr inbounds i64, i64* %1, i64 10
%144 = add nuw nsw i64 %142, 11
%145 = getelementptr inbounds i64, i64* %1, i64 %144
%146 = tail call i32 @encode_turbo(i64* %0, i64* %143, i64* %145, i64 %2, i32 %3)
switch i64 %4, label %152 [
i64 0, label %147
i64 1, label %149
i64 2, label %154
]
147: ; preds = %136
%148 = lshr i64 %137, 2
br label %154
149: ; preds = %136
%150 = mul i64 %137, 7
%151 = udiv i64 %150, 13
br label %154
152: ; preds = %136
%153 = shl i64 %137, 1
br label %154
154: ; preds = %136, %149, %152, %147
%155 = phi i64 [ %148, %147 ], [ %151, %149 ], [ %153, %152 ], [ %137, %136 ]
%156 = shl i64 %142, 3
%157 = add i64 %156, 88
%158 = add i64 %157, %155
ret i64 %158
}