short unrleit(unsigned char *buf, unsigned char *bufto, short inlen,
              short outlen) {
  register short cnt;
  register unsigned char *p, *q;
  unsigned char *endp, *endq;
  p = buf;
  endp = buf + inlen;
  q = bufto;
  endq = bufto + outlen;
  while (p < endp && q < endq) {
    cnt = *p++;
    if (!(cnt & 128)) {
      while (cnt-- && q < endq)
        *q++ = *p++;
    } else {
      cnt &= 127;
      while (cnt-- && q < endq)
        *q++ = *p;
      p++;
    }
  }
  return ((short)(q - bufto));
}


x86 assembly (clang, -O0):
<unrleit>:
push   %rbp
mov    %rsp,%rbp
mov    %cx,%ax
mov    %dx,%cx
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %cx,-0x12(%rbp)
mov    %ax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movswl -0x12(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movswl -0x14(%rbp),%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rcx
xor    %eax,%eax
cmp    -0x30(%rbp),%rcx
mov    %al,-0x39(%rbp)
jae    116f <unrleit+0x6f>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
setb   %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    117f <unrleit+0x7f>
jmp    128c <unrleit+0x18c>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movzbl (%rax),%eax
mov    %ax,-0x16(%rbp)
movswl -0x16(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1216 <unrleit+0x116>
jmp    11ac <unrleit+0xac>
mov    -0x16(%rbp),%ax
mov    %ax,%cx
add    $0xffff,%cx
mov    %cx,-0x16(%rbp)
movswl %ax,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3a(%rbp)
je     11da <unrleit+0xda>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
setb   %al
mov    %al,-0x3a(%rbp)
mov    -0x3a(%rbp),%al
test   $0x1,%al
jne    11ea <unrleit+0xea>
jmp    1211 <unrleit+0x111>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    11ac <unrleit+0xac>
jmp    1287 <unrleit+0x187>
movswl -0x16(%rbp),%eax
and    $0x7f,%eax
mov    %ax,-0x16(%rbp)
mov    -0x16(%rbp),%ax
mov    %ax,%cx
add    $0xffff,%cx
mov    %cx,-0x16(%rbp)
movswl %ax,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3b(%rbp)
je     124f <unrleit+0x14f>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
setb   %al
mov    %al,-0x3b(%rbp)
mov    -0x3b(%rbp),%al
test   $0x1,%al
jne    125f <unrleit+0x15f>
jmp    127b <unrleit+0x17b>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    1221 <unrleit+0x121>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    114e <unrleit+0x4e>
mov    -0x28(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
cwtl
pop    %rbp
ret

x86 assembly (clang, -O2):
<unrleit>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,%rax
test   %dx,%dx
jle    13fe <unrleit+0x2fe>
mov    %rsi,%rax
test   %cx,%cx
jle    13fe <unrleit+0x2fe>
movslq %edx,%r10
add    %rdi,%r10
movslq %ecx,%rcx
add    %rsi,%rcx
mov    $0x1,%r8d
xor    %r9d,%r9d
mov    %rsi,%rax
nopw   0x0(%rax,%rax,1)
lea    0x1(%rdi),%r13
movzbl (%rdi),%ebp
test   %bpl,%bpl
js     1200 <unrleit+0x100>
test   %bpl,%bpl
je     12a0 <unrleit+0x1a0>
cmp    %rcx,%rax
jae    12a0 <unrleit+0x1a0>
movzwl %bp,%r11d
lea    -0x1(%r11),%r14d
movzwl %r14w,%r15d
mov    %rax,%rdx
not    %rdx
add    %rcx,%rdx
cmp    %r15,%rdx
cmovb  %rdx,%r15
add    $0x1,%r15
test   %r14w,%r14w
cmove  %r8,%r15
cmp    $0x10,%r15
jb     13c0 <unrleit+0x2c0>
movzwl %r14w,%ebx
cmp    %rbx,%rdx
cmovb  %rdx,%rbx
test   %r14w,%r14w
cmove  %r9,%rbx
lea    (%rdi,%rbx,1),%rdx
add    $0x2,%rdx
cmp    %rdx,%rax
jae    11c5 <unrleit+0xc5>
lea    (%rax,%rbx,1),%rdx
add    $0x1,%rdx
cmp    %rdx,%r13
jb     13c0 <unrleit+0x2c0>
mov    %r15d,%r14d
and    $0x1fff0,%r14d
lea    -0x10(%r14),%rdx
mov    %rdx,%rbp
shr    $0x4,%rbp
add    $0x1,%rbp
mov    %ebp,%r12d
and    $0x7,%r12d
cmp    $0x70,%rdx
jae    1308 <unrleit+0x208>
xor    %ebx,%ebx
jmp    136b <unrleit+0x26b>
cs nopw 0x0(%rax,%rax,1)
and    $0x7f,%bpl
je     12a8 <unrleit+0x1a8>
cmp    %rcx,%rax
jae    12a8 <unrleit+0x1a8>
movzbl %bpl,%ebp
mov    %ebp,%ebx
add    $0xffffffff,%ebx
movzwl %bx,%r11d
mov    %rax,%rdx
not    %rdx
add    %rcx,%rdx
cmp    %r11,%rdx
cmovb  %rdx,%r11
add    $0x1,%r11
test   %bx,%bx
cmove  %r8,%r11
cmp    $0x10,%r11
jb     1276 <unrleit+0x176>
movzwl %bp,%r15d
lea    -0x1(%r15),%r14d
movzwl %r14w,%ebx
cmp    %rbx,%rdx
cmovb  %rdx,%rbx
test   %r14w,%r14w
mov    $0x0,%edx
cmovne %rbx,%rdx
lea    0x2(%rdi),%rbx
cmp    %rbx,%rax
jae    12b7 <unrleit+0x1b7>
add    %rax,%rdx
add    $0x1,%rdx
cmp    %rdx,%r13
jae    12b7 <unrleit+0x1b7>
mov    %rax,%rbx
add    $0xffffffff,%ebp
nopl   0x0(%rax)
movzbl 0x0(%r13),%eax
mov    %al,(%rbx)
add    $0x1,%rbx
add    $0xffff,%bp
jae    12ab <unrleit+0x1ab>
cmp    %rcx,%rbx
jb     1280 <unrleit+0x180>
jmp    12ab <unrleit+0x1ab>
nopl   0x0(%rax,%rax,1)
mov    %r13,%rdi
jmp    13f0 <unrleit+0x2f0>
mov    %rax,%rbx
add    $0x2,%rdi
mov    %rbx,%rax
jmp    13f0 <unrleit+0x2f0>
mov    %r11d,%r14d
and    $0x1fff0,%r14d
sub    %r14d,%r15d
mov    %r15d,%ebp
lea    (%rax,%r14,1),%rbx
movzbl 0x0(%r13),%edx
movd   %edx,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu %xmm0,(%rax,%rdx,1)
add    $0x10,%rdx
cmp    %rdx,%r14
jne    12f0 <unrleit+0x1f0>
cmp    %r14,%r11
je     12ab <unrleit+0x1ab>
jmp    1279 <unrleit+0x179>
and    $0xfffffffffffffff8,%rbp
xor    %ebx,%ebx
xchg   %ax,%ax
movups 0x1(%rdi,%rbx,1),%xmm0
movups %xmm0,(%rax,%rbx,1)
movups 0x11(%rdi,%rbx,1),%xmm0
movups %xmm0,0x10(%rax,%rbx,1)
movups 0x21(%rdi,%rbx,1),%xmm0
movups %xmm0,0x20(%rax,%rbx,1)
movups 0x31(%rdi,%rbx,1),%xmm0
movups %xmm0,0x30(%rax,%rbx,1)
movups 0x41(%rdi,%rbx,1),%xmm0
movups %xmm0,0x40(%rax,%rbx,1)
movups 0x51(%rdi,%rbx,1),%xmm0
movups %xmm0,0x50(%rax,%rbx,1)
movups 0x61(%rdi,%rbx,1),%xmm0
movups %xmm0,0x60(%rax,%rbx,1)
movdqu 0x71(%rdi,%rbx,1),%xmm0
movdqu %xmm0,0x70(%rax,%rbx,1)
sub    $0xffffffffffffff80,%rbx
add    $0xfffffffffffffff8,%rbp
jne    1310 <unrleit+0x210>
sub    %r14d,%r11d
test   %r12,%r12
je     13a3 <unrleit+0x2a3>
lea    (%rax,%rbx,1),%rdx
add    %rbx,%rdi
add    $0x1,%rdi
shl    $0x4,%r12
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu (%rdi,%rbx,1),%xmm0
movdqu %xmm0,(%rdx,%rbx,1)
add    $0x10,%rbx
cmp    %rbx,%r12
jne    1390 <unrleit+0x290>
add    %r14,%r13
add    %r14,%rax
mov    %r11d,%ebp
mov    %r13,%rdi
cmp    %r14,%r15
je     13f0 <unrleit+0x2f0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0xffffffff,%ebp
mov    %r13,%rdi
cs nopw 0x0(%rax,%rax,1)
movzbl (%rdi),%edx
add    $0x1,%rdi
mov    %dl,(%rax)
add    $0x1,%rax
add    $0xffff,%bp
jae    13f0 <unrleit+0x2f0>
cmp    %rcx,%rax
jb     13d0 <unrleit+0x2d0>
nopl   0x0(%rax,%rax,1)
cmp    %r10,%rdi
jae    13fe <unrleit+0x2fe>
cmp    %rcx,%rax
jb     1140 <unrleit+0x40>
sub    %esi,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define signext i16 @unrleit(i8* %0, i8* %1, i16 signext %2, i16 signext %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8*
%13 = alloca i8*
store i8* %0, i8** %5
store i8* %1, i8** %6
store i16 %2, i16* %7
store i16 %3, i16* %8
%14 = load i8*, i8** %5
store i8* %14, i8** %10
%15 = load i8*, i8** %5
%16 = load i16, i16* %7
%17 = sext i16 %16 to i32
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %15, i64 %18
store i8* %19, i8** %12
%20 = load i8*, i8** %6
store i8* %20, i8** %11
%21 = load i8*, i8** %6
%22 = load i16, i16* %8
%23 = sext i16 %22 to i32
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %21, i64 %24
store i8* %25, i8** %13
br label %26
26: ; preds = %88, %4
%27 = load i8*, i8** %10
%28 = load i8*, i8** %12
%29 = icmp ult i8* %27, %28
br i1 %29, label %30, label %34
30: ; preds = %26
%31 = load i8*, i8** %11
%32 = load i8*, i8** %13
%33 = icmp ult i8* %31, %32
br label %34
34: ; preds = %30, %26
%35 = phi i1 [ false, %26 ], [ %33, %30 ]
br i1 %35, label %36, label %89
36: ; preds = %34
%37 = load i8*, i8** %10
%38 = getelementptr inbounds i8, i8* %37, i32 1
store i8* %38, i8** %10
%39 = load i8, i8* %37
%40 = zext i8 %39 to i16
store i16 %40, i16* %9
%41 = load i16, i16* %9
%42 = sext i16 %41 to i32
%43 = and i32 %42, 128
%44 = icmp ne i32 %43, 0
br i1 %44, label %64, label %45
45: ; preds = %36
br label %46
46: ; preds = %57, %45
%47 = load i16, i16* %9
%48 = add i16 %47, -1
store i16 %48, i16* %9
%49 = sext i16 %47 to i32
%50 = icmp ne i32 %49, 0
br i1 %50, label %51, label %55
51: ; preds = %46
%52 = load i8*, i8** %11
%53 = load i8*, i8** %13
%54 = icmp ult i8* %52, %53
br label %55
55: ; preds = %51, %46
%56 = phi i1 [ false, %46 ], [ %54, %51 ]
br i1 %56, label %57, label %63
57: ; preds = %55
%58 = load i8*, i8** %10
%59 = getelementptr inbounds i8, i8* %58, i32 1
store i8* %59, i8** %10
%60 = load i8, i8* %58
%61 = load i8*, i8** %11
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %11
store i8 %60, i8* %61
br label %46
63: ; preds = %55
br label %88
64: ; preds = %36
%65 = load i16, i16* %9
%66 = sext i16 %65 to i32
%67 = and i32 %66, 127
%68 = trunc i32 %67 to i16
store i16 %68, i16* %9
br label %69
69: ; preds = %80, %64
%70 = load i16, i16* %9
%71 = add i16 %70, -1
store i16 %71, i16* %9
%72 = sext i16 %70 to i32
%73 = icmp ne i32 %72, 0
br i1 %73, label %74, label %78
74: ; preds = %69
%75 = load i8*, i8** %11
%76 = load i8*, i8** %13
%77 = icmp ult i8* %75, %76
br label %78
78: ; preds = %74, %69
%79 = phi i1 [ false, %69 ], [ %77, %74 ]
br i1 %79, label %80, label %85
80: ; preds = %78
%81 = load i8*, i8** %10
%82 = load i8, i8* %81
%83 = load i8*, i8** %11
%84 = getelementptr inbounds i8, i8* %83, i32 1
store i8* %84, i8** %11
store i8 %82, i8* %83
br label %69
85: ; preds = %78
%86 = load i8*, i8** %10
%87 = getelementptr inbounds i8, i8* %86, i32 1
store i8* %87, i8** %10
br label %88
88: ; preds = %85, %63
br label %26
89: ; preds = %34
%90 = load i8*, i8** %11
%91 = load i8*, i8** %6
%92 = ptrtoint i8* %90 to i64
%93 = ptrtoint i8* %91 to i64
%94 = sub i64 %92, %93
%95 = trunc i64 %94 to i16
ret i16 %95
}

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