int utf8_to_utf16(const unsigned char *utf8, int cc,
                  unsigned short *unicode16) {
  int count = 0;
  unsigned char c0, c1;
  unsigned long scalar;
  while (--cc >= 0) {
    c0 = *utf8++;
    if (c0 < 0x80) {
      *unicode16++ = c0;
      count++;
      continue;
    }
    if ((c0 & 0xc0) == 0x80)
      return -1;
    scalar = c0;
    if (--cc < 0)
      return -1;
    c1 = *utf8++;
    if ((c1 & 0xc0) != 0x80)
      return -1;
    scalar <<= 6;
    scalar |= (c1 & 0x3f);
    if (!(c0 & 0x20)) {
      if (scalar < 0x80)
        return -1;
      *unicode16++ = scalar & 0x7ff;
      count++;
      continue;
    }
    if (--cc < 0)
      return -1;
    c1 = *utf8++;
    if ((c1 & 0xc0) != 0x80)
      return -1;
    scalar <<= 6;
    scalar |= (c1 & 0x3f);
    if (!(c0 & 0x10)) {
      if (scalar < 0x800)
        return -1;
      if (scalar >= 0xd800 && scalar < 0xe000)
        return -1;
      *unicode16++ = scalar & 0xffff;
      count++;
      continue;
    }
    c1 = *utf8++;
    if (--cc < 0)
      return -1;
    if ((c1 & 0xc0) != 0x80)
      return -1;
    scalar <<= 6;
    scalar |= (c1 & 0x3f);
    if (!(c0 & 0x08)) {
      if (scalar < 0x10000)
        return -1;
      scalar -= 0x10000;
      *unicode16++ = ((scalar >> 10) & 0x3ff) + 0xd800;
      *unicode16++ = (scalar & 0x3ff) + 0xdc00;
      count += 2;
      continue;
    }
    return -1;
  }
  return count;
}


x86 assembly (clang, -O0):
<utf8_to_utf16>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jl     145d <utf8_to_utf16+0x35d>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x25(%rbp)
movzbl -0x25(%rbp),%eax
cmp    $0x80,%eax
jge    1172 <utf8_to_utf16+0x72>
movzbl -0x25(%rbp),%eax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1116 <utf8_to_utf16+0x16>
movzbl -0x25(%rbp),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
jne    1192 <utf8_to_utf16+0x92>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
movzbl -0x25(%rbp),%eax
mov    %rax,-0x30(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jge    11b8 <utf8_to_utf16+0xb8>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x26(%rbp)
movzbl -0x26(%rbp),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
je     11ec <utf8_to_utf16+0xec>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
shl    $0x6,%rax
mov    %rax,-0x30(%rbp)
movzbl -0x26(%rbp),%eax
and    $0x3f,%eax
cltq
or     -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movzbl -0x25(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
jne    1260 <utf8_to_utf16+0x160>
cmpq   $0x80,-0x30(%rbp)
jae    1233 <utf8_to_utf16+0x133>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
and    $0x7ff,%rax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1116 <utf8_to_utf16+0x16>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jge    127e <utf8_to_utf16+0x17e>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x26(%rbp)
movzbl -0x26(%rbp),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
je     12b2 <utf8_to_utf16+0x1b2>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
shl    $0x6,%rax
mov    %rax,-0x30(%rbp)
movzbl -0x26(%rbp),%eax
and    $0x3f,%eax
cltq
or     -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movzbl -0x25(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    134e <utf8_to_utf16+0x24e>
cmpq   $0x800,-0x30(%rbp)
jae    12f9 <utf8_to_utf16+0x1f9>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
cmpq   $0xd800,-0x30(%rbp)
jb     1321 <utf8_to_utf16+0x221>
cmpq   $0xe000,-0x30(%rbp)
jae    1321 <utf8_to_utf16+0x221>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
and    $0xffff,%rax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1116 <utf8_to_utf16+0x16>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x26(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jge    1380 <utf8_to_utf16+0x280>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
movzbl -0x26(%rbp),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
je     13a0 <utf8_to_utf16+0x2a0>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
shl    $0x6,%rax
mov    %rax,-0x30(%rbp)
movzbl -0x26(%rbp),%eax
and    $0x3f,%eax
cltq
or     -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
movzbl -0x25(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
jne    1451 <utf8_to_utf16+0x351>
cmpq   $0x10000,-0x30(%rbp)
jae    13e7 <utf8_to_utf16+0x2e7>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x30(%rbp),%rax
sub    $0x10000,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
shr    $0xa,%rax
and    $0x3ff,%rax
add    $0xd800,%rax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x30(%rbp),%rax
and    $0x3ff,%rax
add    $0xdc00,%rax
mov    %ax,%cx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x24(%rbp)
jmp    1116 <utf8_to_utf16+0x16>
movl   $0xffffffff,-0x4(%rbp)
jmp    1463 <utf8_to_utf16+0x363>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<utf8_to_utf16>:
push   %r14
push   %rbx
test   %esi,%esi
jle    128d <utf8_to_utf16+0x18d>
xor    %r8d,%r8d
jmp    1143 <utf8_to_utf16+0x43>
add    $0x2,%rdi
and    $0x7ff,%r11d
mov    %r11w,(%rdx)
add    $0x2,%rdx
mov    $0x1,%eax
mov    %rdi,%r10
nopl   0x0(%rax,%rax,1)
add    %eax,%r8d
mov    %ecx,%esi
mov    %r10,%rdi
mov    %r8d,%eax
test   %ecx,%ecx
jle    128f <utf8_to_utf16+0x18f>
movzbl (%rdi),%r9d
test   %r9b,%r9b
js     1170 <utf8_to_utf16+0x70>
add    $0x1,%rdi
add    $0xffffffff,%esi
mov    %r9w,(%rdx)
add    $0x2,%rdx
mov    $0x1,%eax
mov    %rdi,%r10
mov    %esi,%ecx
jmp    1130 <utf8_to_utf16+0x30>
nopw   0x0(%rax,%rax,1)
mov    %r9d,%ecx
and    $0xffffffc0,%ecx
mov    $0xffffffff,%eax
cmp    $0x80,%ecx
je     128f <utf8_to_utf16+0x18f>
mov    %esi,%ecx
sub    $0x2,%ecx
jb     128f <utf8_to_utf16+0x18f>
movzbl 0x1(%rdi),%r11d
mov    %r11d,%ebx
and    $0xffffffc0,%ebx
cmp    $0x80,%ebx
jne    128f <utf8_to_utf16+0x18f>
mov    %r9,%rbx
shl    $0x6,%rbx
and    $0x3f,%r11d
or     %rbx,%r11
test   $0x20,%r9b
je     1110 <utf8_to_utf16+0x10>
mov    %esi,%ecx
sub    $0x3,%ecx
jb     128f <utf8_to_utf16+0x18f>
movzbl 0x2(%rdi),%r14d
mov    %r14d,%ebx
and    $0xffffffc0,%ebx
cmp    $0x80,%ebx
jne    128f <utf8_to_utf16+0x18f>
lea    0x3(%rdi),%r10
mov    %r11,%rbx
shl    $0x6,%rbx
and    $0x3f,%r14d
or     %rbx,%r14
test   $0x10,%r9b
jne    1227 <utf8_to_utf16+0x127>
cmp    $0x800,%r14d
jb     128f <utf8_to_utf16+0x18f>
and    $0xffffffe0,%r11d
cmp    $0x360,%r11d
je     128f <utf8_to_utf16+0x18f>
mov    %r14w,(%rdx)
add    $0x2,%rdx
mov    $0x1,%eax
jmp    1130 <utf8_to_utf16+0x30>
sub    $0x4,%esi
jb     128f <utf8_to_utf16+0x18f>
movzbl (%r10),%ecx
mov    %ecx,%ebx
and    $0xffffffc0,%ebx
cmp    $0x80,%ebx
jne    128f <utf8_to_utf16+0x18f>
test   $0x8,%r9b
jne    128f <utf8_to_utf16+0x18f>
shl    $0x6,%r14
and    $0x3f,%ecx
or     %r14,%rcx
cmp    $0x10000,%ecx
jb     128f <utf8_to_utf16+0x18f>
add    $0x4,%rdi
lea    0xf0000(%rcx),%eax
shr    $0xa,%eax
and    $0x3ff,%eax
or     $0xd800,%eax
mov    %ax,(%rdx)
and    $0x3ff,%ecx
or     $0xdc00,%ecx
mov    %cx,0x2(%rdx)
add    $0x4,%rdx
mov    $0x2,%eax
jmp    1160 <utf8_to_utf16+0x60>
xor    %eax,%eax
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define i32 @utf8_to_utf16(i8* nocapture %0, i32 %1, i16* nocapture writeonly %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %102
5: ; preds = %3, %18
%6 = phi i32 [ %23, %18 ], [ 0, %3 ]
%7 = phi i16* [ %22, %18 ], [ %2, %3 ]
%8 = phi i32 [ %21, %18 ], [ %1, %3 ]
%9 = phi i8* [ %20, %18 ], [ %0, %3 ]
%10 = getelementptr inbounds i8, i8* %9, i64 1
%11 = load i8, i8* %9
%12 = zext i8 %11 to i32
%13 = icmp sgt i8 %11, -1
br i1 %13, label %14, label %25
14: ; preds = %5
%15 = add nsw i32 %8, -1
%16 = zext i8 %11 to i16
%17 = getelementptr inbounds i16, i16* %7, i64 1
store i16 %16, i16* %7
br label %18
18: ; preds = %14, %45, %70, %91
%19 = phi i32 [ 1, %14 ], [ 1, %45 ], [ 1, %70 ], [ 2, %91 ]
%20 = phi i8* [ %10, %14 ], [ %33, %45 ], [ %53, %70 ], [ %74, %91 ]
%21 = phi i32 [ %15, %14 ], [ %30, %45 ], [ %50, %70 ], [ %75, %91 ]
%22 = phi i16* [ %17, %14 ], [ %48, %45 ], [ %72, %70 ], [ %101, %91 ]
%23 = add nuw nsw i32 %6, %19
%24 = icmp sgt i32 %21, 0
br i1 %24, label %5, label %102
25: ; preds = %5
%26 = and i32 %12, 192
%27 = icmp eq i32 %26, 128
br i1 %27, label %102, label %28
28: ; preds = %25
%29 = zext i8 %11 to i64
%30 = add nsw i32 %8, -2
%31 = icmp ult i32 %8, 2
br i1 %31, label %102, label %32
32: ; preds = %28
%33 = getelementptr inbounds i8, i8* %9, i64 2
%34 = load i8, i8* %10
%35 = zext i8 %34 to i32
%36 = and i32 %35, 192
%37 = icmp eq i32 %36, 128
br i1 %37, label %38, label %102
38: ; preds = %32
%39 = shl nuw nsw i64 %29, 6
%40 = and i32 %35, 63
%41 = zext i32 %40 to i64
%42 = or i64 %39, %41
%43 = and i32 %12, 32
%44 = icmp eq i32 %43, 0
br i1 %44, label %45, label %49
45: ; preds = %38
%46 = trunc i64 %42 to i16
%47 = and i16 %46, 2047
%48 = getelementptr inbounds i16, i16* %7, i64 1
store i16 %47, i16* %7
br label %18
49: ; preds = %38
%50 = add nsw i32 %8, -3
%51 = icmp ult i32 %8, 3
br i1 %51, label %102, label %52
52: ; preds = %49
%53 = getelementptr inbounds i8, i8* %9, i64 3
%54 = load i8, i8* %33
%55 = zext i8 %54 to i32
%56 = and i32 %55, 192
%57 = icmp eq i32 %56, 128
br i1 %57, label %58, label %102
58: ; preds = %52
%59 = shl nuw nsw i64 %42, 6
%60 = and i32 %55, 63
%61 = zext i32 %60 to i64
%62 = or i64 %59, %61
%63 = and i32 %12, 16
%64 = icmp eq i32 %63, 0
br i1 %64, label %65, label %73
65: ; preds = %58
%66 = icmp ult i64 %62, 2048
%67 = and i64 %42, 16352
%68 = icmp eq i64 %67, 864
%69 = select i1 %66, i1 true, i1 %68
br i1 %69, label %102, label %70
70: ; preds = %65
%71 = trunc i64 %62 to i16
%72 = getelementptr inbounds i16, i16* %7, i64 1
store i16 %71, i16* %7
br label %18
73: ; preds = %58
%74 = getelementptr inbounds i8, i8* %9, i64 4
%75 = add nsw i32 %8, -4
%76 = icmp ult i32 %8, 4
br i1 %76, label %102, label %77
77: ; preds = %73
%78 = load i8, i8* %53
%79 = zext i8 %78 to i32
%80 = and i32 %79, 192
%81 = icmp eq i32 %80, 128
br i1 %81, label %82, label %102
82: ; preds = %77
%83 = shl nuw nsw i64 %62, 6
%84 = and i32 %79, 63
%85 = zext i32 %84 to i64
%86 = or i64 %83, %85
%87 = and i32 %12, 8
%88 = icmp ne i32 %87, 0
%89 = icmp ult i64 %86, 65536
%90 = select i1 %88, i1 true, i1 %89
br i1 %90, label %102, label %91
91: ; preds = %82
%92 = add i64 %86, 983040
%93 = lshr i64 %92, 10
%94 = trunc i64 %93 to i16
%95 = and i16 %94, 1023
%96 = or i16 %95, -10240
%97 = getelementptr inbounds i16, i16* %7, i64 1
store i16 %96, i16* %7
%98 = trunc i64 %86 to i16
%99 = and i16 %98, 1023
%100 = or i16 %99, -9216
%101 = getelementptr inbounds i16, i16* %7, i64 2
store i16 %100, i16* %97
br label %18
102: ; preds = %25, %28, %32, %49, %52, %65, %73, %77, %82, %18, %3
%103 = phi i32 [ 0, %3 ], [ %23, %18 ], [ -1, %82 ], [ -1, %77 ], [ -1, %73 ], [ -1, %65 ], [ -1, %52 ], [ -1, %49 ], [ -1, %32 ], [ -1, %28 ], [ -1, %25 ]
ret i32 %103
}