#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 */

/* Variables and functions */
unsigned int to_latin9(unsigned int);
size_t utf8_to_latin9(char *const output, const char *const input,
                      const size_t length) {
  unsigned char *out = (unsigned char *)output;
  const unsigned char *in = (const unsigned char *)input;
  const unsigned char *const end = (const unsigned char *)input + length;
  unsigned int c;
  while (in < end)
    if (*in < 128)
      *(out++) = *(in++);
    else if (*in < 192)
      in++;
    else if (*in < 224) {
      if (in + 1 >= end)
        break;
      if ((in[1] & 192U) == 128U) {
        c = to_latin9((((unsigned int)(in[0] & 0x1FU)) << 6U) |
                      ((unsigned int)(in[1] & 0x3FU)));
        if (c < 256)
          *(out++) = c;
      }
      in += 2;
    } else if (*in < 240) {
      if (in + 2 >= end)
        break;
      if ((in[1] & 192U) == 128U && (in[2] & 192U) == 128U) {
        c = to_latin9((((unsigned int)(in[0] & 0x0FU)) << 12U) |
                      (((unsigned int)(in[1] & 0x3FU)) << 6U) |
                      ((unsigned int)(in[2] & 0x3FU)));
        if (c < 256)
          *(out++) = c;
      }
      in += 3;
    } else if (*in < 248) {
      if (in + 3 >= end)
        break;
      if ((in[1] & 192U) == 128U && (in[2] & 192U) == 128U &&
          (in[3] & 192U) == 128U) {
        c = to_latin9((((unsigned int)(in[0] & 0x07U)) << 18U) |
                      (((unsigned int)(in[1] & 0x3FU)) << 12U) |
                      (((unsigned int)(in[2] & 0x3FU)) << 6U) |
                      ((unsigned int)(in[3] & 0x3FU)));
        if (c < 256)
          *(out++) = c;
      }
      in += 4;
    } else if (*in < 252) {
      if (in + 4 >= end)
        break;
      if ((in[1] & 192U) == 128U && (in[2] & 192U) == 128U &&
          (in[3] & 192U) == 128U && (in[4] & 192U) == 128U) {
        c = to_latin9((((unsigned int)(in[0] & 0x03U)) << 24U) |
                      (((unsigned int)(in[1] & 0x3FU)) << 18U) |
                      (((unsigned int)(in[2] & 0x3FU)) << 12U) |
                      (((unsigned int)(in[3] & 0x3FU)) << 6U) |
                      ((unsigned int)(in[4] & 0x3FU)));
        if (c < 256)
          *(out++) = c;
      }
      in += 5;
    } else if (*in < 254) {
      if (in + 5 >= end)
        break;
      if ((in[1] & 192U) == 128U && (in[2] & 192U) == 128U &&
          (in[3] & 192U) == 128U && (in[4] & 192U) == 128U &&
          (in[5] & 192U) == 128U) {
        c = to_latin9((((unsigned int)(in[0] & 0x01U)) << 30U) |
                      (((unsigned int)(in[1] & 0x3FU)) << 24U) |
                      (((unsigned int)(in[2] & 0x3FU)) << 18U) |
                      (((unsigned int)(in[3] & 0x3FU)) << 12U) |
                      (((unsigned int)(in[4] & 0x3FU)) << 6U) |
                      ((unsigned int)(in[5] & 0x3FU)));
        if (c < 256)
          *(out++) = c;
      }
      in += 6;
    } else
      in++;
  *out = '\0';
  return (size_t)(out - (unsigned char *)output);
}


x86 assembly (clang, -O0):
<utf8_to_latin9>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x80,%eax
jge    1187 <utf8_to_latin9+0x77>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    1670 <utf8_to_latin9+0x560>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xc0,%eax
jge    11aa <utf8_to_latin9+0x9a>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    166b <utf8_to_latin9+0x55b>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xe0,%eax
jge    1246 <utf8_to_latin9+0x136>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
cmp    -0x30(%rbp),%rax
jb     11d3 <utf8_to_latin9+0xc3>
jmp    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1235 <utf8_to_latin9+0x125>
mov    -0x28(%rbp),%rax
movzbl (%rax),%edi
and    $0x1f,%edi
shl    $0x6,%edi
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
or     %eax,%edi
call   1030 <to_latin9@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jae    1230 <utf8_to_latin9+0x120>
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    1235 <utf8_to_latin9+0x125>
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
jmp    1666 <utf8_to_latin9+0x556>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf0,%eax
jge    130a <utf8_to_latin9+0x1fa>
mov    -0x28(%rbp),%rax
add    $0x2,%rax
cmp    -0x30(%rbp),%rax
jb     126f <utf8_to_latin9+0x15f>
jmp    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    12f9 <utf8_to_latin9+0x1e9>
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    12f9 <utf8_to_latin9+0x1e9>
mov    -0x28(%rbp),%rax
movzbl (%rax),%edi
and    $0xf,%edi
shl    $0xc,%edi
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
shl    $0x6,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0x3f,%eax
or     %eax,%edi
call   1030 <to_latin9@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jae    12f4 <utf8_to_latin9+0x1e4>
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    12f9 <utf8_to_latin9+0x1e9>
mov    -0x28(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x28(%rbp)
jmp    1661 <utf8_to_latin9+0x551>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xf8,%eax
jge    13f6 <utf8_to_latin9+0x2e6>
mov    -0x28(%rbp),%rax
add    $0x3,%rax
cmp    -0x30(%rbp),%rax
jb     1333 <utf8_to_latin9+0x223>
jmp    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13e5 <utf8_to_latin9+0x2d5>
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13e5 <utf8_to_latin9+0x2d5>
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    13e5 <utf8_to_latin9+0x2d5>
mov    -0x28(%rbp),%rax
movzbl (%rax),%edi
and    $0x7,%edi
shl    $0x12,%edi
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
shl    $0xc,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0x3f,%eax
shl    $0x6,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0x3f,%eax
or     %eax,%edi
call   1030 <to_latin9@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jae    13e0 <utf8_to_latin9+0x2d0>
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    13e5 <utf8_to_latin9+0x2d5>
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x28(%rbp)
jmp    165c <utf8_to_latin9+0x54c>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xfc,%eax
jge    150a <utf8_to_latin9+0x3fa>
mov    -0x28(%rbp),%rax
add    $0x4,%rax
cmp    -0x30(%rbp),%rax
jb     141f <utf8_to_latin9+0x30f>
jmp    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    14f9 <utf8_to_latin9+0x3e9>
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    14f9 <utf8_to_latin9+0x3e9>
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    14f9 <utf8_to_latin9+0x3e9>
mov    -0x28(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    14f9 <utf8_to_latin9+0x3e9>
mov    -0x28(%rbp),%rax
movzbl (%rax),%edi
and    $0x3,%edi
shl    $0x18,%edi
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
shl    $0x12,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0x3f,%eax
shl    $0xc,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0x3f,%eax
shl    $0x6,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0x3f,%eax
or     %eax,%edi
call   1030 <to_latin9@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jae    14f4 <utf8_to_latin9+0x3e4>
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    14f9 <utf8_to_latin9+0x3e9>
mov    -0x28(%rbp),%rax
add    $0x5,%rax
mov    %rax,-0x28(%rbp)
jmp    1657 <utf8_to_latin9+0x547>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xfe,%eax
jge    1646 <utf8_to_latin9+0x536>
mov    -0x28(%rbp),%rax
add    $0x5,%rax
cmp    -0x30(%rbp),%rax
jb     1533 <utf8_to_latin9+0x423>
jmp    1675 <utf8_to_latin9+0x565>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
movzbl 0x5(%rax),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
movzbl (%rax),%edi
and    $0x1,%edi
shl    $0x1e,%edi
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0x3f,%eax
shl    $0x18,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0x3f,%eax
shl    $0x12,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0x3f,%eax
shl    $0xc,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0x3f,%eax
shl    $0x6,%eax
or     %eax,%edi
mov    -0x28(%rbp),%rax
movzbl 0x5(%rax),%eax
and    $0x3f,%eax
or     %eax,%edi
call   1030 <to_latin9@plt>
mov    %eax,-0x34(%rbp)
cmpl   $0x100,-0x34(%rbp)
jae    1630 <utf8_to_latin9+0x520>
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    1635 <utf8_to_latin9+0x525>
mov    -0x28(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x28(%rbp)
jmp    1652 <utf8_to_latin9+0x542>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1657 <utf8_to_latin9+0x547>
jmp    165c <utf8_to_latin9+0x54c>
jmp    1661 <utf8_to_latin9+0x551>
jmp    1666 <utf8_to_latin9+0x556>
jmp    166b <utf8_to_latin9+0x55b>
jmp    1670 <utf8_to_latin9+0x560>
jmp    1140 <utf8_to_latin9+0x30>
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_to_latin9>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    %rdi,%r14
mov    %rdi,%r12
test   %rdx,%rdx
jle    13f0 <utf8_to_latin9+0x2e0>
mov    %rdx,%r15
mov    %rsi,%rbx
add    %rsi,%r15
mov    %r14,%r12
jmp    1155 <utf8_to_latin9+0x45>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%rbx
mov    %cl,(%r12)
add    $0x1,%r12
cmp    %r15,%rbx
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl (%rbx),%ecx
test   %cl,%cl
jns    1140 <utf8_to_latin9+0x30>
cmp    $0xbf,%cl
ja     1167 <utf8_to_latin9+0x57>
add    $0x1,%rbx
jmp    114c <utf8_to_latin9+0x3c>
movzbl %cl,%eax
cmp    $0xdf,%cl
ja     11b1 <utf8_to_latin9+0xa1>
lea    0x1(%rbx),%rcx
cmp    %r15,%rcx
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl (%rcx),%edi
mov    %edi,%ecx
and    $0xffffffc0,%ecx
cmp    $0x80,%ecx
jne    11ab <utf8_to_latin9+0x9b>
and    $0x1f,%eax
shl    $0x6,%eax
and    $0x3f,%edi
or     %eax,%edi
call   1030 <to_latin9@plt>
cmp    $0xff,%eax
ja     11ab <utf8_to_latin9+0x9b>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x2,%rbx
jmp    114c <utf8_to_latin9+0x3c>
cmp    $0xef,%cl
ja     1214 <utf8_to_latin9+0x104>
lea    0x2(%rbx),%rdx
cmp    %r15,%rdx
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl 0x1(%rbx),%ecx
mov    %ecx,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    120b <utf8_to_latin9+0xfb>
movzbl (%rdx),%edi
mov    %edi,%edx
and    $0xffffffc0,%edx
cmp    $0x80,%edx
jne    120b <utf8_to_latin9+0xfb>
shl    $0xc,%eax
movzwl %ax,%eax
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %eax,%ecx
and    $0x3f,%edi
or     %ecx,%edi
call   1030 <to_latin9@plt>
cmp    $0xff,%eax
ja     120b <utf8_to_latin9+0xfb>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x3,%rbx
jmp    114c <utf8_to_latin9+0x3c>
cmp    $0xf7,%cl
ja     1290 <utf8_to_latin9+0x180>
lea    0x3(%rbx),%rsi
cmp    %r15,%rsi
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl 0x1(%rbx),%ecx
mov    %ecx,%edx
and    $0xffffffc0,%edx
cmp    $0x80,%edx
jne    1287 <utf8_to_latin9+0x177>
movzbl 0x2(%rbx),%edx
mov    %edx,%edi
and    $0xffffffc0,%edi
cmp    $0x80,%edi
jne    1287 <utf8_to_latin9+0x177>
movzbl (%rsi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1287 <utf8_to_latin9+0x177>
and    $0x7,%eax
shl    $0x12,%eax
and    $0x3f,%ecx
shl    $0xc,%ecx
or     %eax,%ecx
and    $0x3f,%edx
shl    $0x6,%edx
or     %ecx,%edx
and    $0x3f,%edi
or     %edx,%edi
call   1030 <to_latin9@plt>
cmp    $0xff,%eax
ja     1287 <utf8_to_latin9+0x177>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x4,%rbx
jmp    114c <utf8_to_latin9+0x3c>
cmp    $0xfb,%cl
ja     132f <utf8_to_latin9+0x21f>
lea    0x4(%rbx),%rdi
cmp    %r15,%rdi
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl 0x1(%rbx),%ecx
mov    %ecx,%edx
and    $0xffffffc0,%edx
cmp    $0x80,%edx
jne    1326 <utf8_to_latin9+0x216>
movzbl 0x2(%rbx),%edx
mov    %edx,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1326 <utf8_to_latin9+0x216>
movzbl 0x3(%rbx),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1326 <utf8_to_latin9+0x216>
movzbl (%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    1326 <utf8_to_latin9+0x216>
and    $0x3,%eax
shl    $0x18,%eax
and    $0x3f,%ecx
shl    $0x12,%ecx
or     %eax,%ecx
and    $0x3f,%edx
shl    $0xc,%edx
or     %ecx,%edx
and    $0x3f,%r8d
shl    $0x6,%r8d
or     %edx,%r8d
and    $0x3f,%edi
or     %r8d,%edi
call   1030 <to_latin9@plt>
cmp    $0xff,%eax
ja     1326 <utf8_to_latin9+0x216>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x5,%rbx
jmp    114c <utf8_to_latin9+0x3c>
cmp    $0xfd,%cl
ja     1161 <utf8_to_latin9+0x51>
lea    0x5(%rbx),%rdi
cmp    %r15,%rdi
jae    13f0 <utf8_to_latin9+0x2e0>
movzbl 0x1(%rbx),%ecx
mov    %ecx,%edx
and    $0xffffffc0,%edx
cmp    $0x80,%edx
jne    13e7 <utf8_to_latin9+0x2d7>
movzbl 0x2(%rbx),%edx
mov    %edx,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    13e7 <utf8_to_latin9+0x2d7>
movzbl 0x3(%rbx),%r9d
mov    %r9d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    13e7 <utf8_to_latin9+0x2d7>
movzbl 0x4(%rbx),%r8d
mov    %r8d,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    13e7 <utf8_to_latin9+0x2d7>
movzbl (%rdi),%edi
mov    %edi,%esi
and    $0xffffffc0,%esi
cmp    $0x80,%esi
jne    13e7 <utf8_to_latin9+0x2d7>
and    $0x1,%eax
shl    $0x1e,%eax
and    $0x3f,%ecx
shl    $0x18,%ecx
or     %eax,%ecx
and    $0x3f,%edx
shl    $0x12,%edx
or     %ecx,%edx
and    $0x3f,%r9d
shl    $0xc,%r9d
or     %edx,%r9d
and    $0x3f,%r8d
shl    $0x6,%r8d
or     %r9d,%r8d
and    $0x3f,%edi
or     %r8d,%edi
call   1030 <to_latin9@plt>
cmp    $0xff,%eax
ja     13e7 <utf8_to_latin9+0x2d7>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x6,%rbx
jmp    114c <utf8_to_latin9+0x3c>
movb   $0x0,(%r12)
sub    %r14,%r12
mov    %r12,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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