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++) {
    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    11dd <byg_detect+0xcd>
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)
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    1269 <byg_detect+0x159>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpl   $0xffffffff,(%rax,%rcx,4)
je     1256 <byg_detect+0x146>
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     1251 <byg_detect+0x141>
movl   $0x0,-0x4(%rbp)
jmp    1270 <byg_detect+0x160>
jmp    1256 <byg_detect+0x146>
jmp    125b <byg_detect+0x14b>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11e4 <byg_detect+0xd4>
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
movsbq -0x1(%rax,%rcx,1),%rsi
movslq -0x104(%rdx,%rsi,4),%rsi
ff
orb    $0x1,(%rsp,%rsi,4)
movsbq (%rax,%rcx,1),%rsi
movslq -0x104(%rdx,%rsi,4),%rsi
ff
orb    $0x1,(%rsp,%rsi,4)
add    $0x2,%rax
cmp    $0x15,%rax
jne    1140 <byg_detect+0x30>
mov    $0x1,%eax
test   %ebp,%ebp
jle    119b <byg_detect+0x8b>
mov    %ebp,%ecx
xor    %edx,%edx
jmp    1189 <byg_detect+0x79>
nopl   0x0(%rax)
add    $0x1,%rdx
cmp    %rdx,%rcx
je     119b <byg_detect+0x8b>
movslq (%rbx,%rdx,4),%rsi
cmp    $0xffffffffffffffff,%rsi
je     1180 <byg_detect+0x70>
testb  $0x1,(%rsp,%rsi,4)
je     1180 <byg_detect+0x70>
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 = %43, %23
%26 = load i32, i32* %7
%27 = icmp slt i32 %26, 20
br i1 %27, label %28, label %46
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 = sext i32 %38 to i64
%40 = getelementptr inbounds [256 x i32], [256 x i32]* %9, i64 0, i64 %39
%41 = load i32, i32* %40
%42 = or i32 %41, 1
store i32 %42, i32* %40
br label %43
43: ; preds = %28
%44 = load i32, i32* %7
%45 = add nsw i32 %44, 1
store i32 %45, i32* %7
br label %25
46: ; preds = %25
store i32 0, i32* %7
br label %47
47: ; preds = %81, %46
%48 = load i32, i32* %7
%49 = load i32, i32* %5
%50 = icmp slt i32 %48, %49
br i1 %50, label %51, label %84
51: ; preds = %47
%52 = load i32*, i32** %4
%53 = load i32, i32* %7
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i32, i32* %52, i64 %54
%56 = load i32, i32* %55
%57 = icmp ne i32 %56, -1
br i1 %57, label %58, label %80
58: ; preds = %51
%59 = load i32, i32* %8
%60 = shl i32 %59, 1
store i32 %60, i32* %8
%61 = load i32, i32* %8
%62 = or i32 %61, 1
store i32 %62, i32* %8
%63 = load i32*, i32** %4
%64 = load i32, i32* %7
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i32, i32* %63, i64 %65
%67 = load i32, i32* %66
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds [256 x i32], [256 x i32]* %9, i64 0, i64 %68
%70 = load i32, i32* %69
store i32 %70, i32* %6
%71 = load i32, i32* %6
%72 = load i32, i32* %8
%73 = and i32 %72, %71
store i32 %73, i32* %8
%74 = load i32, i32* %8
%75 = load i32, i32* %10
%76 = and i32 %74, %75
%77 = icmp ne i32 %76, 0
br i1 %77, label %78, label %79
78: ; preds = %58
store i32 0, i32* %3
br label %85
79: ; preds = %58
br label %80
80: ; preds = %79, %51
br label %81
81: ; preds = %80
%82 = load i32, i32* %7
%83 = add nsw i32 %82, 1
store i32 %83, i32* %7
br label %47
84: ; preds = %47
store i32 1, i32* %3
br label %85
85: ; preds = %84, %78
%86 = load i32, i32* %3
ret i32 %86
}

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 = %9
%6 = icmp sgt i32 %1, 0
br i1 %6, label %7, label %48
7: ; preds = %5
%8 = zext i32 %1 to i64
br label %34
9: ; preds = %9, %2
%10 = phi i64 [ 0, %2 ], [ %32, %9 ]
%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 = getelementptr inbounds [26 x i32], [26 x i32]* @__const.byg_detect.aacode, i64 0, i64 %14
%16 = load i32, i32* %15
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %17
%19 = load i32, i32* %18
%20 = or i32 %19, 1
store i32 %20, i32* %18
%21 = or i64 %10, 1
%22 = getelementptr inbounds [21 x i8], [21 x i8]* @.str, i64 0, i64 %21
%23 = load i8, i8* %22
%24 = sext i8 %23 to i64
%25 = add nsw i64 %24, -65
%26 = getelementptr inbounds [26 x i32], [26 x i32]* @__const.byg_detect.aacode, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %28
%30 = load i32, i32* %29
%31 = or i32 %30, 1
store i32 %31, i32* %29
%32 = add nuw nsw i64 %10, 2
%33 = icmp eq i64 %32, 20
br i1 %33, label %5, label %9
34: ; preds = %7, %45
%35 = phi i64 [ 0, %7 ], [ %46, %45 ]
%36 = getelementptr inbounds i32, i32* %0, i64 %35
%37 = load i32, i32* %36
%38 = icmp eq i32 %37, -1
br i1 %38, label %45, label %39
39: ; preds = %34
%40 = sext i32 %37 to i64
%41 = getelementptr inbounds [256 x i32], [256 x i32]* %3, i64 0, i64 %40
%42 = load i32, i32* %41
%43 = and i32 %42, 1
%44 = icmp eq i32 %43, 0
br i1 %44, label %45, label %48
45: ; preds = %34, %39
%46 = add nuw nsw i64 %35, 1
%47 = icmp eq i64 %46, %8
br i1 %47, label %48, label %34
48: ; preds = %39, %45, %5
%49 = phi i32 [ 1, %5 ], [ 1, %45 ], [ 0, %39 ]
ret i32 %49
}