int unmeng(unsigned char *in, int insz, unsigned char *out, int outsz) {
  unsigned a;
  unsigned char *o, *outl, *inl, *slide;
  inl = in + insz;
  o = out;
  outl = out + outsz;
  while ((in < inl) && (o < outl)) {
    a = in[0];
    if (a < 0x80) {
      slide = (o - (a & 0x0f)) - 1;
      if (slide < out)
        return (-1);
      a = (a >> 4) + 3;
      in++;
    } else if ((a & 0xe0) == 0x80) {
      a = (a & 0x1F) + 1;
      in++;
      slide = in;
      in += a;
    } else if ((a & 0xc0) == 0xc0) {
      a = (a & 0x3F) + 4;
      slide = (o - in[1]) - 1;
      if (slide < out)
        return (-1);
      in += 2;
    } else if ((a & 0xf0) == 0xa0) {
      a = (((a & 0x0F) << 8) | in[1]) + 32;
      in += 2;
      slide = in;
      in += a;
    } else {
      a = (((a & 0x0F) << 8) | in[1]) + 6;
      slide = (o - ((in[2] << 8) | in[3])) - 1;
      if (slide < out)
        return (-1);
      in += 4;
    }
    while (a--) {
      if (o >= outl)
        break;
      *o++ = *slide++;
    }
  }
  return (o - out);
}


x86 assembly (clang, -O0):
<unmeng>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x24(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x40(%rbp),%rcx
mov    %al,-0x49(%rbp)
jae    1159 <unmeng+0x59>
mov    -0x30(%rbp),%rax
cmp    -0x38(%rbp),%rax
setb   %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    1169 <unmeng+0x69>
jmp    13ad <unmeng+0x2ad>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x80,-0x28(%rbp)
jae    11d5 <unmeng+0xd5>
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%ecx
and    $0xf,%ecx
mov    %ecx,%ecx
mov    %ecx,%edx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    11b8 <unmeng+0xb8>
movl   $0xffffffff,-0x4(%rbp)
jmp    13bb <unmeng+0x2bb>
mov    -0x28(%rbp),%eax
shr    $0x4,%eax
add    $0x3,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1355 <unmeng+0x255>
mov    -0x28(%rbp),%eax
and    $0xe0,%eax
cmp    $0x80,%eax
jne    121d <unmeng+0x11d>
mov    -0x28(%rbp),%eax
and    $0x1f,%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    1350 <unmeng+0x250>
mov    -0x28(%rbp),%eax
and    $0xc0,%eax
cmp    $0xc0,%eax
jne    1286 <unmeng+0x186>
mov    -0x28(%rbp),%eax
and    $0x3f,%eax
add    $0x4,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    1275 <unmeng+0x175>
movl   $0xffffffff,-0x4(%rbp)
jmp    13bb <unmeng+0x2bb>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    134b <unmeng+0x24b>
mov    -0x28(%rbp),%eax
and    $0xf0,%eax
cmp    $0xa0,%eax
jne    12db <unmeng+0x1db>
mov    -0x28(%rbp),%eax
and    $0xf,%eax
shl    $0x8,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
or     %ecx,%eax
add    $0x20,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,%ecx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    1346 <unmeng+0x246>
mov    -0x28(%rbp),%eax
and    $0xf,%eax
shl    $0x8,%eax
mov    -0x10(%rbp),%rcx
movzbl 0x1(%rcx),%ecx
or     %ecx,%eax
add    $0x6,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl 0x2(%rcx),%ecx
shl    $0x8,%ecx
mov    -0x10(%rbp),%rdx
movzbl 0x3(%rdx),%edx
or     %edx,%ecx
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
add    %rcx,%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    133a <unmeng+0x23a>
movl   $0xffffffff,-0x4(%rbp)
jmp    13bb <unmeng+0x2bb>
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x10(%rbp)
jmp    134b <unmeng+0x24b>
jmp    1350 <unmeng+0x250>
jmp    1355 <unmeng+0x255>
jmp    135a <unmeng+0x25a>
mov    -0x28(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x28(%rbp)
cmp    $0x0,%eax
je     13a8 <unmeng+0x2a8>
mov    -0x30(%rbp),%rax
cmp    -0x38(%rbp),%rax
jb     1381 <unmeng+0x281>
jmp    13a8 <unmeng+0x2a8>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    135a <unmeng+0x25a>
jmp    1138 <unmeng+0x38>
mov    -0x30(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<unmeng>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,%rax
test   %esi,%esi
jle    13e6 <unmeng+0x2e6>
mov    %rdx,%rax
test   %ecx,%ecx
jle    13e6 <unmeng+0x2e6>
movslq %esi,%r11
add    %rdi,%r11
movslq %ecx,%r9
add    %rdx,%r9
mov    $0x1,%r8d
xor    %r10d,%r10d
mov    %rdx,%rax
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%r14d
test   %r14b,%r14b
js     1180 <unmeng+0x80>
mov    %r14d,%ebx
not    %ebx
or     $0xfffffffffffffff0,%rbx
add    %rax,%rbx
cmp    %rdx,%rbx
jb     13ea <unmeng+0x2ea>
shr    $0x4,%r14d
add    $0x3,%r14d
add    $0x1,%rdi
cmp    %r9,%rax
jb     1260 <unmeng+0x160>
jmp    13d8 <unmeng+0x2d8>
nopl   0x0(%rax,%rax,1)
mov    %r14d,%esi
and    $0xffffffe0,%esi
cmp    $0x80,%esi
jne    11b2 <unmeng+0xb2>
and    $0x1f,%r14d
mov    %rdi,%rbx
add    %r14,%rdi
add    $0x2,%rdi
add    $0x1,%rbx
add    $0x1,%r14
cmp    %r9,%rax
jb     1260 <unmeng+0x160>
jmp    13d8 <unmeng+0x2d8>
mov    %r14d,%esi
not    %esi
test   $0xc0,%sil
jne    11e6 <unmeng+0xe6>
movzbl 0x1(%rdi),%ebx
not    %rbx
add    %rax,%rbx
cmp    %rdx,%rbx
jb     13ea <unmeng+0x2ea>
and    $0x3f,%r14d
add    $0x4,%r14d
add    $0x2,%rdi
cmp    %r9,%rax
jb     1260 <unmeng+0x160>
jmp    13d8 <unmeng+0x2d8>
mov    %r14d,%esi
and    $0xfffffff0,%esi
cmp    $0xa0,%esi
jne    1223 <unmeng+0x123>
and    $0xf,%r14d
shl    $0x8,%r14
movzbl 0x1(%rdi),%esi
lea    (%r14,%rsi,1),%rbp
add    %rsi,%r14
add    $0x20,%r14
mov    %rdi,%rbx
add    %rbp,%rdi
add    $0x22,%rdi
add    $0x2,%rbx
cmp    %r9,%rax
jb     1260 <unmeng+0x160>
jmp    13d8 <unmeng+0x2d8>
movzwl 0x2(%rdi),%ebx
shl    $0x30,%rbx
bswap  %rbx
not    %rbx
add    %rax,%rbx
cmp    %rdx,%rbx
jb     13ea <unmeng+0x2ea>
and    $0xf,%r14d
shl    $0x8,%r14d
movzbl 0x1(%rdi),%esi
add    %esi,%r14d
add    $0x6,%r14d
add    $0x4,%rdi
cmp    %r9,%rax
jae    13d8 <unmeng+0x2d8>
nopl   (%rax)
lea    -0x1(%r14),%ebp
mov    %rax,%rsi
not    %rsi
add    %r9,%rsi
cmp    %rbp,%rsi
mov    %rbp,%r12
cmovb  %rsi,%r12
add    $0x1,%r12
test   %ebp,%ebp
cmove  %r8,%r12
cmp    $0x20,%r12
jb     13b0 <unmeng+0x2b0>
cmp    %rbp,%rsi
cmovae %rbp,%rsi
test   %ebp,%ebp
cmove  %r10,%rsi
lea    (%rbx,%rsi,1),%rbp
add    $0x1,%rbp
cmp    %rbp,%rax
jae    12b5 <unmeng+0x1b5>
add    %rax,%rsi
add    $0x1,%rsi
cmp    %rsi,%rbx
jb     13b0 <unmeng+0x2b0>
mov    %r12,%r15
movabs $0x1ffffffe0,%rcx
and    %rcx,%r15
lea    -0x20(%r15),%rbp
mov    %rbp,%rsi
shr    $0x5,%rsi
add    $0x1,%rsi
mov    %esi,%r13d
and    $0x3,%r13d
cmp    $0x60,%rbp
jae    12e5 <unmeng+0x1e5>
xor    %ebp,%ebp
jmp    1348 <unmeng+0x248>
and    $0xfffffffffffffffc,%rsi
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
movups (%rbx,%rbp,1),%xmm0
movups 0x10(%rbx,%rbp,1),%xmm1
movups %xmm0,(%rax,%rbp,1)
movups %xmm1,0x10(%rax,%rbp,1)
movups 0x20(%rbx,%rbp,1),%xmm0
movups 0x30(%rbx,%rbp,1),%xmm1
movups %xmm0,0x20(%rax,%rbp,1)
movups %xmm1,0x30(%rax,%rbp,1)
movups 0x40(%rbx,%rbp,1),%xmm0
movups 0x50(%rbx,%rbp,1),%xmm1
movups %xmm0,0x40(%rax,%rbp,1)
movups %xmm1,0x50(%rax,%rbp,1)
movups 0x60(%rbx,%rbp,1),%xmm0
movups 0x70(%rbx,%rbp,1),%xmm1
movups %xmm0,0x60(%rax,%rbp,1)
movups %xmm1,0x70(%rax,%rbp,1)
sub    $0xffffffffffffff80,%rbp
add    $0xfffffffffffffffc,%rsi
jne    12f0 <unmeng+0x1f0>
test   %r13,%r13
je     1390 <unmeng+0x290>
lea    (%rax,%rbp,1),%rsi
add    $0x10,%rsi
add    %rbx,%rbp
add    $0x10,%rbp
shl    $0x5,%r13
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movups -0x10(%rbp,%r10,1),%xmm0
movups 0x0(%rbp,%r10,1),%xmm1
movups %xmm0,-0x10(%rsi,%r10,1)
movups %xmm1,(%rsi,%r10,1)
add    $0x20,%r10
cmp    %r10,%r13
jne    1370 <unmeng+0x270>
add    %r15,%rax
cmp    %r15,%r12
jne    139d <unmeng+0x29d>
xor    %r10d,%r10d
jmp    13d8 <unmeng+0x2d8>
add    %r15,%rbx
sub    %r15d,%r14d
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
mov    %r14d,%esi
mov    $0x1,%ebp
nopl   0x0(%rax,%rax,1)
movzbl -0x1(%rbx,%rbp,1),%ecx
mov    %cl,(%rax)
add    $0x1,%rax
cmp    %ebp,%esi
je     13d8 <unmeng+0x2d8>
add    $0x1,%rbp
cmp    %r9,%rax
jb     13c0 <unmeng+0x2c0>
cmp    %r11,%rdi
jae    13e6 <unmeng+0x2e6>
cmp    %r9,%rax
jb     1140 <unmeng+0x40>
sub    %edx,%eax
jmp    13ef <unmeng+0x2ef>
mov    $0xffffffff,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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