int XFastConvertUtf8ToUcs(const unsigned char *buf, int len,
                          unsigned int *ucs) {
  if (buf[0] & 0x80) {
    if (buf[0] & 0x40) {
      if (buf[0] & 0x20) {
        if (buf[0] & 0x10) {
          if (buf[0] & 0x08) {
            if (buf[0] & 0x04) {
              if (buf[0] & 0x02) {
              } else {
              }
            } else if (len > 4) {
              *ucs = ((buf[0] & ~0xF8) << 24) + ((buf[1] & ~0x80) << 18) +
                     ((buf[2] & ~0x80) << 12) + ((buf[3] & ~0x80) << 6) +
                     (buf[4] & ~0x80);
              return 5;
            }
          } else if (len > 3) {
            *ucs = ((buf[0] & ~0xF0) << 18) + ((buf[1] & ~0x80) << 12) +
                   ((buf[2] & ~0x80) << 6) + (buf[3] & ~0x80);
            return 4;
          }
        } else if (len > 2) {
          *ucs = ((buf[0] & ~0xE0) << 12) + ((buf[1] & ~0x80) << 6) +
                 (buf[2] & ~0x80);
          return 3;
        }
      } else if (len > 1) {
        *ucs = ((buf[0] & ~0xC0) << 6) + (buf[1] & ~0x80);
        return 2;
      }
    }
  } else if (len > 0) {
    *ucs = buf[0];
    return 1;
  }
  *ucs = (unsigned int)'?';
  return -1;
}


x86 assembly (clang, -O0):
<XFastConvertUtf8ToUcs>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     132a <XFastConvertUtf8ToUcs+0x22a>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1325 <XFastConvertUtf8ToUcs+0x225>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     12e0 <XFastConvertUtf8ToUcs+0x1e0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1289 <XFastConvertUtf8ToUcs+0x189>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1220 <XFastConvertUtf8ToUcs+0x120>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11a5 <XFastConvertUtf8ToUcs+0xa5>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     119b <XFastConvertUtf8ToUcs+0x9b>
jmp    11a0 <XFastConvertUtf8ToUcs+0xa0>
jmp    11a0 <XFastConvertUtf8ToUcs+0xa0>
jmp    121b <XFastConvertUtf8ToUcs+0x11b>
cmpl   $0x4,-0x14(%rbp)
jle    1216 <XFastConvertUtf8ToUcs+0x116>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff07,%ecx
shl    $0x18,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x12,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
shl    $0xc,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x5,-0x4(%rbp)
jmp    1363 <XFastConvertUtf8ToUcs+0x263>
jmp    121b <XFastConvertUtf8ToUcs+0x11b>
jmp    1284 <XFastConvertUtf8ToUcs+0x184>
cmpl   $0x3,-0x14(%rbp)
jle    127f <XFastConvertUtf8ToUcs+0x17f>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff0f,%ecx
shl    $0x12,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0xc,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x4,-0x4(%rbp)
jmp    1363 <XFastConvertUtf8ToUcs+0x263>
jmp    1284 <XFastConvertUtf8ToUcs+0x184>
jmp    12db <XFastConvertUtf8ToUcs+0x1db>
cmpl   $0x2,-0x14(%rbp)
jle    12d6 <XFastConvertUtf8ToUcs+0x1d6>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff1f,%ecx
shl    $0xc,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
shl    $0x6,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    1363 <XFastConvertUtf8ToUcs+0x263>
jmp    12db <XFastConvertUtf8ToUcs+0x1db>
jmp    1320 <XFastConvertUtf8ToUcs+0x220>
cmpl   $0x1,-0x14(%rbp)
jle    131b <XFastConvertUtf8ToUcs+0x21b>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffff3f,%ecx
shl    $0x6,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xffffff7f,%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    1363 <XFastConvertUtf8ToUcs+0x263>
jmp    1320 <XFastConvertUtf8ToUcs+0x220>
jmp    1325 <XFastConvertUtf8ToUcs+0x225>
jmp    1352 <XFastConvertUtf8ToUcs+0x252>
cmpl   $0x0,-0x14(%rbp)
jle    134d <XFastConvertUtf8ToUcs+0x24d>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    1363 <XFastConvertUtf8ToUcs+0x263>
jmp    1352 <XFastConvertUtf8ToUcs+0x252>
mov    -0x20(%rbp),%rax
movl   $0x3f,(%rax)
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<XFastConvertUtf8ToUcs>:
movzbl (%rdi),%ecx
test   $0x80,%cl
jne    1118 <XFastConvertUtf8ToUcs+0x18>
mov    $0x1,%eax
test   %esi,%esi
jle    11f7 <XFastConvertUtf8ToUcs+0xf7>
mov    %ecx,(%rdx)
ret
test   $0x40,%cl
je     11f7 <XFastConvertUtf8ToUcs+0xf7>
test   $0x20,%cl
jne    1146 <XFastConvertUtf8ToUcs+0x46>
cmp    $0x2,%esi
jl     11f7 <XFastConvertUtf8ToUcs+0xf7>
and    $0x3f,%ecx
shl    $0x6,%ecx
movzbl 0x1(%rdi),%eax
and    $0x7f,%eax
add    %eax,%ecx
mov    $0x2,%eax
mov    %ecx,(%rdx)
ret
test   $0x10,%cl
jne    1177 <XFastConvertUtf8ToUcs+0x77>
cmp    $0x3,%esi
jl     11f7 <XFastConvertUtf8ToUcs+0xf7>
and    $0x1f,%ecx
shl    $0xc,%ecx
movzbl 0x1(%rdi),%eax
and    $0x7f,%eax
shl    $0x6,%eax
add    %ecx,%eax
movzbl 0x2(%rdi),%ecx
and    $0x7f,%ecx
add    %eax,%ecx
mov    $0x3,%eax
mov    %ecx,(%rdx)
ret
test   $0x8,%cl
jne    11b0 <XFastConvertUtf8ToUcs+0xb0>
cmp    $0x4,%esi
jl     11f7 <XFastConvertUtf8ToUcs+0xf7>
and    $0xf,%ecx
shl    $0x12,%ecx
movzbl 0x1(%rdi),%eax
and    $0x7f,%eax
shl    $0xc,%eax
add    %ecx,%eax
movzbl 0x2(%rdi),%esi
and    $0x7f,%esi
shl    $0x6,%esi
add    %eax,%esi
movzbl 0x3(%rdi),%ecx
and    $0x7f,%ecx
add    %esi,%ecx
mov    $0x4,%eax
mov    %ecx,(%rdx)
ret
cmp    $0x5,%esi
jl     11f7 <XFastConvertUtf8ToUcs+0xf7>
mov    %ecx,%eax
and    $0x4,%eax
jne    11f7 <XFastConvertUtf8ToUcs+0xf7>
and    $0x7,%ecx
shl    $0x18,%ecx
movzbl 0x1(%rdi),%eax
and    $0x7f,%eax
shl    $0x12,%eax
add    %ecx,%eax
movzbl 0x2(%rdi),%ecx
and    $0x7f,%ecx
shl    $0xc,%ecx
add    %eax,%ecx
movzbl 0x3(%rdi),%eax
and    $0x7f,%eax
shl    $0x6,%eax
add    %ecx,%eax
movzbl 0x4(%rdi),%ecx
and    $0x7f,%ecx
add    %eax,%ecx
mov    $0x5,%eax
mov    %ecx,(%rdx)
ret
mov    $0xffffffff,%eax
mov    $0x3f,%ecx
mov    %ecx,(%rdx)
ret

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

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