int ftype(unsigned char *data, int *type, int *ns, int *nr, int *pf,
          int extseq) {
  if (extseq) {
    if ((*data & 0x01) == 0) {
      *type = 0x00;
      *ns = (*data >> 1) & 127;
      data++;
      *nr = (*data >> 1) & 127;
      *pf = *data & 0x01;
      return 2;
    }
    if (*data & 0x02) {
      *type = *data & ~0x10;
      *pf = *data & 0x10;
      return 1;
    } else {
      *type = *data;
      data++;
      *nr = (*data >> 1) & 127;
      *pf = *data & 0x01;
      return 2;
    }
  } else {
    if ((*data & 0x01) == 0) {
      *type = 0x00;
      *ns = (*data >> 1) & 7;
      *nr = (*data >> 5) & 7;
      *pf = *data & 0x10;
      return 1;
    }
    if (*data & 0x02) {
      *type = *data & ~0x10;
      *pf = *data & 0x10;
      return 1;
    } else {
      *type = *data & 0x0F;
      *nr = (*data >> 5) & 7;
      *pf = *data & 0x10;
      return 1;
    }
  }
}


x86 assembly (clang, -O0):
<ftype>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9d,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
je     1218 <ftype+0x118>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    1191 <ftype+0x91>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x1,%ecx
and    $0x7f,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x1,%ecx
and    $0x7f,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x1,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    12f0 <ftype+0x1f0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11d0 <ftype+0xd0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffffef,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x10,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12f0 <ftype+0x1f0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x1,%ecx
and    $0x7f,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x1,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    12f0 <ftype+0x1f0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    1277 <ftype+0x177>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x1,%ecx
and    $0x7,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x5,%ecx
and    $0x7,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x10,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12f0 <ftype+0x1f0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     12b6 <ftype+0x1b6>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xffffffef,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x10,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12f0 <ftype+0x1f0>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0xf,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
sar    $0x5,%ecx
and    $0x7,%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
and    $0x10,%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ftype>:
movzbl (%rdi),%eax
test   %r9d,%r9d
je     111b <ftype+0x1b>
test   $0x1,%al
jne    1131 <ftype+0x31>
movl   $0x0,(%rsi)
movzbl (%rdi),%eax
shr    %eax
mov    %eax,(%rdx)
jmp    1137 <ftype+0x37>
test   $0x1,%al
jne    114c <ftype+0x4c>
movl   $0x0,(%rsi)
movzbl (%rdi),%eax
shr    %eax
and    $0x7,%eax
mov    %eax,(%rdx)
jmp    1155 <ftype+0x55>
test   $0x2,%al
jne    115f <ftype+0x5f>
mov    %eax,(%rsi)
movzbl 0x1(%rdi),%eax
add    $0x1,%rdi
shr    %eax
mov    %eax,(%rcx)
mov    $0x2,%eax
mov    $0x1,%cl
jmp    116b <ftype+0x6b>
test   $0x2,%al
jne    115f <ftype+0x5f>
and    $0xf,%eax
mov    %eax,(%rsi)
movzbl (%rdi),%eax
shr    $0x5,%eax
mov    %eax,(%rcx)
jmp    1164 <ftype+0x64>
and    $0xffffffef,%eax
mov    %eax,(%rsi)
mov    $0x1,%eax
mov    $0x10,%cl
and    (%rdi),%cl
movzbl %cl,%ecx
mov    %ecx,(%r8)
ret

LLVM IR (-O0):
define i32 @ftype(i8* %0, i32* %1, i32* %2, i32* %3, i32* %4, i32 %5) {
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32*
%13 = alloca i32
store i8* %0, i8** %8
store i32* %1, i32** %9
store i32* %2, i32** %10
store i32* %3, i32** %11
store i32* %4, i32** %12
store i32 %5, i32* %13
%14 = load i32, i32* %13
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %78
16: ; preds = %6
%17 = load i8*, i8** %8
%18 = load i8, i8* %17
%19 = zext i8 %18 to i32
%20 = and i32 %19, 1
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %43
22: ; preds = %16
%23 = load i32*, i32** %9
store i32 0, i32* %23
%24 = load i8*, i8** %8
%25 = load i8, i8* %24
%26 = zext i8 %25 to i32
%27 = ashr i32 %26, 1
%28 = and i32 %27, 127
%29 = load i32*, i32** %10
store i32 %28, i32* %29
%30 = load i8*, i8** %8
%31 = getelementptr inbounds i8, i8* %30, i32 1
store i8* %31, i8** %8
%32 = load i8*, i8** %8
%33 = load i8, i8* %32
%34 = zext i8 %33 to i32
%35 = ashr i32 %34, 1
%36 = and i32 %35, 127
%37 = load i32*, i32** %11
store i32 %36, i32* %37
%38 = load i8*, i8** %8
%39 = load i8, i8* %38
%40 = zext i8 %39 to i32
%41 = and i32 %40, 1
%42 = load i32*, i32** %12
store i32 %41, i32* %42
store i32 2, i32* %7
br label %137
43: ; preds = %16
%44 = load i8*, i8** %8
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = and i32 %46, 2
%48 = icmp ne i32 %47, 0
br i1 %48, label %49, label %60
49: ; preds = %43
%50 = load i8*, i8** %8
%51 = load i8, i8* %50
%52 = zext i8 %51 to i32
%53 = and i32 %52, -17
%54 = load i32*, i32** %9
store i32 %53, i32* %54
%55 = load i8*, i8** %8
%56 = load i8, i8* %55
%57 = zext i8 %56 to i32
%58 = and i32 %57, 16
%59 = load i32*, i32** %12
store i32 %58, i32* %59
store i32 1, i32* %7
br label %137
60: ; preds = %43
%61 = load i8*, i8** %8
%62 = load i8, i8* %61
%63 = zext i8 %62 to i32
%64 = load i32*, i32** %9
store i32 %63, i32* %64
%65 = load i8*, i8** %8
%66 = getelementptr inbounds i8, i8* %65, i32 1
store i8* %66, i8** %8
%67 = load i8*, i8** %8
%68 = load i8, i8* %67
%69 = zext i8 %68 to i32
%70 = ashr i32 %69, 1
%71 = and i32 %70, 127
%72 = load i32*, i32** %11
store i32 %71, i32* %72
%73 = load i8*, i8** %8
%74 = load i8, i8* %73
%75 = zext i8 %74 to i32
%76 = and i32 %75, 1
%77 = load i32*, i32** %12
store i32 %76, i32* %77
store i32 2, i32* %7
br label %137
78: ; preds = %6
%79 = load i8*, i8** %8
%80 = load i8, i8* %79
%81 = zext i8 %80 to i32
%82 = and i32 %81, 1
%83 = icmp eq i32 %82, 0
br i1 %83, label %84, label %103
84: ; preds = %78
%85 = load i32*, i32** %9
store i32 0, i32* %85
%86 = load i8*, i8** %8
%87 = load i8, i8* %86
%88 = zext i8 %87 to i32
%89 = ashr i32 %88, 1
%90 = and i32 %89, 7
%91 = load i32*, i32** %10
store i32 %90, i32* %91
%92 = load i8*, i8** %8
%93 = load i8, i8* %92
%94 = zext i8 %93 to i32
%95 = ashr i32 %94, 5
%96 = and i32 %95, 7
%97 = load i32*, i32** %11
store i32 %96, i32* %97
%98 = load i8*, i8** %8
%99 = load i8, i8* %98
%100 = zext i8 %99 to i32
%101 = and i32 %100, 16
%102 = load i32*, i32** %12
store i32 %101, i32* %102
store i32 1, i32* %7
br label %137
103: ; preds = %78
%104 = load i8*, i8** %8
%105 = load i8, i8* %104
%106 = zext i8 %105 to i32
%107 = and i32 %106, 2
%108 = icmp ne i32 %107, 0
br i1 %108, label %109, label %120
109: ; preds = %103
%110 = load i8*, i8** %8
%111 = load i8, i8* %110
%112 = zext i8 %111 to i32
%113 = and i32 %112, -17
%114 = load i32*, i32** %9
store i32 %113, i32* %114
%115 = load i8*, i8** %8
%116 = load i8, i8* %115
%117 = zext i8 %116 to i32
%118 = and i32 %117, 16
%119 = load i32*, i32** %12
store i32 %118, i32* %119
store i32 1, i32* %7
br label %137
120: ; preds = %103
%121 = load i8*, i8** %8
%122 = load i8, i8* %121
%123 = zext i8 %122 to i32
%124 = and i32 %123, 15
%125 = load i32*, i32** %9
store i32 %124, i32* %125
%126 = load i8*, i8** %8
%127 = load i8, i8* %126
%128 = zext i8 %127 to i32
%129 = ashr i32 %128, 5
%130 = and i32 %129, 7
%131 = load i32*, i32** %11
store i32 %130, i32* %131
%132 = load i8*, i8** %8
%133 = load i8, i8* %132
%134 = zext i8 %133 to i32
%135 = and i32 %134, 16
%136 = load i32*, i32** %12
store i32 %135, i32* %136
store i32 1, i32* %7
br label %137
137: ; preds = %120, %109, %84, %60, %49, %22
%138 = load i32, i32* %7
ret i32 %138
}

LLVM IR (-O2):
define i32 @ftype(i8* nocapture %0, i32* nocapture writeonly %1, i32* nocapture writeonly %2, i32* nocapture writeonly %3, i32* nocapture writeonly %4, i32 %5) {
%7 = icmp eq i32 %5, 0
%8 = load i8, i8* %0
%9 = zext i8 %8 to i32
%10 = and i32 %9, 1
%11 = icmp eq i32 %10, 0
br i1 %7, label %31, label %12
12: ; preds = %6
br i1 %11, label %13, label %21
13: ; preds = %12
store i32 0, i32* %1
%14 = load i8, i8* %0
%15 = lshr i8 %14, 1
%16 = zext i8 %15 to i32
store i32 %16, i32* %2
%17 = getelementptr inbounds i8, i8* %0, i64 1
%18 = load i8, i8* %17
%19 = lshr i8 %18, 1
%20 = zext i8 %19 to i32
store i32 %20, i32* %3
br label %50
21: ; preds = %12
%22 = and i32 %9, 2
%23 = icmp eq i32 %22, 0
br i1 %23, label %26, label %24
24: ; preds = %21
%25 = and i32 %9, 239
store i32 %25, i32* %1
br label %50
26: ; preds = %21
store i32 %9, i32* %1
%27 = getelementptr inbounds i8, i8* %0, i64 1
%28 = load i8, i8* %27
%29 = lshr i8 %28, 1
%30 = zext i8 %29 to i32
store i32 %30, i32* %3
br label %50
31: ; preds = %6
br i1 %11, label %32, label %40
32: ; preds = %31
store i32 0, i32* %1
%33 = load i8, i8* %0
%34 = lshr i8 %33, 1
%35 = and i8 %34, 7
%36 = zext i8 %35 to i32
store i32 %36, i32* %2
%37 = load i8, i8* %0
%38 = lshr i8 %37, 5
%39 = zext i8 %38 to i32
store i32 %39, i32* %3
br label %50
40: ; preds = %31
%41 = and i32 %9, 2
%42 = icmp eq i32 %41, 0
br i1 %42, label %45, label %43
43: ; preds = %40
%44 = and i32 %9, 239
store i32 %44, i32* %1
br label %50
45: ; preds = %40
%46 = and i32 %9, 15
store i32 %46, i32* %1
%47 = load i8, i8* %0
%48 = lshr i8 %47, 5
%49 = zext i8 %48 to i32
store i32 %49, i32* %3
br label %50
50: ; preds = %45, %43, %32, %26, %24, %13
%51 = phi i8* [ %0, %45 ], [ %0, %43 ], [ %0, %32 ], [ %27, %26 ], [ %0, %24 ], [ %17, %13 ]
%52 = phi i8 [ 16, %45 ], [ 16, %43 ], [ 16, %32 ], [ 1, %26 ], [ 16, %24 ], [ 1, %13 ]
%53 = phi i32 [ 1, %45 ], [ 1, %43 ], [ 1, %32 ], [ 2, %26 ], [ 1, %24 ], [ 2, %13 ]
%54 = load i8, i8* %51
%55 = and i8 %54, %52
%56 = zext i8 %55 to i32
store i32 %56, i32* %4
ret i32 %53
}