long core__native___Byte___u8len(unsigned char self) {
  long var;
  unsigned char var1;
  unsigned char var3;
  short int var4;
  short int var6;
  unsigned char var7;
  unsigned char var9;
  short int var10;
  short int var12;
  unsigned char var13;
  unsigned char var15;
  short int var16;
  short int var18;
  unsigned char var19;
  unsigned char var21;
  short int var22;
  short int var24;
  {{var3 = self & ((unsigned char)0x80);
  var1 = var3;
  goto RET_LABEL2;
RET_LABEL2:
  (void)0;
}
}
{
  {
    var6 = var1 == ((unsigned char)0x00);
    var4 = var6;
    goto RET_LABEL5;
  RET_LABEL5:
    (void)0;
  }
}
if (var4) {
  var = 1l;
  goto RET_LABEL;
} else {
  {{var9 = self & ((unsigned char)0xe0);
  var7 = var9;
  goto RET_LABEL8;
RET_LABEL8:
  (void)0;
}
}
{
  {
    var12 = var7 == ((unsigned char)0xc0);
    var10 = var12;
    goto RET_LABEL11;
  RET_LABEL11:
    (void)0;
  }
}
if (var10) {
  var = 2l;
  goto RET_LABEL;
} else {
  {{var15 = self & ((unsigned char)0xf0);
  var13 = var15;
  goto RET_LABEL14;
RET_LABEL14:
  (void)0;
}
}
{
  {
    var18 = var13 == ((unsigned char)0xe0);
    var16 = var18;
    goto RET_LABEL17;
  RET_LABEL17:
    (void)0;
  }
}
if (var16) {
  var = 3l;
  goto RET_LABEL;
} else {
  {{var21 = self & ((unsigned char)0xf8);
  var19 = var21;
  goto RET_LABEL20;
RET_LABEL20:
  (void)0;
}
}
{
  {
    var24 = var19 == ((unsigned char)0xf0);
    var22 = var24;
    goto RET_LABEL23;
  RET_LABEL23:
    (void)0;
  }
}
if (var22) {
  var = 4l;
  goto RET_LABEL;
} else {
  var = 1l;
  goto RET_LABEL;
}
}
}
}
RET_LABEL:;
return var;
}


x86 assembly (clang, -O0):
<core__native___Byte___u8len>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movzbl -0x1(%rbp),%eax
and    $0x80,%eax
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%al
mov    %al,-0x11(%rbp)
movzbl -0x11(%rbp),%eax
cmp    $0x0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %ax,-0x16(%rbp)
mov    -0x16(%rbp),%ax
mov    %ax,-0x14(%rbp)
cmpw   $0x0,-0x14(%rbp)
je     114f <core__native___Byte___u8len+0x4f>
movq   $0x1,-0x10(%rbp)
jmp    122c <core__native___Byte___u8len+0x12c>
movzbl -0x1(%rbp),%eax
and    $0xe0,%eax
mov    %al,-0x18(%rbp)
mov    -0x18(%rbp),%al
mov    %al,-0x17(%rbp)
movzbl -0x17(%rbp),%eax
cmp    $0xc0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %ax,-0x1c(%rbp)
mov    -0x1c(%rbp),%ax
mov    %ax,-0x1a(%rbp)
cmpw   $0x0,-0x1a(%rbp)
je     1196 <core__native___Byte___u8len+0x96>
movq   $0x2,-0x10(%rbp)
jmp    122c <core__native___Byte___u8len+0x12c>
movzbl -0x1(%rbp),%eax
and    $0xf0,%eax
mov    %al,-0x1e(%rbp)
mov    -0x1e(%rbp),%al
mov    %al,-0x1d(%rbp)
movzbl -0x1d(%rbp),%eax
cmp    $0xe0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %ax,-0x22(%rbp)
mov    -0x22(%rbp),%ax
mov    %ax,-0x20(%rbp)
cmpw   $0x0,-0x20(%rbp)
je     11dd <core__native___Byte___u8len+0xdd>
movq   $0x3,-0x10(%rbp)
jmp    122c <core__native___Byte___u8len+0x12c>
movzbl -0x1(%rbp),%eax
and    $0xf8,%eax
mov    %al,-0x24(%rbp)
mov    -0x24(%rbp),%al
mov    %al,-0x23(%rbp)
movzbl -0x23(%rbp),%eax
cmp    $0xf0,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %ax,-0x28(%rbp)
mov    -0x28(%rbp),%ax
mov    %ax,-0x26(%rbp)
cmpw   $0x0,-0x26(%rbp)
je     1224 <core__native___Byte___u8len+0x124>
movq   $0x4,-0x10(%rbp)
jmp    122c <core__native___Byte___u8len+0x12c>
movq   $0x1,-0x10(%rbp)
mov    -0x10(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<core__native___Byte___u8len>:
mov    $0x1,%eax
test   %dil,%dil
js     110b <core__native___Byte___u8len+0xb>
ret
mov    %edi,%ecx
and    $0xe0,%cl
mov    $0x2,%eax
cmp    $0xc0,%cl
je     110a <core__native___Byte___u8len+0xa>
mov    %edi,%ecx
and    $0xf0,%cl
mov    $0x3,%eax
cmp    $0xe0,%cl
je     110a <core__native___Byte___u8len+0xa>
and    $0xf8,%dil
xor    %eax,%eax
cmp    $0xf0,%dil
sete   %al
lea    (%rax,%rax,2),%rax
add    $0x1,%rax
ret

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

LLVM IR (-O2):
define i64 @core__native___Byte___u8len(i8 zeroext %0) {
%2 = icmp slt i8 %0, 0
br i1 %2, label %3, label %13
3: ; preds = %1
%4 = and i8 %0, -32
%5 = icmp eq i8 %4, -64
br i1 %5, label %13, label %6
6: ; preds = %3
%7 = and i8 %0, -16
%8 = icmp eq i8 %7, -32
br i1 %8, label %13, label %9
9: ; preds = %6
%10 = and i8 %0, -8
%11 = icmp eq i8 %10, -16
%12 = select i1 %11, i64 4, i64 1
br label %13
13: ; preds = %9, %6, %3, %1
%14 = phi i64 [ 1, %1 ], [ 2, %3 ], [ 3, %6 ], [ %12, %9 ]
ret i64 %14
}