int trinucleotide_pep(char a, char b, char c) {
  int freq_id;
  if (a == 'A' || a == 'a') {
    freq_id = 0;
  } else if (a == 'C' || a == 'c') {
    freq_id = 16;
  } else if (a == 'G' || a == 'g') {
    freq_id = 32;
  } else if (a == 'T' || a == 't') {
    freq_id = 48;
  } else {
    freq_id = 64;
  }
  if (freq_id < 64) {
    if (b == 'A' || b == 'a') {
      freq_id += 0;
    } else if (b == 'C' || b == 'c') {
      freq_id += 4;
    } else if (b == 'G' || b == 'g') {
      freq_id += 8;
    } else if (b == 'T' || b == 't') {
      freq_id += 12;
    } else {
      freq_id = 64;
    }
  }
  if (freq_id < 64) {
    if (c == 'A' || c == 'a') {
      freq_id += 0;
    } else if (c == 'C' || c == 'c') {
      freq_id += 1;
    } else if (c == 'G' || c == 'g') {
      freq_id += 2;
    } else if (c == 'T' || c == 't') {
      freq_id += 3;
    } else {
      freq_id = 64;
    }
  }
  return freq_id;
}


x86 assembly (clang, -O0):
<trinucleotide_pep>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %sil,%cl
mov    %dil,%dl
mov    %dl,-0x1(%rbp)
mov    %cl,-0x2(%rbp)
mov    %al,-0x3(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x41,%eax
je     112f <trinucleotide_pep+0x2f>
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
jne    113b <trinucleotide_pep+0x3b>
movl   $0x0,-0x8(%rbp)
jmp    11c3 <trinucleotide_pep+0xc3>
movsbl -0x1(%rbp),%eax
cmp    $0x43,%eax
je     1155 <trinucleotide_pep+0x55>
movsbl -0x1(%rbp),%eax
cmp    $0x63,%eax
jne    1161 <trinucleotide_pep+0x61>
movl   $0x10,-0x8(%rbp)
jmp    11be <trinucleotide_pep+0xbe>
movsbl -0x1(%rbp),%eax
cmp    $0x47,%eax
je     117b <trinucleotide_pep+0x7b>
movsbl -0x1(%rbp),%eax
cmp    $0x67,%eax
jne    1187 <trinucleotide_pep+0x87>
movl   $0x20,-0x8(%rbp)
jmp    11b9 <trinucleotide_pep+0xb9>
movsbl -0x1(%rbp),%eax
cmp    $0x54,%eax
je     11a1 <trinucleotide_pep+0xa1>
movsbl -0x1(%rbp),%eax
cmp    $0x74,%eax
jne    11ad <trinucleotide_pep+0xad>
movl   $0x30,-0x8(%rbp)
jmp    11b4 <trinucleotide_pep+0xb4>
movl   $0x40,-0x8(%rbp)
jmp    11b9 <trinucleotide_pep+0xb9>
jmp    11be <trinucleotide_pep+0xbe>
jmp    11c3 <trinucleotide_pep+0xc3>
cmpl   $0x40,-0x8(%rbp)
jge    1288 <trinucleotide_pep+0x188>
movsbl -0x2(%rbp),%eax
cmp    $0x41,%eax
je     11e7 <trinucleotide_pep+0xe7>
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jne    11f5 <trinucleotide_pep+0xf5>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
jmp    1283 <trinucleotide_pep+0x183>
movsbl -0x2(%rbp),%eax
cmp    $0x43,%eax
je     120f <trinucleotide_pep+0x10f>
movsbl -0x2(%rbp),%eax
cmp    $0x63,%eax
jne    121d <trinucleotide_pep+0x11d>
mov    -0x8(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x8(%rbp)
jmp    127e <trinucleotide_pep+0x17e>
movsbl -0x2(%rbp),%eax
cmp    $0x47,%eax
je     1237 <trinucleotide_pep+0x137>
movsbl -0x2(%rbp),%eax
cmp    $0x67,%eax
jne    1245 <trinucleotide_pep+0x145>
mov    -0x8(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x8(%rbp)
jmp    1279 <trinucleotide_pep+0x179>
movsbl -0x2(%rbp),%eax
cmp    $0x54,%eax
je     125f <trinucleotide_pep+0x15f>
movsbl -0x2(%rbp),%eax
cmp    $0x74,%eax
jne    126d <trinucleotide_pep+0x16d>
mov    -0x8(%rbp),%eax
add    $0xc,%eax
mov    %eax,-0x8(%rbp)
jmp    1274 <trinucleotide_pep+0x174>
movl   $0x40,-0x8(%rbp)
jmp    1279 <trinucleotide_pep+0x179>
jmp    127e <trinucleotide_pep+0x17e>
jmp    1283 <trinucleotide_pep+0x183>
jmp    1288 <trinucleotide_pep+0x188>
cmpl   $0x40,-0x8(%rbp)
jge    134d <trinucleotide_pep+0x24d>
movsbl -0x3(%rbp),%eax
cmp    $0x41,%eax
je     12ac <trinucleotide_pep+0x1ac>
movsbl -0x3(%rbp),%eax
cmp    $0x61,%eax
jne    12ba <trinucleotide_pep+0x1ba>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
jmp    1348 <trinucleotide_pep+0x248>
movsbl -0x3(%rbp),%eax
cmp    $0x43,%eax
je     12d4 <trinucleotide_pep+0x1d4>
movsbl -0x3(%rbp),%eax
cmp    $0x63,%eax
jne    12e2 <trinucleotide_pep+0x1e2>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1343 <trinucleotide_pep+0x243>
movsbl -0x3(%rbp),%eax
cmp    $0x47,%eax
je     12fc <trinucleotide_pep+0x1fc>
movsbl -0x3(%rbp),%eax
cmp    $0x67,%eax
jne    130a <trinucleotide_pep+0x20a>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
jmp    133e <trinucleotide_pep+0x23e>
movsbl -0x3(%rbp),%eax
cmp    $0x54,%eax
je     1324 <trinucleotide_pep+0x224>
movsbl -0x3(%rbp),%eax
cmp    $0x74,%eax
jne    1332 <trinucleotide_pep+0x232>
mov    -0x8(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x8(%rbp)
jmp    1339 <trinucleotide_pep+0x239>
movl   $0x40,-0x8(%rbp)
jmp    133e <trinucleotide_pep+0x23e>
jmp    1343 <trinucleotide_pep+0x243>
jmp    1348 <trinucleotide_pep+0x248>
jmp    134d <trinucleotide_pep+0x24d>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<trinucleotide_pep>:
and    $0xdf,%dil
mov    $0x40,%eax
add    $0xbf,%dil
cmp    $0x13,%dil
ja     11af <trinucleotide_pep+0xaf>
xor    %r8d,%r8d
movzbl %dil,%edi
lea    0xedb(%rip),%rcx
movslq (%rcx,%rdi,4),%rdi
add    %rcx,%rdi
jmp    *%rdi
mov    $0x10,%r8d
jmp    1144 <trinucleotide_pep+0x44>
mov    $0x20,%r8d
jmp    1144 <trinucleotide_pep+0x44>
mov    $0x30,%r8d
and    $0xdf,%sil
cmp    $0x41,%sil
je     1177 <trinucleotide_pep+0x77>
cmp    $0x47,%sil
je     1160 <trinucleotide_pep+0x60>
cmp    $0x43,%sil
jne    1166 <trinucleotide_pep+0x66>
or     $0x4,%r8d
jmp    1177 <trinucleotide_pep+0x77>
or     $0x8,%r8d
jmp    1177 <trinucleotide_pep+0x77>
or     $0xc,%r8d
cmp    $0x54,%sil
mov    $0x40,%eax
cmovne %eax,%r8d
and    $0xdf,%dl
cmp    $0x41,%dl
je     1193 <trinucleotide_pep+0x93>
cmp    $0x3f,%r8d
jg     1193 <trinucleotide_pep+0x93>
cmp    $0x47,%dl
je     1197 <trinucleotide_pep+0x97>
cmp    $0x43,%dl
jne    119f <trinucleotide_pep+0x9f>
add    $0x1,%r8d
mov    %r8d,%eax
ret
add    $0x2,%r8d
mov    %r8d,%eax
ret
add    $0x3,%r8d
cmp    $0x54,%dl
mov    $0x40,%eax
cmove  %r8d,%eax
ret

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

LLVM IR (-O2):
define i32 @trinucleotide_pep(i8 signext %0, i8 signext %1, i8 signext %2) {
%4 = and i8 %0, -33
switch i8 %4, label %34 [
i8 65, label %8
i8 67, label %5
i8 71, label %6
i8 84, label %7
]
5: ; preds = %3
br label %8
6: ; preds = %3
br label %8
7: ; preds = %3
br label %8
8: ; preds = %3, %7, %6, %5
%9 = phi i32 [ 0, %3 ], [ 16, %5 ], [ 32, %6 ], [ 48, %7 ]
%10 = and i8 %1, -33
switch i8 %10, label %15 [
i8 65, label %19
i8 67, label %11
i8 71, label %13
]
11: ; preds = %8
%12 = or i32 %9, 4
br label %19
13: ; preds = %8
%14 = or i32 %9, 8
br label %19
15: ; preds = %8
%16 = icmp eq i8 %10, 84
%17 = or i32 %9, 12
%18 = select i1 %16, i32 %17, i32 64
br label %19
19: ; preds = %8, %15, %13, %11
%20 = phi i32 [ %12, %11 ], [ %14, %13 ], [ %9, %8 ], [ %18, %15 ]
%21 = icmp sgt i32 %20, 63
%22 = and i8 %2, -33
%23 = icmp eq i8 %22, 65
%24 = or i1 %23, %21
br i1 %24, label %34, label %25
25: ; preds = %19
switch i8 %22, label %30 [
i8 67, label %26
i8 71, label %28
]
26: ; preds = %25
%27 = add nsw i32 %20, 1
br label %34
28: ; preds = %25
%29 = add nsw i32 %20, 2
br label %34
30: ; preds = %25
%31 = icmp eq i8 %22, 84
%32 = add nsw i32 %20, 3
%33 = select i1 %31, i32 %32, i32 64
br label %34
34: ; preds = %3, %30, %28, %26, %19
%35 = phi i32 [ %27, %26 ], [ %29, %28 ], [ %20, %19 ], [ %33, %30 ], [ 64, %3 ]
ret i32 %35
}