int byg_detect(int *text, int n) {
  int Tc;
  int i = 0;
  int s = 0;
  int T[256];
  for (i = 0; i < 256; i++) {
    T[i] = 0;
  }
  int mb = 1;
  char *unique_aa = "BDEFHIJKLMNOPQRSVWYZ";
  int aacode[26] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  -1, 9,  10, 11,
                    12, 23, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22};
  for (i = 0; i < 20; i++) {
    if (aacode[unique_aa[i] - 65] >= 0) {
      T[(int)aacode[unique_aa[i] - 65]] |= 1;
    }
  }
  for (i = 0; i < n; i++) {
    if (text[i] != -1) {
      s <<= 1;
      s |= 1;
      Tc = T[text[i]];
      s &= Tc;
      if (s & mb) {
        return 0;
      }
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<byg_detect>:
push   %rbp
mov    %rsp,%rbp
sub    $0x4a0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x100,-0x1c(%rbp)
jge    1161 <byg_detect+0x51>
movslq -0x1c(%rbp),%rax
movl   $0x0,-0x420(%rbp,%rax,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1137 <byg_detect+0x27>
movl   $0x1,-0x424(%rbp)
lea    0xe8e(%rip),%rax
mov    %rax,-0x430(%rbp)
lea    -0x4a0(%rbp),%rdi
lea    0xe99(%rip),%rsi
mov    $0x68,%edx
call   1030 <memcpy@plt>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x14,-0x1c(%rbp)
jge    1204 <byg_detect+0xf4>
mov    -0x430(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
cltq
cmpl   $0x0,-0x4a0(%rbp,%rax,4)
jl     11f1 <byg_detect+0xe1>
mov    -0x430(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
cltq
movslq -0x4a0(%rbp,%rax,4),%rax
ff
mov    -0x420(%rbp,%rax,4),%ecx
or     $0x1,%ecx
mov    %ecx,-0x420(%rbp,%rax,4)
jmp    11f6 <byg_detect+0xe6>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1198 <byg_detect+0x88>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1290 <byg_detect+0x180>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpl   $0xffffffff,(%rax,%rcx,4)
je     127d <byg_detect+0x16d>
mov    -0x20(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
mov    -0x420(%rbp,%rax,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
and    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
and    -0x424(%rbp),%eax
cmp    $0x0,%eax
je     1278 <byg_detect+0x168>
movl   $0x0,-0x4(%rbp)
jmp    1297 <byg_detect+0x187>
jmp    127d <byg_detect+0x16d>
jmp    1282 <byg_detect+0x172>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    120b <byg_detect+0xfb>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x4a0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<byg_detect>:
push   %rbp
push   %rbx
sub    $0x408,%rsp
mov    %esi,%ebp
mov    %rdi,%rbx
mov    %rsp,%rdi
mov    $0x400,%edx
xor    %esi,%esi
call   1030 <memset@plt>
mov    $0x1,%eax
lea    0xec7(%rip),%rcx
lea    0xee0(%rip),%rdx
jmp    115a <byg_detect+0x4a>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x2,%rax
cmp    $0x15,%rax
je     118b <byg_detect+0x7b>
movsbq -0x1(%rax,%rcx,1),%rsi
cmp    $0x4a,%rsi
je     1172 <byg_detect+0x62>
movslq -0x104(%rdx,%rsi,4),%rsi
ff
orb    $0x1,(%rsp,%rsi,4)
movsbq (%rax,%rcx,1),%rsi
cmp    $0x4a,%rsi
je     1150 <byg_detect+0x40>
movslq -0x104(%rdx,%rsi,4),%rsi
ff
orb    $0x1,(%rsp,%rsi,4)
jmp    1150 <byg_detect+0x40>
mov    $0x1,%eax
test   %ebp,%ebp
jle    11bb <byg_detect+0xab>
mov    %ebp,%ecx
xor    %edx,%edx
jmp    11a9 <byg_detect+0x99>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rdx
cmp    %rdx,%rcx
je     11bb <byg_detect+0xab>
movslq (%rbx,%rdx,4),%rsi
cmp    $0xffffffffffffffff,%rsi
je     11a0 <byg_detect+0x90>
testb  $0x1,(%rsp,%rsi,4)
je     11a0 <byg_detect+0x90>
xor    %eax,%eax
add    $0x408,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@.str = [21 x i8] c"BDEFHIJKLMNOPQRSVWYZ\00"
@__const.byg_detect.aacode = [26 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 -1, i32 9, i32 10, i32 11, i32 12, i32 23, i32 13, i32 14, i32 15, i32 16, i32 17, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22]
define i32 @byg_detect(i32* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca [256 x i32]
%10 = alloca i32
%11 = alloca i8*
%12 = alloca [26 x i32]
store i32* %0, i32** %4
store i32 %1, i32* %5
store i32 0, i32* %7
store i32 0, i32* %8
store i32 0, i32* %7
br label %13
13: ; preds = %20, %2
%14 = load i32, i32* %7
%15 = icmp slt i32 %14, 256
br i1 %15, label %16, label %23
16: ; preds = %13
%17 = load i32, i32* %7
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds [256 x i32], [256 x i32]* %9, i64 0, i64 %18
store i32 0, i32* %19
br label %20
20: ; preds = %16
%21 = load i32, i32* %7
%22 = add nsw i32 %21, 1
store i32 %22, i32* %7
br label %13
23: ; preds = %13
store i32 1, i32* %10
store i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str, i64 0, i64 0), i8** %11
%24 = bitcast [26 x i32]* %12 to i8*
store i32 0, i32* %7
br label %25
25: ; preds = %56, %23
%26 = load i32, i32* %7
%27 = icmp slt i32 %26, 20
br i1 %27, label %28, label %59
28: ; preds = %25
%29 = load i8*, i8** %11
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = sub nsw i32 %34, 65
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [26 x i32], [26 x i32]* %12, i64 0, i64 %36
%38 = load i32, i32* %37
%39 = icmp sge i32 %38, 0
br i1 %39, label %40, label %55
40: ; preds = %28
%41 = load i8*, i8** %11
%42 = load i32, i32* %7
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %41, i64 %43
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = sub nsw i32 %46, 65
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [26 x i32], [26 x i32]* %12, i64 0, i64 %48
%50 = load i32, i32* %49
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds [256 x i32], [256 x i32]* %9, i64 0, i64 %51
%53 = load i32, i32* %52
%54 = or i32 %53, 1
store i32 %54, i32* %52
br label %55
55: ; preds = %40, %28
br label %56
56: ; preds = %55
%57 = load i32, i32* %7
%58 = add nsw i32 %57, 1
store i32 %58, i32* %7
br label %25
59: ; preds = %25
store i32 0, i32* %7
br label %60
60: ; preds = %94, %59
%61 = load i32, i32* %7
%62 = load i32, i32* %5
%63 = icmp slt i32 %61, %62
br i1 %63, label %64, label %97
64: ; preds = %60
%65 = load i32*, i32** %4
%66 = load i32, i32* %7
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i32, i32* %65, i64 %67
%69 = load i32, i32* %68
%70 = icmp ne i32 %69, -1
br i1 %70, label %71, label %93
71: ; preds = %64
%72 = load i32, i32* %8
%73 = shl i32 %72, 1
store i32 %73, i32* %8
%74 = load i32, i32* %8
%75 = or i32 %74, 1
store i32 %75, i32* %8
%76 = load i32*, i32** %4
%77 = load i32, i32* %7
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i32, i32* %76, i64 %78
%80 = load i32, i32* %79
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds [256 x i32], [256 x i32]* %9, i64 0, i64 %81
%83 = load i32, i32* %82
store i32 %83, i32* %6
%84 = load i32, i32* %6
%85 = load i32, i32* %8
%86 = and i32 %85, %84
store i32 %86, i32* %8
%87 = load i32, i32* %8
%88 = load i32, i32* %10
%89 = and i32 %87, %88
%90 = icmp ne i32 %89, 0
br i1 %90, label %91, label %92
91: ; preds = %71
store i32 0, i32* %3
br label %98
92: ; preds = %71
br label %93
93: ; preds = %92, %64
br label %94
94: ; preds = %93
%95 = load i32, i32* %7
%96 = add nsw i32 %95, 1
store i32 %96, i32* %7
br label %60
97: ; preds = %60
store i32 1, i32* %3
br label %98
98: ; preds = %97, %91
%99 = load i32, i32* %3
ret i32 %99
}

LLVM IR (-O2):
@.str = [21 x i8] c"BDEFHIJKLMNOPQRSVWYZ\00"
@__const.byg_detect.aacode = [26 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 -1, i32 9, i32 10, i32 11, i32 12, i32 23, i32 13, i32 14, i32 15, i32 16, i32 17, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22]
define i32 @byg_detect(i32* nocapture %0, i32 %1) {
%3 = alloca [256 x i32]
%4 = bitcast [256 x i32]* %3 to i8*
br label %9
5: ; preds = %37
%6 = icmp sgt i32 %1, 0
br i1 %6, label %7, label %54
7: ; preds = %5
%8 = zext i32 %1 to i64
br label %40
9: ; preds = %37, %2
%10 = phi i64 [ 0, %2 ], [ %38, %37 ]
%11 = getelementptr inbounds [21 x i8], [21 x i8]* @.str, i64 0, i64 %10
%12 = load i8, i8* %11
%13 = sext i8 %12 to i64
%14 = add nsw i64 %13, -65
%15 = icmp eq i64 %14, 9
br i1 %15, label %23, label %16
16: ; preds = %9
%17 = getelementptr inbounds [26 x i32], [26 x i32]* @__const.byg_detect.aacode, i64 0, i64 %14
%18 = load i32, i32* %17
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %19
%21 = load i32, i32* %20
%22 = or i32 %21, 1
store i32 %22, i32* %20
br label %23
23: ; preds = %9, %16
%24 = or i64 %10, 1
%25 = getelementptr inbounds [21 x i8], [21 x i8]* @.str, i64 0, i64 %24
%26 = load i8, i8* %25
%27 = sext i8 %26 to i64
%28 = add nsw i64 %27, -65
%29 = icmp eq i64 %28, 9
br i1 %29, label %37, label %30
30: ; preds = %23
%31 = getelementptr inbounds [26 x i32], [26 x i32]* @__const.byg_detect.aacode, i64 0, i64 %28
%32 = load i32, i32* %31
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %33
%35 = load i32, i32* %34
%36 = or i32 %35, 1
store i32 %36, i32* %34
br label %37
37: ; preds = %30, %23
%38 = add nuw nsw i64 %10, 2
%39 = icmp eq i64 %38, 20
br i1 %39, label %5, label %9
40: ; preds = %7, %51
%41 = phi i64 [ 0, %7 ], [ %52, %51 ]
%42 = getelementptr inbounds i32, i32* %0, i64 %41
%43 = load i32, i32* %42
%44 = icmp eq i32 %43, -1
br i1 %44, label %51, label %45
45: ; preds = %40
%46 = sext i32 %43 to i64
%47 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %46
%48 = load i32, i32* %47
%49 = and i32 %48, 1
%50 = icmp eq i32 %49, 0
br i1 %50, label %51, label %54
51: ; preds = %40, %45
%52 = add nuw nsw i64 %41, 1
%53 = icmp eq i64 %52, %8
br i1 %53, label %54, label %40
54: ; preds = %45, %51, %5
%55 = phi i32 [ 1, %5 ], [ 1, %51 ], [ 0, %45 ]
ret i32 %55
}