#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 */
scalar_t__ xmalloc(int);
int ucs2_to_utf8(unsigned char **pu8str, const unsigned char *u16str,
                 int u16len) {
  int i, out_count, c;
  int is_be = 0;
  const unsigned char *u16p = u16str;
  unsigned char *u8o = 0, *u8p = 0;
  if (u16len < 0)
    return -1;
  if (!u16str || !u16len) {
    if (pu8str)
      *pu8str = 0;
    return 0;
  }
  if ((u16len & 1))
    return -1;
  for (i = 0; i < u16len; i += 2) {
    if (!u16str[i] && !u16str[i + 1])
      return -1;
  }
  if (u16str[0] == 0xff && u16str[1] == 0xfe) {
    u16p = u16str + 2;
    u16len -= 2;
  } else if (u16str[0] == 0xfe && u16str[1] == 0xff) {
    u16p = u16str + 2;
    u16len -= 2;
    is_be = 1;
  } else {
    int count0 = 0;
    int count1 = 0;
    for (i = 0; i < u16len; i += 2) {
      if (u16str[i] >= ' ')
        ++count0;
      if (u16str[i + 1] >= ' ')
        ++count1;
    }
    if (count0 <= 0) {
      is_be = 1;
    }
    if (count0 > 0 && count1 > 0) {
      return -1;
    }
  }
  out_count = 0;
  for (i = 0; i < u16len; i += 2) {
    if (is_be) {
      c = (u16p[i] << 8) | u16p[i + 1];
    } else {
      c = (u16p[i + 1] << 8) | u16p[i];
    }
    if (c <= 0x7f) {
      out_count += 1;
    } else if (c <= 0x7ff) {
      out_count += 2;
    } else {
      out_count += 3;
    }
  }
  if (!pu8str)
    return out_count;
  u8o = (unsigned char *)xmalloc(out_count + 1);
  u8p = u8o;
  for (i = 0; i < u16len; i += 2) {
    if (is_be) {
      c = (u16p[i] << 8) | u16p[i + 1];
    } else {
      c = (u16p[i + 1] << 8) | u16p[i];
    }
    if (c <= 0x7f) {
      *u8p++ = c;
    } else if (c <= 0x7ff) {
      *u8p++ = (c >> 6) | 0xc0;
      *u8p++ = (c & 0x3f) | 0x80;
    } else {
      *u8p++ = (c >> 12) | 0xe0;
      *u8p++ = ((c >> 6) & 0x3f) | 0x80;
      *u8p++ = (c & 0x3f) | 0x80;
    }
  }
  *u8p = 0;
  *pu8str = u8o;
  return out_count;
}


x86 assembly (clang, -O0):
<ucs2_to_utf8>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jge    1158 <ucs2_to_utf8+0x48>
movl   $0xffffffff,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
cmpq   $0x0,-0x18(%rbp)
je     116d <ucs2_to_utf8+0x5d>
cmpl   $0x0,-0x1c(%rbp)
jne    118f <ucs2_to_utf8+0x7f>
cmpq   $0x0,-0x10(%rbp)
je     1183 <ucs2_to_utf8+0x73>
mov    -0x10(%rbp),%rax
movq   $0x0,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
mov    -0x1c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     11aa <ucs2_to_utf8+0x9a>
movl   $0xffffffff,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1205 <ucs2_to_utf8+0xf5>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    11f2 <ucs2_to_utf8+0xe2>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    11f2 <ucs2_to_utf8+0xe2>
movl   $0xffffffff,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
jmp    11f7 <ucs2_to_utf8+0xe7>
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    11b1 <ucs2_to_utf8+0xa1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xff,%eax
jne    1244 <ucs2_to_utf8+0x134>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xfe,%eax
jne    1244 <ucs2_to_utf8+0x134>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x1c(%rbp)
jmp    133a <ucs2_to_utf8+0x22a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0xfe,%eax
jne    128a <ucs2_to_utf8+0x17a>
mov    -0x18(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0xff,%eax
jne    128a <ucs2_to_utf8+0x17a>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x1,-0x2c(%rbp)
jmp    1335 <ucs2_to_utf8+0x225>
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12ff <ucs2_to_utf8+0x1ef>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jl     12c9 <ucs2_to_utf8+0x1b9>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jl     12ec <ucs2_to_utf8+0x1dc>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    12f1 <ucs2_to_utf8+0x1e1>
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    129f <ucs2_to_utf8+0x18f>
cmpl   $0x0,-0x4c(%rbp)
jg     1310 <ucs2_to_utf8+0x200>
movl   $0x1,-0x2c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jle    1330 <ucs2_to_utf8+0x220>
cmpl   $0x0,-0x50(%rbp)
jle    1330 <ucs2_to_utf8+0x220>
movl   $0xffffffff,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
jmp    1335 <ucs2_to_utf8+0x225>
jmp    133a <ucs2_to_utf8+0x22a>
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1401 <ucs2_to_utf8+0x2f1>
cmpl   $0x0,-0x2c(%rbp)
je     1388 <ucs2_to_utf8+0x278>
mov    -0x38(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x8,%eax
mov    -0x38(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
or     %ecx,%eax
mov    %eax,-0x28(%rbp)
jmp    13ad <ucs2_to_utf8+0x29d>
mov    -0x38(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x8,%eax
mov    -0x38(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
or     %ecx,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x7f,-0x28(%rbp)
jg     13c5 <ucs2_to_utf8+0x2b5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    13ee <ucs2_to_utf8+0x2de>
cmpl   $0x7ff,-0x28(%rbp)
jg     13e0 <ucs2_to_utf8+0x2d0>
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    13e9 <ucs2_to_utf8+0x2d9>
mov    -0x24(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x24(%rbp)
jmp    13ee <ucs2_to_utf8+0x2de>
jmp    13f3 <ucs2_to_utf8+0x2e3>
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    1348 <ucs2_to_utf8+0x238>
cmpq   $0x0,-0x10(%rbp)
jne    1417 <ucs2_to_utf8+0x307>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    159a <ucs2_to_utf8+0x48a>
mov    -0x24(%rbp),%edi
add    $0x1,%edi
call   1030 <xmalloc@plt>
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1582 <ucs2_to_utf8+0x472>
cmpl   $0x0,-0x2c(%rbp)
je     1475 <ucs2_to_utf8+0x365>
mov    -0x38(%rbp),%rax
movslq -0x20(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x8,%eax
mov    -0x38(%rbp),%rcx
mov    -0x20(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movzbl (%rcx,%rdx,1),%ecx
or     %ecx,%eax
mov    %eax,-0x28(%rbp)
jmp    149a <ucs2_to_utf8+0x38a>
mov    -0x38(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
shl    $0x8,%eax
mov    -0x38(%rbp),%rcx
movslq -0x20(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
or     %ecx,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x7f,-0x28(%rbp)
jg     14bf <ucs2_to_utf8+0x3af>
mov    -0x28(%rbp),%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    156f <ucs2_to_utf8+0x45f>
cmpl   $0x7ff,-0x28(%rbp)
jg     150d <ucs2_to_utf8+0x3fd>
mov    -0x28(%rbp),%eax
sar    $0x6,%eax
or     $0xc0,%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    156a <ucs2_to_utf8+0x45a>
mov    -0x28(%rbp),%eax
sar    $0xc,%eax
or     $0xe0,%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%eax
sar    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x48(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x48(%rbp)
mov    %cl,(%rax)
jmp    156f <ucs2_to_utf8+0x45f>
jmp    1574 <ucs2_to_utf8+0x464>
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    1435 <ucs2_to_utf8+0x325>
mov    -0x48(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x40(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ucs2_to_utf8>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    $0xffffffff,%r15d
test   %edx,%edx
js     1178 <ucs2_to_utf8+0x68>
mov    %rsi,%r13
mov    %rdi,%r11
test   %rsi,%rsi
je     116b <ucs2_to_utf8+0x5b>
mov    %edx,%r14d
test   %edx,%edx
je     116b <ucs2_to_utf8+0x5b>
test   $0x1,%r14b
jne    1178 <ucs2_to_utf8+0x68>
xor    %eax,%eax
jmp    1159 <ucs2_to_utf8+0x49>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x2,%rax
cmp    %r14d,%eax
jge    118a <ucs2_to_utf8+0x7a>
cmpb   $0x0,0x0(%r13,%rax,1)
jne    1150 <ucs2_to_utf8+0x40>
cmpb   $0x0,0x1(%r13,%rax,1)
jne    1150 <ucs2_to_utf8+0x40>
jmp    1178 <ucs2_to_utf8+0x68>
xor    %r15d,%r15d
test   %r11,%r11
je     1178 <ucs2_to_utf8+0x68>
xor    %eax,%eax
mov    %rax,(%r11)
mov    %r15d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x0(%r13),%al
cmp    $0xfe,%al
je     11ad <ucs2_to_utf8+0x9d>
cmp    $0xff,%al
jne    11b8 <ucs2_to_utf8+0xa8>
cmpb   $0xfe,0x1(%r13)
jne    11b8 <ucs2_to_utf8+0xa8>
add    $0x2,%r13
add    $0xfffffffe,%r14d
xor    %r12d,%r12d
jmp    13f5 <ucs2_to_utf8+0x2e5>
cmpb   $0xff,0x1(%r13)
je     13e7 <ucs2_to_utf8+0x2d7>
xor    %edi,%edi
cmp    $0x20,%al
setae  %dil
xor    %edx,%edx
cmpb   $0x20,0x1(%r13)
setae  %dl
cmp    $0x3,%r14d
jl     13d2 <ucs2_to_utf8+0x2c2>
movslq %r14d,%r10
lea    -0x3(%r10),%r8
mov    $0x2,%ecx
cmp    $0xe,%r8
jb     13b0 <ucs2_to_utf8+0x2a0>
shr    %r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
lea    (%r9,%r9,1),%rcx
add    $0x2,%rcx
movd   %edx,%xmm1
movd   %edi,%xmm2
pxor   %xmm0,%xmm0
xor    %edi,%edi
movdqa 0xde9(%rip),%xmm8
pcmpeqd %xmm9,%xmm9
movdqa 0xdec(%rip),%xmm6
pxor   %xmm5,%xmm5
nopl   0x0(%rax,%rax,1)
movzbl 0x2(%r13,%rdi,2),%edx
movzbl 0x6(%r13,%rdi,2),%esi
movzbl 0x8(%r13,%rdi,2),%eax
shl    $0x8,%eax
or     %esi,%eax
movzbl 0x4(%r13,%rdi,2),%esi
shl    $0x8,%esi
or     %edx,%esi
movd   %esi,%xmm4
pinsrw $0x1,%eax,%xmm4
movzbl 0xa(%r13,%rdi,2),%eax
movzbl 0xe(%r13,%rdi,2),%edx
movzbl 0x10(%r13,%rdi,2),%esi
shl    $0x8,%esi
or     %edx,%esi
movzbl 0xc(%r13,%rdi,2),%edx
shl    $0x8,%edx
or     %eax,%edx
movd   %edx,%xmm3
pinsrw $0x1,%esi,%xmm3
movdqa %xmm4,%xmm7
pminub %xmm8,%xmm7
pcmpeqb %xmm4,%xmm7
pxor   %xmm9,%xmm7
punpcklbw %xmm7,%xmm7
punpcklwd %xmm7,%xmm7
pand   %xmm6,%xmm7
paddd  %xmm7,%xmm2
movdqa %xmm3,%xmm4
pminub %xmm8,%xmm4
pcmpeqb %xmm3,%xmm4
pxor   %xmm9,%xmm4
punpcklbw %xmm4,%xmm4
punpcklwd %xmm4,%xmm4
pand   %xmm6,%xmm4
movzbl 0x3(%r13,%rdi,2),%eax
movzbl 0x7(%r13,%rdi,2),%edx
movzbl 0x9(%r13,%rdi,2),%esi
shl    $0x8,%esi
or     %edx,%esi
movzbl 0x5(%r13,%rdi,2),%edx
shl    $0x8,%edx
or     %eax,%edx
movd   %edx,%xmm3
pinsrw $0x1,%esi,%xmm3
paddd  %xmm4,%xmm5
movzbl 0xb(%r13,%rdi,2),%eax
movzbl 0xf(%r13,%rdi,2),%edx
movzbl 0x11(%r13,%rdi,2),%esi
shl    $0x8,%esi
or     %edx,%esi
movzbl 0xd(%r13,%rdi,2),%edx
shl    $0x8,%edx
or     %eax,%edx
movd   %edx,%xmm4
pinsrw $0x1,%esi,%xmm4
movdqa %xmm3,%xmm7
pminub %xmm8,%xmm7
pcmpeqb %xmm3,%xmm7
pxor   %xmm9,%xmm7
punpcklbw %xmm7,%xmm7
punpcklwd %xmm7,%xmm7
pand   %xmm6,%xmm7
paddd  %xmm7,%xmm1
movdqa %xmm4,%xmm3
pminub %xmm8,%xmm3
pcmpeqb %xmm4,%xmm3
pxor   %xmm9,%xmm3
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm3
pand   %xmm6,%xmm3
paddd  %xmm3,%xmm0
add    $0x8,%rdi
cmp    %rdi,%r9
jne    1230 <ucs2_to_utf8+0x120>
paddd  %xmm2,%xmm5
pshufd $0xee,%xmm5,%xmm2
paddd  %xmm5,%xmm2
pshufd $0x55,%xmm2,%xmm3
paddd  %xmm2,%xmm3
movd   %xmm3,%edi
paddd  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%edx
cmp    %r9,%r8
je     13d2 <ucs2_to_utf8+0x2c2>
nopw   0x0(%rax,%rax,1)
cmpb   $0x20,0x0(%r13,%rcx,1)
sbb    $0xffffffff,%edi
mov    %rcx,%rax
or     $0x1,%rax
cmpb   $0x20,0x0(%r13,%rax,1)
sbb    $0xffffffff,%edx
add    $0x2,%rcx
cmp    %r10,%rcx
jl     13b0 <ucs2_to_utf8+0x2a0>
xor    %r12d,%r12d
test   %edi,%edi
sete   %r12b
je     13f5 <ucs2_to_utf8+0x2e5>
test   %edx,%edx
jne    1178 <ucs2_to_utf8+0x68>
jmp    13f5 <ucs2_to_utf8+0x2e5>
add    $0x2,%r13
add    $0xfffffffe,%r14d
mov    $0x1,%r12d
test   %r14d,%r14d
jle    141b <ucs2_to_utf8+0x30b>
mov    %r14d,%r10d
lea    -0x1(%r10),%rax
mov    %rax,%r8
shr    %r8
add    $0x1,%r8
cmp    $0x2,%rax
jae    143f <ucs2_to_utf8+0x32f>
xor    %ebp,%ebp
xor    %r15d,%r15d
jmp    14eb <ucs2_to_utf8+0x3db>
test   %r11,%r11
je     1601 <ucs2_to_utf8+0x4f1>
mov    $0x1,%edi
mov    %r11,%rbx
call   1030 <xmalloc@plt>
mov    %rbx,%r11
xor    %r15d,%r15d
mov    %rax,%rcx
jmp    160f <ucs2_to_utf8+0x4ff>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
xor    %ebp,%ebp
mov    $0x1,%r9d
xor    %r15d,%r15d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    0x1(%rbp),%rdi
lea    0x2(%rbp),%rcx
lea    0x3(%rbp),%rbx
test   %r12d,%r12d
mov    %rbp,%rax
cmove  %rdi,%rax
cmove  %rbp,%rdi
movzbl 0x0(%r13,%rax,1),%eax
movzbl 0x0(%r13,%rdi,1),%edi
mov    %rbx,%rsi
cmove  %rcx,%rsi
cmove  %rbx,%rcx
shl    $0x8,%eax
or     %edi,%eax
cmp    $0x800,%eax
mov    $0x3,%edi
sbb    $0x0,%edi
cmp    $0x80,%eax
cmovb  %r9d,%edi
add    %r15d,%edi
movzbl 0x0(%r13,%rcx,1),%eax
shl    $0x8,%eax
movzbl 0x0(%r13,%rsi,1),%ecx
or     %eax,%ecx
cmp    $0x800,%ecx
mov    $0x3,%r15d
sbb    $0x0,%r15d
cmp    $0x80,%ecx
cmovb  %r9d,%r15d
add    %edi,%r15d
add    $0x4,%rbp
add    $0xfffffffffffffffe,%rdx
jne    1460 <ucs2_to_utf8+0x350>
test   $0x1,%r8b
je     1536 <ucs2_to_utf8+0x426>
mov    %rbp,%rax
or     $0x1,%rax
test   %r12d,%r12d
mov    %rax,%rcx
cmove  %rbp,%rcx
cmovne %rbp,%rax
movzbl 0x0(%r13,%rax,1),%eax
shl    $0x8,%eax
movzbl 0x0(%r13,%rcx,1),%ecx
or     %eax,%ecx
cmp    $0x800,%ecx
mov    $0x3,%eax
sbb    $0x0,%eax
cmp    $0x80,%ecx
mov    $0x1,%ecx
cmovae %eax,%ecx
add    %ecx,%r15d
test   %r11,%r11
je     1178 <ucs2_to_utf8+0x68>
mov    %r10,%rbp
mov    %r11,%rbx
lea    0x1(%r15),%edi
call   1030 <xmalloc@plt>
test   %r14d,%r14d
jle    1609 <ucs2_to_utf8+0x4f9>
xor    %edx,%edx
mov    %rax,%rcx
mov    %rbx,%r11
mov    %rbp,%r8
jmp    1584 <ucs2_to_utf8+0x474>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %sil,(%rcx)
add    $0x1,%rcx
add    $0x2,%rdx
cmp    %r8,%rdx
jae    160f <ucs2_to_utf8+0x4ff>
lea    0x1(%rdx),%rsi
test   %r12d,%r12d
mov    %rsi,%rbx
cmove  %rdx,%rbx
cmovne %rdx,%rsi
movzbl 0x0(%r13,%rsi,1),%ebp
mov    %ebp,%edi
shl    $0x8,%edi
movzbl 0x0(%r13,%rbx,1),%esi
or     %esi,%edi
cmp    $0x7f,%edi
jbe    1570 <ucs2_to_utf8+0x460>
cmp    $0x7ff,%edi
ja     15d2 <ucs2_to_utf8+0x4c2>
shr    $0x6,%edi
or     $0xc0,%dil
mov    %dil,(%rcx)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x1(%rcx)
add    $0x2,%rcx
jmp    1577 <ucs2_to_utf8+0x467>
shr    $0x4,%bpl
or     $0xe0,%bpl
mov    %bpl,(%rcx)
shr    $0x6,%edi
and    $0x3f,%dil
or     $0x80,%dil
mov    %dil,0x1(%rcx)
and    $0x3f,%sil
or     $0x80,%sil
mov    %sil,0x2(%rcx)
add    $0x3,%rcx
jmp    1577 <ucs2_to_utf8+0x467>
xor    %r15d,%r15d
jmp    1178 <ucs2_to_utf8+0x68>
mov    %rax,%rcx
mov    %rbx,%r11
movb   $0x0,(%rcx)
jmp    1175 <ucs2_to_utf8+0x65>

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

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