int trinucleotide(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 = 0;
  }
  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 = 0;
  }
  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 = 0;
  }
  return freq_id;
}


x86 assembly (clang, -O0):
<trinucleotide>:
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+0x2f>
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
jne    113b <trinucleotide+0x3b>
movl   $0x0,-0x8(%rbp)
jmp    11c3 <trinucleotide+0xc3>
movsbl -0x1(%rbp),%eax
cmp    $0x43,%eax
je     1155 <trinucleotide+0x55>
movsbl -0x1(%rbp),%eax
cmp    $0x63,%eax
jne    1161 <trinucleotide+0x61>
movl   $0x10,-0x8(%rbp)
jmp    11be <trinucleotide+0xbe>
movsbl -0x1(%rbp),%eax
cmp    $0x47,%eax
je     117b <trinucleotide+0x7b>
movsbl -0x1(%rbp),%eax
cmp    $0x67,%eax
jne    1187 <trinucleotide+0x87>
movl   $0x20,-0x8(%rbp)
jmp    11b9 <trinucleotide+0xb9>
movsbl -0x1(%rbp),%eax
cmp    $0x54,%eax
je     11a1 <trinucleotide+0xa1>
movsbl -0x1(%rbp),%eax
cmp    $0x74,%eax
jne    11ad <trinucleotide+0xad>
movl   $0x30,-0x8(%rbp)
jmp    11b4 <trinucleotide+0xb4>
movl   $0x0,-0x8(%rbp)
jmp    11b9 <trinucleotide+0xb9>
jmp    11be <trinucleotide+0xbe>
jmp    11c3 <trinucleotide+0xc3>
movsbl -0x2(%rbp),%eax
cmp    $0x41,%eax
je     11dd <trinucleotide+0xdd>
movsbl -0x2(%rbp),%eax
cmp    $0x61,%eax
jne    11eb <trinucleotide+0xeb>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
jmp    1279 <trinucleotide+0x179>
movsbl -0x2(%rbp),%eax
cmp    $0x43,%eax
je     1205 <trinucleotide+0x105>
movsbl -0x2(%rbp),%eax
cmp    $0x63,%eax
jne    1213 <trinucleotide+0x113>
mov    -0x8(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x8(%rbp)
jmp    1274 <trinucleotide+0x174>
movsbl -0x2(%rbp),%eax
cmp    $0x47,%eax
je     122d <trinucleotide+0x12d>
movsbl -0x2(%rbp),%eax
cmp    $0x67,%eax
jne    123b <trinucleotide+0x13b>
mov    -0x8(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x8(%rbp)
jmp    126f <trinucleotide+0x16f>
movsbl -0x2(%rbp),%eax
cmp    $0x54,%eax
je     1255 <trinucleotide+0x155>
movsbl -0x2(%rbp),%eax
cmp    $0x74,%eax
jne    1263 <trinucleotide+0x163>
mov    -0x8(%rbp),%eax
add    $0xc,%eax
mov    %eax,-0x8(%rbp)
jmp    126a <trinucleotide+0x16a>
movl   $0x0,-0x8(%rbp)
jmp    126f <trinucleotide+0x16f>
jmp    1274 <trinucleotide+0x174>
jmp    1279 <trinucleotide+0x179>
movsbl -0x3(%rbp),%eax
cmp    $0x41,%eax
je     1293 <trinucleotide+0x193>
movsbl -0x3(%rbp),%eax
cmp    $0x61,%eax
jne    12a1 <trinucleotide+0x1a1>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
jmp    132f <trinucleotide+0x22f>
movsbl -0x3(%rbp),%eax
cmp    $0x43,%eax
je     12bb <trinucleotide+0x1bb>
movsbl -0x3(%rbp),%eax
cmp    $0x63,%eax
jne    12c9 <trinucleotide+0x1c9>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    132a <trinucleotide+0x22a>
movsbl -0x3(%rbp),%eax
cmp    $0x47,%eax
je     12e3 <trinucleotide+0x1e3>
movsbl -0x3(%rbp),%eax
cmp    $0x67,%eax
jne    12f1 <trinucleotide+0x1f1>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
jmp    1325 <trinucleotide+0x225>
movsbl -0x3(%rbp),%eax
cmp    $0x54,%eax
je     130b <trinucleotide+0x20b>
movsbl -0x3(%rbp),%eax
cmp    $0x74,%eax
jne    1319 <trinucleotide+0x219>
mov    -0x8(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x8(%rbp)
jmp    1320 <trinucleotide+0x220>
movl   $0x0,-0x8(%rbp)
jmp    1325 <trinucleotide+0x225>
jmp    132a <trinucleotide+0x22a>
jmp    132f <trinucleotide+0x22f>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<trinucleotide>:
and    $0xdf,%dil
cmp    $0x41,%dil
je     111d <trinucleotide+0x1d>
cmp    $0x43,%dil
je     1121 <trinucleotide+0x21>
cmp    $0x47,%dil
jne    1128 <trinucleotide+0x28>
mov    $0x20,%eax
jmp    1136 <trinucleotide+0x36>
xor    %eax,%eax
jmp    1136 <trinucleotide+0x36>
mov    $0x10,%eax
jmp    1136 <trinucleotide+0x36>
xor    %ecx,%ecx
cmp    $0x54,%dil
mov    $0x30,%eax
cmovne %ecx,%eax
and    $0xdf,%sil
cmp    $0x41,%sil
je     1162 <trinucleotide+0x62>
cmp    $0x47,%sil
je     1151 <trinucleotide+0x51>
cmp    $0x43,%sil
jne    1156 <trinucleotide+0x56>
or     $0x4,%eax
jmp    1162 <trinucleotide+0x62>
or     $0x8,%eax
jmp    1162 <trinucleotide+0x62>
or     $0xc,%eax
xor    %ecx,%ecx
cmp    $0x54,%sil
cmovne %ecx,%eax
and    $0xdf,%dl
cmp    $0x41,%dl
je     1187 <trinucleotide+0x87>
cmp    $0x47,%dl
je     1178 <trinucleotide+0x78>
cmp    $0x43,%dl
jne    117c <trinucleotide+0x7c>
add    $0x1,%eax
ret
add    $0x2,%eax
ret
add    $0x3,%eax
xor    %ecx,%ecx
cmp    $0x54,%dl
cmovne %ecx,%eax
ret

LLVM IR (-O0):
define i32 @trinucleotide(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 0, 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 i8, i8* %5
%49 = sext i8 %48 to i32
%50 = icmp eq i32 %49, 65
br i1 %50, label %55, label %51
51: ; preds = %47
%52 = load i8, i8* %5
%53 = sext i8 %52 to i32
%54 = icmp eq i32 %53, 97
br i1 %54, label %55, label %58
55: ; preds = %51, %47
%56 = load i32, i32* %7
%57 = add nsw i32 %56, 0
store i32 %57, i32* %7
br label %95
58: ; preds = %51
%59 = load i8, i8* %5
%60 = sext i8 %59 to i32
%61 = icmp eq i32 %60, 67
br i1 %61, label %66, label %62
62: ; preds = %58
%63 = load i8, i8* %5
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 99
br i1 %65, label %66, label %69
66: ; preds = %62, %58
%67 = load i32, i32* %7
%68 = add nsw i32 %67, 4
store i32 %68, i32* %7
br label %94
69: ; preds = %62
%70 = load i8, i8* %5
%71 = sext i8 %70 to i32
%72 = icmp eq i32 %71, 71
br i1 %72, label %77, label %73
73: ; preds = %69
%74 = load i8, i8* %5
%75 = sext i8 %74 to i32
%76 = icmp eq i32 %75, 103
br i1 %76, label %77, label %80
77: ; preds = %73, %69
%78 = load i32, i32* %7
%79 = add nsw i32 %78, 8
store i32 %79, i32* %7
br label %93
80: ; preds = %73
%81 = load i8, i8* %5
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 84
br i1 %83, label %88, label %84
84: ; preds = %80
%85 = load i8, i8* %5
%86 = sext i8 %85 to i32
%87 = icmp eq i32 %86, 116
br i1 %87, label %88, label %91
88: ; preds = %84, %80
%89 = load i32, i32* %7
%90 = add nsw i32 %89, 12
store i32 %90, i32* %7
br label %92
91: ; preds = %84
store i32 0, i32* %7
br label %92
92: ; preds = %91, %88
br label %93
93: ; preds = %92, %77
br label %94
94: ; preds = %93, %66
br label %95
95: ; preds = %94, %55
%96 = load i8, i8* %6
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 65
br i1 %98, label %103, label %99
99: ; preds = %95
%100 = load i8, i8* %6
%101 = sext i8 %100 to i32
%102 = icmp eq i32 %101, 97
br i1 %102, label %103, label %106
103: ; preds = %99, %95
%104 = load i32, i32* %7
%105 = add nsw i32 %104, 0
store i32 %105, i32* %7
br label %143
106: ; preds = %99
%107 = load i8, i8* %6
%108 = sext i8 %107 to i32
%109 = icmp eq i32 %108, 67
br i1 %109, label %114, label %110
110: ; preds = %106
%111 = load i8, i8* %6
%112 = sext i8 %111 to i32
%113 = icmp eq i32 %112, 99
br i1 %113, label %114, label %117
114: ; preds = %110, %106
%115 = load i32, i32* %7
%116 = add nsw i32 %115, 1
store i32 %116, i32* %7
br label %142
117: ; preds = %110
%118 = load i8, i8* %6
%119 = sext i8 %118 to i32
%120 = icmp eq i32 %119, 71
br i1 %120, label %125, label %121
121: ; preds = %117
%122 = load i8, i8* %6
%123 = sext i8 %122 to i32
%124 = icmp eq i32 %123, 103
br i1 %124, label %125, label %128
125: ; preds = %121, %117
%126 = load i32, i32* %7
%127 = add nsw i32 %126, 2
store i32 %127, i32* %7
br label %141
128: ; preds = %121
%129 = load i8, i8* %6
%130 = sext i8 %129 to i32
%131 = icmp eq i32 %130, 84
br i1 %131, label %136, label %132
132: ; preds = %128
%133 = load i8, i8* %6
%134 = sext i8 %133 to i32
%135 = icmp eq i32 %134, 116
br i1 %135, label %136, label %139
136: ; preds = %132, %128
%137 = load i32, i32* %7
%138 = add nsw i32 %137, 3
store i32 %138, i32* %7
br label %140
139: ; preds = %132
store i32 0, i32* %7
br label %140
140: ; preds = %139, %136
br label %141
141: ; preds = %140, %125
br label %142
142: ; preds = %141, %114
br label %143
143: ; preds = %142, %103
%144 = load i32, i32* %7
ret i32 %144
}

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