#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 int uint8_t;
typedef int uint32_t;
typedef int ssize_t;
typedef int int32_t;

/* Variables and functions */
int FE_DOWNWARD;
int FE_TONEAREST;
int FE_TOWARDZERO;
int FE_UPWARD;
int fegetround();
ssize_t imcd_float24_encode(const uint8_t *src, const ssize_t srcsize,
                            uint8_t *dst, const char byteorder, int rounding) {
  ssize_t i;
  uint8_t s0, s1, s2, s3, f0, f1, f2;
  uint8_t sign;
  uint8_t roundbit;
  uint32_t mantissa;
  int32_t exponent;
  if (srcsize < 4) {
    return 0;
  }
  if (rounding < 0) {
    rounding = fegetround();
  }
  if ((rounding != FE_TONEAREST) && (rounding != FE_TOWARDZERO) &&
      (rounding != FE_UPWARD) && (rounding != FE_DOWNWARD)) {
    rounding = FE_TONEAREST;
  }
  for (i = 0; i < srcsize; i += 4) {
    s3 = *src++;
    s2 = *src++;
    s1 = *src++;
    s0 = *src++;
    sign = s0 & 0x80;
    exponent = ((s0 & 0x7F) << 1) | ((s1 & 0x80) >> 7);
    mantissa = s1 & 0x7F;
    mantissa <<= 8;
    mantissa |= s2;
    mantissa <<= 8;
    mantissa |= s3;
    f0 = sign;
    if ((exponent == 0) & (mantissa == 0)) {
      f1 = 0;
      f2 = 0;
    } else if (exponent == 0xFF) {
      f0 |= 0x7F;
      f1 = (mantissa == 0) ? 0x00 : 0x80;
      f2 = 0;
    } else if (exponent == 0) {
      if (((rounding == FE_DOWNWARD) && sign) ||
          ((rounding == FE_UPWARD) && (!sign))) {
        f1 = 0;
        f2 = 0x01;
      } else {
        f1 = 0;
        f2 = 0;
      }
    } else {
      roundbit = 0;
      exponent = exponent - 127 + 63;
      if (exponent >= 0x7F) {
        f0 |= 0x7F;
        f1 = 0;
        f2 = 0;
      } else if (exponent <= 0) {
        int32_t n = 8 - exponent;
        mantissa |= 0x800000;
        if (n < 32) {
          f2 = (mantissa >> n) & 0xFF;
          f1 = (mantissa >> (n + 8)) & 0xFF;
          if (n <= 24) {
            uint32_t mask = 0xFFFFFFu & ~((0xFFFFFFu >> n) << n);
            uint32_t firstbit = (mask >> (n - 1)) << (n - 1);
            uint32_t trail = mantissa & mask;
            roundbit = trail && (((rounding == FE_TONEAREST) &&
                                  ((trail > firstbit) ||
                                   ((trail == firstbit) && (f2 & 0x01)))) ||
                                 ((rounding == FE_DOWNWARD) && sign) ||
                                 ((rounding == FE_UPWARD) && !sign));
          } else {
            roundbit = (s3 &= 0x7F) && (((rounding == FE_DOWNWARD) && sign) ||
                                        ((rounding == FE_UPWARD) && !sign));
          }
        } else {
          f1 = 0x00;
          f2 = 0x00;
        }
      } else {
        uint32_t trail = s3 & 0x7F;
        f0 |= exponent & 0x7F;
        f1 = ((s1 & 0x7F) << 1) | ((s2 & 0x80) >> 7);
        f2 = ((s2 & 0x7F) << 1) | ((s3 & 0x80) >> 7);
        roundbit =
            trail && (((rounding == FE_TONEAREST) &&
                       ((trail > 0x40) || ((trail == 0x40) && (s3 & 0x80)))) ||
                      ((rounding == FE_DOWNWARD) && sign) ||
                      ((rounding == FE_UPWARD) && !sign));
      }
      if (roundbit) {
        if (f2 == 0xFF) {
          f2 = 0x00;
          if (f1 == 0xFF) {
            f1 = 0x00;
          } else {
            f1 += 1;
          }
        } else {
          f2 += 1;
        }
      }
    }
    if (byteorder == '<') {
      *dst++ = f2;
      *dst++ = f1;
      *dst++ = f0;
    } else {
      *dst++ = f0;
      *dst++ = f1;
      *dst++ = f2;
    }
  }
  return (srcsize / 4) * 4;
}


x86 assembly (clang, -O0):
<imcd_float24_encode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %cl,%al
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %al,-0x21(%rbp)
mov    %r8d,-0x28(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    1145 <imcd_float24_encode+0x35>
movl   $0x0,-0x4(%rbp)
jmp    174b <imcd_float24_encode+0x63b>
cmpl   $0x0,-0x28(%rbp)
jge    1159 <imcd_float24_encode+0x49>
mov    $0x0,%al
call   1030 <fegetround@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    0x2e7d(%rip),%rcx
cmp    (%rcx),%eax
je     11ad <imcd_float24_encode+0x9d>
mov    -0x28(%rbp),%eax
mov    0x2e73(%rip),%rcx
cmp    (%rcx),%eax
je     11ad <imcd_float24_encode+0x9d>
mov    -0x28(%rbp),%eax
mov    0x2e41(%rip),%rcx
cmp    (%rcx),%eax
je     11ad <imcd_float24_encode+0x9d>
mov    -0x28(%rbp),%eax
mov    0x2e3f(%rip),%rcx
cmp    (%rcx),%eax
je     11ad <imcd_float24_encode+0x9d>
mov    0x2e38(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    173a <imcd_float24_encode+0x62a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
and    $0x80,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x30(%rbp),%eax
and    $0x7f,%eax
shl    $0x1,%eax
mov    -0x34(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
or     %ecx,%eax
mov    %eax,-0x58(%rbp)
mov    -0x34(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x54(%rbp)
mov    -0x38(%rbp),%eax
or     -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x54(%rbp)
mov    -0x3c(%rbp),%eax
or     -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,-0x58(%rbp)
sete   %al
and    $0x1,%al
movzbl %al,%eax
cmpl   $0x0,-0x54(%rbp)
sete   %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     129f <imcd_float24_encode+0x18f>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
jmp    169d <imcd_float24_encode+0x58d>
cmpl   $0xff,-0x58(%rbp)
jne    12d4 <imcd_float24_encode+0x1c4>
mov    -0x40(%rbp),%eax
or     $0x7f,%eax
mov    %eax,-0x40(%rbp)
mov    -0x54(%rbp),%edx
mov    $0x80,%eax
xor    %ecx,%ecx
cmp    $0x0,%edx
cmove  %ecx,%eax
mov    %eax,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
jmp    1698 <imcd_float24_encode+0x588>
cmpl   $0x0,-0x58(%rbp)
jne    133c <imcd_float24_encode+0x22c>
mov    -0x28(%rbp),%eax
mov    0x2cf0(%rip),%rcx
cmp    (%rcx),%eax
jne    12fa <imcd_float24_encode+0x1ea>
cmpl   $0x0,-0x4c(%rbp)
jne    1316 <imcd_float24_encode+0x206>
mov    -0x28(%rbp),%eax
mov    0x2cc4(%rip),%rcx
cmp    (%rcx),%eax
jne    1329 <imcd_float24_encode+0x219>
cmpl   $0x0,-0x4c(%rbp)
jne    1329 <imcd_float24_encode+0x219>
movl   $0x0,-0x44(%rbp)
movl   $0x1,-0x48(%rbp)
jmp    1337 <imcd_float24_encode+0x227>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
jmp    1693 <imcd_float24_encode+0x583>
movl   $0x0,-0x50(%rbp)
mov    -0x58(%rbp),%eax
sub    $0x7f,%eax
add    $0x3f,%eax
mov    %eax,-0x58(%rbp)
cmpl   $0x7f,-0x58(%rbp)
jl     1375 <imcd_float24_encode+0x265>
mov    -0x40(%rbp),%eax
or     $0x7f,%eax
mov    %eax,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
jmp    163b <imcd_float24_encode+0x52b>
cmpl   $0x0,-0x58(%rbp)
jg     1541 <imcd_float24_encode+0x431>
mov    $0x8,%eax
sub    -0x58(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x54(%rbp),%eax
or     $0x800000,%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x20,-0x5c(%rbp)
jge    152e <imcd_float24_encode+0x41e>
mov    -0x54(%rbp),%eax
mov    -0x5c(%rbp),%ecx
sar    %cl,%eax
and    $0xff,%eax
mov    %eax,-0x48(%rbp)
mov    -0x54(%rbp),%eax
mov    -0x5c(%rbp),%ecx
add    $0x8,%ecx
sar    %cl,%eax
and    $0xff,%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x18,-0x5c(%rbp)
jg     14b7 <imcd_float24_encode+0x3a7>
mov    -0x5c(%rbp),%ecx
mov    $0xffffff,%eax
shr    %cl,%eax
mov    -0x5c(%rbp),%ecx
shl    %cl,%eax
xor    $0xffffffff,%eax
and    $0xffffff,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
sar    %cl,%eax
mov    -0x5c(%rbp),%ecx
sub    $0x1,%ecx
shl    %cl,%eax
mov    %eax,-0x64(%rbp)
mov    -0x54(%rbp),%eax
and    -0x60(%rbp),%eax
mov    %eax,-0x68(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x68(%rbp)
mov    %al,-0x6d(%rbp)
je     14a7 <imcd_float24_encode+0x397>
mov    -0x28(%rbp),%eax
mov    0x2bc2(%rip),%rcx
cmp    (%rcx),%eax
jne    1457 <imcd_float24_encode+0x347>
mov    -0x68(%rbp),%ecx
mov    $0x1,%al
cmp    -0x64(%rbp),%ecx
mov    %al,-0x6e(%rbp)
jg     14a1 <imcd_float24_encode+0x391>
mov    -0x68(%rbp),%eax
cmp    -0x64(%rbp),%eax
jne    1457 <imcd_float24_encode+0x347>
mov    -0x48(%rbp),%ecx
and    $0x1,%ecx
mov    $0x1,%al
cmp    $0x0,%ecx
mov    %al,-0x6e(%rbp)
jne    14a1 <imcd_float24_encode+0x391>
mov    -0x28(%rbp),%eax
mov    0x2b77(%rip),%rcx
cmp    (%rcx),%eax
jne    1478 <imcd_float24_encode+0x368>
mov    $0x1,%al
cmpl   $0x0,-0x4c(%rbp)
mov    %al,-0x6e(%rbp)
jne    14a1 <imcd_float24_encode+0x391>
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
mov    0x2b44(%rip),%rdx
cmp    (%rdx),%ecx
mov    %al,-0x6f(%rbp)
jne    149b <imcd_float24_encode+0x38b>
cmpl   $0x0,-0x4c(%rbp)
setne  %al
xor    $0xff,%al
mov    %al,-0x6f(%rbp)
mov    -0x6f(%rbp),%al
mov    %al,-0x6e(%rbp)
mov    -0x6e(%rbp),%al
mov    %al,-0x6d(%rbp)
mov    -0x6d(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x50(%rbp)
jmp    1529 <imcd_float24_encode+0x419>
mov    -0x3c(%rbp),%ecx
and    $0x7f,%ecx
mov    %ecx,-0x3c(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x70(%rbp)
je     151e <imcd_float24_encode+0x40e>
mov    -0x28(%rbp),%eax
mov    0x2b00(%rip),%rcx
cmp    (%rcx),%eax
jne    14ef <imcd_float24_encode+0x3df>
mov    $0x1,%al
cmpl   $0x0,-0x4c(%rbp)
mov    %al,-0x71(%rbp)
jne    1518 <imcd_float24_encode+0x408>
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
mov    0x2acd(%rip),%rdx
cmp    (%rdx),%ecx
mov    %al,-0x72(%rbp)
jne    1512 <imcd_float24_encode+0x402>
cmpl   $0x0,-0x4c(%rbp)
setne  %al
xor    $0xff,%al
mov    %al,-0x72(%rbp)
mov    -0x72(%rbp),%al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
mov    %al,-0x70(%rbp)
mov    -0x70(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x50(%rbp)
jmp    153c <imcd_float24_encode+0x42c>
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
jmp    1636 <imcd_float24_encode+0x526>
mov    -0x3c(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x58(%rbp),%eax
and    $0x7f,%eax
or     -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x34(%rbp),%eax
and    $0x7f,%eax
shl    $0x1,%eax
mov    -0x38(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
or     %ecx,%eax
mov    %eax,-0x44(%rbp)
mov    -0x38(%rbp),%eax
and    $0x7f,%eax
shl    $0x1,%eax
mov    -0x3c(%rbp),%ecx
and    $0x80,%ecx
sar    $0x7,%ecx
or     %ecx,%eax
mov    %eax,-0x48(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x6c(%rbp)
mov    %al,-0x73(%rbp)
je     162b <imcd_float24_encode+0x51b>
mov    -0x28(%rbp),%eax
mov    0x2a3d(%rip),%rcx
cmp    (%rcx),%eax
jne    15db <imcd_float24_encode+0x4cb>
mov    $0x1,%al
cmpl   $0x40,-0x6c(%rbp)
mov    %al,-0x74(%rbp)
jg     1625 <imcd_float24_encode+0x515>
cmpl   $0x40,-0x6c(%rbp)
jne    15db <imcd_float24_encode+0x4cb>
mov    -0x3c(%rbp),%ecx
and    $0x80,%ecx
mov    $0x1,%al
cmp    $0x0,%ecx
mov    %al,-0x74(%rbp)
jne    1625 <imcd_float24_encode+0x515>
mov    -0x28(%rbp),%eax
mov    0x29f3(%rip),%rcx
cmp    (%rcx),%eax
jne    15fc <imcd_float24_encode+0x4ec>
mov    $0x1,%al
cmpl   $0x0,-0x4c(%rbp)
mov    %al,-0x74(%rbp)
jne    1625 <imcd_float24_encode+0x515>
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
mov    0x29c0(%rip),%rdx
cmp    (%rdx),%ecx
mov    %al,-0x75(%rbp)
jne    161f <imcd_float24_encode+0x50f>
cmpl   $0x0,-0x4c(%rbp)
setne  %al
xor    $0xff,%al
mov    %al,-0x75(%rbp)
mov    -0x75(%rbp),%al
mov    %al,-0x74(%rbp)
mov    -0x74(%rbp),%al
mov    %al,-0x73(%rbp)
mov    -0x73(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x50(%rbp)
jmp    163b <imcd_float24_encode+0x52b>
cmpl   $0x0,-0x50(%rbp)
je     168e <imcd_float24_encode+0x57e>
cmpl   $0xff,-0x48(%rbp)
jne    1680 <imcd_float24_encode+0x570>
movl   $0x0,-0x48(%rbp)
cmpl   $0xff,-0x44(%rbp)
jne    1672 <imcd_float24_encode+0x562>
movl   $0x0,-0x44(%rbp)
jmp    167b <imcd_float24_encode+0x56b>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1689 <imcd_float24_encode+0x579>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    168e <imcd_float24_encode+0x57e>
jmp    1693 <imcd_float24_encode+0x583>
jmp    1698 <imcd_float24_encode+0x588>
jmp    169d <imcd_float24_encode+0x58d>
movsbl -0x21(%rbp),%eax
cmp    $0x3c,%eax
jne    16eb <imcd_float24_encode+0x5db>
mov    -0x48(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
mov    -0x44(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
mov    -0x40(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
jmp    1727 <imcd_float24_encode+0x617>
mov    -0x40(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
mov    -0x44(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
mov    -0x48(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
jmp    172c <imcd_float24_encode+0x61c>
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    11b4 <imcd_float24_encode+0xa4>
mov    -0x14(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
shl    $0x2,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<imcd_float24_encode>:
xor    %eax,%eax
cmp    $0x4,%esi
jl     147a <imcd_float24_encode+0x36a>
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %ecx,%r14d
mov    %rdx,%rbp
mov    %esi,%r15d
mov    %rdi,%r13
test   %r8d,%r8d
jns    1141 <imcd_float24_encode+0x31>
xor    %eax,%eax
call   1030 <fegetround@plt>
mov    %eax,%r8d
mov    0x2e98(%rip),%r11
mov    (%r11),%eax
mov    0x2e96(%rip),%rcx
mov    0x2e6f(%rip),%rdx
mov    0x2e78(%rip),%rsi
cmp    (%rsi),%r8d
mov    %eax,%r12d
cmove  %r8d,%r12d
cmp    (%rdx),%r8d
cmove  %r8d,%r12d
cmp    (%rcx),%r8d
cmove  %r8d,%r12d
cmp    %eax,%r8d
cmove  %r8d,%r12d
mov    %rsi,%r8
xor    %esi,%esi
jmp    11b3 <imcd_float24_encode+0xa3>
or     $0x7f,%ebx
xor    %edx,%edx
xor    %eax,%eax
cmp    $0x3c,%r14b
mov    %ebx,%ecx
cmove  %eax,%ecx
cmove  %ebx,%eax
mov    %ecx,0x0(%rbp)
mov    %edx,0x4(%rbp)
mov    %eax,0x8(%rbp)
add    $0x4,%rsi
add    $0xc,%rbp
cmp    %r15d,%esi
jge    145e <imcd_float24_encode+0x34e>
mov    0x0(%r13,%rsi,4),%r9d
mov    0x4(%r13,%rsi,4),%eax
mov    0x8(%r13,%rsi,4),%ecx
mov    0xc(%r13,%rsi,4),%edx
mov    %edx,%ebx
and    $0x80,%ebx
and    $0x7f,%edx
mov    %ecx,%edi
shr    $0x7,%edi
and    $0x1,%edi
lea    (%rdi,%rdx,2),%edi
and    $0x7f,%ecx
mov    %ecx,%edx
shl    $0x10,%edx
mov    %eax,%r10d
shl    $0x8,%r10d
or     %r9d,%r10d
or     %edx,%r10d
mov    %edi,%edx
or     %r10d,%edx
je     1189 <imcd_float24_encode+0x79>
test   %edi,%edi
je     1220 <imcd_float24_encode+0x110>
cmp    $0xff,%dil
jne    1240 <imcd_float24_encode+0x130>
xor    %edx,%edx
test   %r10d,%r10d
setne  %dl
or     $0x7f,%ebx
shl    $0x7,%edx
jmp    118b <imcd_float24_encode+0x7b>
cs nopw 0x0(%rax,%rax,1)
cmp    (%r8),%r12d
jne    1304 <imcd_float24_encode+0x1f4>
mov    $0x1,%eax
test   %ebx,%ebx
je     1304 <imcd_float24_encode+0x1f4>
xor    %edx,%edx
jmp    118d <imcd_float24_encode+0x7d>
nopl   (%rax)
cmp    $0xbf,%edi
jae    1186 <imcd_float24_encode+0x76>
cmp    $0x40,%edi
ja     131e <imcd_float24_encode+0x20e>
cmp    $0x29,%edi
jb     1189 <imcd_float24_encode+0x79>
mov    $0x48,%r8d
sub    %edi,%r8d
or     $0x800000,%r10d
mov    %r10d,%r11d
mov    %r8d,%ecx
sar    %cl,%r11d
mov    $0x50,%cl
sub    %dil,%cl
mov    %r10d,%edx
sar    %cl,%edx
movzbl %r11b,%eax
movzbl %dl,%edx
cmp    $0x30,%edi
jb     1398 <imcd_float24_encode+0x288>
mov    $0xffffffff,%r9d
mov    %r8d,%ecx
shl    %cl,%r9d
not    %r9d
and    $0xffffff,%r9d
mov    $0x47,%cl
sub    %dil,%cl
mov    %r9d,%edi
shr    %cl,%edi
shl    %cl,%edi
and    %r10d,%r9d
je     141c <imcd_float24_encode+0x30c>
mov    0x2d1d(%rip),%rcx
cmp    (%rcx),%r12d
mov    0x2d0b(%rip),%r8
jne    12dc <imcd_float24_encode+0x1cc>
cmp    %edi,%r9d
ja     12ed <imcd_float24_encode+0x1dd>
jne    12dc <imcd_float24_encode+0x1cc>
and    $0x1,%r11d
jne    12ed <imcd_float24_encode+0x1dd>
cmp    (%r8),%r12d
jne    1436 <imcd_float24_encode+0x326>
test   %ebx,%ebx
je     1436 <imcd_float24_encode+0x326>
mov    0x2cec(%rip),%r11
cmp    $0xff,%eax
jne    1414 <imcd_float24_encode+0x304>
jmp    13d8 <imcd_float24_encode+0x2c8>
mov    0x2cbd(%rip),%rax
mov    (%rax),%ecx
xor    %r12d,%ecx
xor    %eax,%eax
or     %ebx,%ecx
sete   %al
xor    %edx,%edx
jmp    118d <imcd_float24_encode+0x7d>
add    $0x40,%edi
and    $0x7f,%edi
or     %ebx,%edi
mov    %eax,%edx
shr    $0x7,%edx
and    $0x1,%edx
and    $0x7f,%eax
mov    %r9d,%r10d
shr    $0x7,%r10d
and    $0x1,%r10d
mov    %r9d,%r8d
lea    (%rdx,%rcx,2),%edx
lea    (%r10,%rax,2),%eax
and    $0x7f,%r8d
je     138a <imcd_float24_encode+0x27a>
cmp    (%r11),%r12d
jne    136b <imcd_float24_encode+0x25b>
cmp    $0x40,%r8d
ja     1404 <imcd_float24_encode+0x2f4>
movzbl %r9b,%ecx
cmp    $0xc0,%ecx
je     1404 <imcd_float24_encode+0x2f4>
mov    0x2c66(%rip),%r8
cmp    (%r8),%r12d
jne    13ed <imcd_float24_encode+0x2dd>
test   %ebx,%ebx
je     13ed <imcd_float24_encode+0x2dd>
mov    %edi,%ebx
cmp    $0xff,%eax
jne    1414 <imcd_float24_encode+0x304>
jmp    13d8 <imcd_float24_encode+0x2c8>
mov    %edi,%ebx
mov    0x2c45(%rip),%r8
jmp    118d <imcd_float24_encode+0x7d>
test   $0x7f,%r9b
mov    0x2c3d(%rip),%r11
mov    0x2c2e(%rip),%r8
je     118d <imcd_float24_encode+0x7d>
cmp    (%r8),%r12d
jne    13b9 <imcd_float24_encode+0x2a9>
test   %ebx,%ebx
jne    13d1 <imcd_float24_encode+0x2c1>
mov    0x2c08(%rip),%rcx
cmp    (%rcx),%r12d
jne    118d <imcd_float24_encode+0x7d>
test   %ebx,%ebx
jne    118d <imcd_float24_encode+0x7d>
cmp    $0xff,%eax
jne    1414 <imcd_float24_encode+0x304>
xor    %eax,%eax
cmp    $0xff,%edx
lea    0x1(%rdx),%ecx
cmove  %eax,%ecx
mov    %ecx,%edx
jmp    118d <imcd_float24_encode+0x7d>
mov    0x2bd4(%rip),%rcx
cmp    (%rcx),%r12d
jne    142f <imcd_float24_encode+0x31f>
test   %ebx,%ebx
mov    %edi,%ebx
je     13d1 <imcd_float24_encode+0x2c1>
jmp    118d <imcd_float24_encode+0x7d>
mov    %edi,%ebx
mov    0x2bcb(%rip),%r8
cmp    $0xff,%eax
je     13d8 <imcd_float24_encode+0x2c8>
add    $0x1,%eax
jmp    118d <imcd_float24_encode+0x7d>
mov    0x2bbd(%rip),%r11
mov    0x2bae(%rip),%r8
jmp    118d <imcd_float24_encode+0x7d>
mov    %edi,%ebx
jmp    118d <imcd_float24_encode+0x7d>
mov    0x2b8b(%rip),%rcx
cmp    (%rcx),%r12d
jne    1452 <imcd_float24_encode+0x342>
test   %ebx,%ebx
mov    0x2b95(%rip),%r11
je     13d1 <imcd_float24_encode+0x2c1>
jmp    118d <imcd_float24_encode+0x7d>
mov    0x2b87(%rip),%r11
jmp    118d <imcd_float24_encode+0x7d>
lea    0x3(%r15),%eax
test   %r15d,%r15d
cmovns %r15d,%eax
and    $0xfffffffc,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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