int ftype(unsigned char *data, int *type, int *ns, int *nr, int *pf,
          int extseq) {
  *ns = *nr = 0;
  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)
mov    -0x28(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
cmpl   $0x0,-0x34(%rbp)
je     122c <ftype+0x12c>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    11a5 <ftype+0xa5>
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    1304 <ftype+0x204>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11e4 <ftype+0xe4>
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    1304 <ftype+0x204>
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    1304 <ftype+0x204>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    128b <ftype+0x18b>
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    1304 <ftype+0x204>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     12ca <ftype+0x1ca>
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    1304 <ftype+0x204>
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>:
movl   $0x0,(%rcx)
movl   $0x0,(%rdx)
movzbl (%rdi),%eax
test   %r9d,%r9d
je     1127 <ftype+0x27>
test   $0x1,%al
jne    113d <ftype+0x3d>
movl   $0x0,(%rsi)
movzbl (%rdi),%eax
shr    %eax
mov    %eax,(%rdx)
jmp    1143 <ftype+0x43>
test   $0x1,%al
jne    1158 <ftype+0x58>
movl   $0x0,(%rsi)
movzbl (%rdi),%eax
shr    %eax
and    $0x7,%eax
mov    %eax,(%rdx)
jmp    1161 <ftype+0x61>
test   $0x2,%al
jne    116b <ftype+0x6b>
mov    %eax,(%rsi)
movzbl 0x1(%rdi),%eax
add    $0x1,%rdi
shr    %eax
mov    %eax,(%rcx)
mov    $0x2,%eax
mov    $0x1,%cl
jmp    1177 <ftype+0x77>
test   $0x2,%al
jne    116b <ftype+0x6b>
and    $0xf,%eax
mov    %eax,(%rsi)
movzbl (%rdi),%eax
shr    $0x5,%eax
mov    %eax,(%rcx)
jmp    1170 <ftype+0x70>
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** %11
store i32 0, i32* %14
%15 = load i32*, i32** %10
store i32 0, i32* %15
%16 = load i32, i32* %13
%17 = icmp ne i32 %16, 0
br i1 %17, label %18, label %80
18: ; preds = %6
%19 = load i8*, i8** %8
%20 = load i8, i8* %19
%21 = zext i8 %20 to i32
%22 = and i32 %21, 1
%23 = icmp eq i32 %22, 0
br i1 %23, label %24, label %45
24: ; preds = %18
%25 = load i32*, i32** %9
store i32 0, i32* %25
%26 = load i8*, i8** %8
%27 = load i8, i8* %26
%28 = zext i8 %27 to i32
%29 = ashr i32 %28, 1
%30 = and i32 %29, 127
%31 = load i32*, i32** %10
store i32 %30, i32* %31
%32 = load i8*, i8** %8
%33 = getelementptr inbounds i8, i8* %32, i32 1
store i8* %33, i8** %8
%34 = load i8*, i8** %8
%35 = load i8, i8* %34
%36 = zext i8 %35 to i32
%37 = ashr i32 %36, 1
%38 = and i32 %37, 127
%39 = load i32*, i32** %11
store i32 %38, i32* %39
%40 = load i8*, i8** %8
%41 = load i8, i8* %40
%42 = zext i8 %41 to i32
%43 = and i32 %42, 1
%44 = load i32*, i32** %12
store i32 %43, i32* %44
store i32 2, i32* %7
br label %139
45: ; preds = %18
%46 = load i8*, i8** %8
%47 = load i8, i8* %46
%48 = zext i8 %47 to i32
%49 = and i32 %48, 2
%50 = icmp ne i32 %49, 0
br i1 %50, label %51, label %62
51: ; preds = %45
%52 = load i8*, i8** %8
%53 = load i8, i8* %52
%54 = zext i8 %53 to i32
%55 = and i32 %54, -17
%56 = load i32*, i32** %9
store i32 %55, i32* %56
%57 = load i8*, i8** %8
%58 = load i8, i8* %57
%59 = zext i8 %58 to i32
%60 = and i32 %59, 16
%61 = load i32*, i32** %12
store i32 %60, i32* %61
store i32 1, i32* %7
br label %139
62: ; preds = %45
%63 = load i8*, i8** %8
%64 = load i8, i8* %63
%65 = zext i8 %64 to i32
%66 = load i32*, i32** %9
store i32 %65, i32* %66
%67 = load i8*, i8** %8
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %8
%69 = load i8*, i8** %8
%70 = load i8, i8* %69
%71 = zext i8 %70 to i32
%72 = ashr i32 %71, 1
%73 = and i32 %72, 127
%74 = load i32*, i32** %11
store i32 %73, i32* %74
%75 = load i8*, i8** %8
%76 = load i8, i8* %75
%77 = zext i8 %76 to i32
%78 = and i32 %77, 1
%79 = load i32*, i32** %12
store i32 %78, i32* %79
store i32 2, i32* %7
br label %139
80: ; preds = %6
%81 = load i8*, i8** %8
%82 = load i8, i8* %81
%83 = zext i8 %82 to i32
%84 = and i32 %83, 1
%85 = icmp eq i32 %84, 0
br i1 %85, label %86, label %105
86: ; preds = %80
%87 = load i32*, i32** %9
store i32 0, i32* %87
%88 = load i8*, i8** %8
%89 = load i8, i8* %88
%90 = zext i8 %89 to i32
%91 = ashr i32 %90, 1
%92 = and i32 %91, 7
%93 = load i32*, i32** %10
store i32 %92, i32* %93
%94 = load i8*, i8** %8
%95 = load i8, i8* %94
%96 = zext i8 %95 to i32
%97 = ashr i32 %96, 5
%98 = and i32 %97, 7
%99 = load i32*, i32** %11
store i32 %98, i32* %99
%100 = load i8*, i8** %8
%101 = load i8, i8* %100
%102 = zext i8 %101 to i32
%103 = and i32 %102, 16
%104 = load i32*, i32** %12
store i32 %103, i32* %104
store i32 1, i32* %7
br label %139
105: ; preds = %80
%106 = load i8*, i8** %8
%107 = load i8, i8* %106
%108 = zext i8 %107 to i32
%109 = and i32 %108, 2
%110 = icmp ne i32 %109, 0
br i1 %110, label %111, label %122
111: ; preds = %105
%112 = load i8*, i8** %8
%113 = load i8, i8* %112
%114 = zext i8 %113 to i32
%115 = and i32 %114, -17
%116 = load i32*, i32** %9
store i32 %115, i32* %116
%117 = load i8*, i8** %8
%118 = load i8, i8* %117
%119 = zext i8 %118 to i32
%120 = and i32 %119, 16
%121 = load i32*, i32** %12
store i32 %120, i32* %121
store i32 1, i32* %7
br label %139
122: ; preds = %105
%123 = load i8*, i8** %8
%124 = load i8, i8* %123
%125 = zext i8 %124 to i32
%126 = and i32 %125, 15
%127 = load i32*, i32** %9
store i32 %126, i32* %127
%128 = load i8*, i8** %8
%129 = load i8, i8* %128
%130 = zext i8 %129 to i32
%131 = ashr i32 %130, 5
%132 = and i32 %131, 7
%133 = load i32*, i32** %11
store i32 %132, i32* %133
%134 = load i8*, i8** %8
%135 = load i8, i8* %134
%136 = zext i8 %135 to i32
%137 = and i32 %136, 16
%138 = load i32*, i32** %12
store i32 %137, i32* %138
store i32 1, i32* %7
br label %139
139: ; preds = %122, %111, %86, %62, %51, %24
%140 = load i32, i32* %7
ret i32 %140
}

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) {
store i32 0, i32* %3
store i32 0, i32* %2
%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
}