int mapCharToInt(char a) {
  if (a == '0')
    return 0;
  if (a == '1')
    return 1;
  if (a == 'X' || a == 'K' || a == 'M' || a == 'R' || a == 'Y' || a == 'S' ||
      a == 'W' || a == 'B' || a == 'V' || a == 'H' || a == 'D' || a == '.')
    return 2;
  if (a == '-' || a == 'N')
    return 2;
  if (a == 'A' || a == 'a')
    return 3;
  if (a == 'C' || a == 'c')
    return 4;
  if (a == 'G' || a == 'g')
    return 5;
  if (a == 'T' || a == 't')
    return 6;
  return 7;
}


x86 assembly (clang, -O0):
<mapCharToInt>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x30,%eax
jne    1123 <mapCharToInt+0x23>
movl   $0x0,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x31,%eax
jne    113c <mapCharToInt+0x3c>
movl   $0x1,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x58,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x4b,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x4d,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x52,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x59,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x53,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x57,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x42,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x56,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x48,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x44,%eax
je     11d8 <mapCharToInt+0xd8>
movsbl -0x5(%rbp),%eax
cmp    $0x2e,%eax
jne    11e4 <mapCharToInt+0xe4>
movl   $0x2,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x2d,%eax
je     11fe <mapCharToInt+0xfe>
movsbl -0x5(%rbp),%eax
cmp    $0x4e,%eax
jne    120a <mapCharToInt+0x10a>
movl   $0x2,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x41,%eax
je     1224 <mapCharToInt+0x124>
movsbl -0x5(%rbp),%eax
cmp    $0x61,%eax
jne    1230 <mapCharToInt+0x130>
movl   $0x3,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x43,%eax
je     124a <mapCharToInt+0x14a>
movsbl -0x5(%rbp),%eax
cmp    $0x63,%eax
jne    1256 <mapCharToInt+0x156>
movl   $0x4,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x47,%eax
je     1270 <mapCharToInt+0x170>
movsbl -0x5(%rbp),%eax
cmp    $0x67,%eax
jne    127c <mapCharToInt+0x17c>
movl   $0x5,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movsbl -0x5(%rbp),%eax
cmp    $0x54,%eax
je     1296 <mapCharToInt+0x196>
movsbl -0x5(%rbp),%eax
cmp    $0x74,%eax
jne    12a2 <mapCharToInt+0x1a2>
movl   $0x6,-0x4(%rbp)
jmp    12a9 <mapCharToInt+0x1a9>
movl   $0x7,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mapCharToInt>:
lea    -0x2d(%rdi),%ecx
cmp    $0x2c,%cl
ja     1123 <mapCharToInt+0x23>
xor    %eax,%eax
movzbl %cl,%ecx
lea    0xeec(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x2,%eax
ret
and    $0xdf,%dil
cmp    $0x41,%dil
je     1145 <mapCharToInt+0x45>
cmp    $0x43,%dil
je     114b <mapCharToInt+0x4b>
cmp    $0x47,%dil
jne    1151 <mapCharToInt+0x51>
mov    $0x5,%eax
ret
mov    $0x1,%eax
ret
mov    $0x3,%eax
ret
mov    $0x4,%eax
ret
xor    %eax,%eax
cmp    $0x54,%dil
sete   %al
xor    $0x7,%eax
ret

LLVM IR (-O0):
define i32 @mapCharToInt(i8 signext %0) {
%2 = alloca i32
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = sext i8 %4 to i32
%6 = icmp eq i32 %5, 48
br i1 %6, label %7, label %8
7: ; preds = %1
store i32 0, i32* %2
br label %108
8: ; preds = %1
%9 = load i8, i8* %3
%10 = sext i8 %9 to i32
%11 = icmp eq i32 %10, 49
br i1 %11, label %12, label %13
12: ; preds = %8
store i32 1, i32* %2
br label %108
13: ; preds = %8
%14 = load i8, i8* %3
%15 = sext i8 %14 to i32
%16 = icmp eq i32 %15, 88
br i1 %16, label %61, label %17
17: ; preds = %13
%18 = load i8, i8* %3
%19 = sext i8 %18 to i32
%20 = icmp eq i32 %19, 75
br i1 %20, label %61, label %21
21: ; preds = %17
%22 = load i8, i8* %3
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, 77
br i1 %24, label %61, label %25
25: ; preds = %21
%26 = load i8, i8* %3
%27 = sext i8 %26 to i32
%28 = icmp eq i32 %27, 82
br i1 %28, label %61, label %29
29: ; preds = %25
%30 = load i8, i8* %3
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 89
br i1 %32, label %61, label %33
33: ; preds = %29
%34 = load i8, i8* %3
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 83
br i1 %36, label %61, label %37
37: ; preds = %33
%38 = load i8, i8* %3
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 87
br i1 %40, label %61, label %41
41: ; preds = %37
%42 = load i8, i8* %3
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 66
br i1 %44, label %61, label %45
45: ; preds = %41
%46 = load i8, i8* %3
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 86
br i1 %48, label %61, label %49
49: ; preds = %45
%50 = load i8, i8* %3
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 72
br i1 %52, label %61, label %53
53: ; preds = %49
%54 = load i8, i8* %3
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 68
br i1 %56, label %61, label %57
57: ; preds = %53
%58 = load i8, i8* %3
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 46
br i1 %60, label %61, label %62
61: ; preds = %57, %53, %49, %45, %41, %37, %33, %29, %25, %21, %17, %13
store i32 2, i32* %2
br label %108
62: ; preds = %57
%63 = load i8, i8* %3
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 45
br i1 %65, label %70, label %66
66: ; preds = %62
%67 = load i8, i8* %3
%68 = sext i8 %67 to i32
%69 = icmp eq i32 %68, 78
br i1 %69, label %70, label %71
70: ; preds = %66, %62
store i32 2, i32* %2
br label %108
71: ; preds = %66
%72 = load i8, i8* %3
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 65
br i1 %74, label %79, label %75
75: ; preds = %71
%76 = load i8, i8* %3
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 97
br i1 %78, label %79, label %80
79: ; preds = %75, %71
store i32 3, i32* %2
br label %108
80: ; preds = %75
%81 = load i8, i8* %3
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 67
br i1 %83, label %88, label %84
84: ; preds = %80
%85 = load i8, i8* %3
%86 = sext i8 %85 to i32
%87 = icmp eq i32 %86, 99
br i1 %87, label %88, label %89
88: ; preds = %84, %80
store i32 4, i32* %2
br label %108
89: ; preds = %84
%90 = load i8, i8* %3
%91 = sext i8 %90 to i32
%92 = icmp eq i32 %91, 71
br i1 %92, label %97, label %93
93: ; preds = %89
%94 = load i8, i8* %3
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %95, 103
br i1 %96, label %97, label %98
97: ; preds = %93, %89
store i32 5, i32* %2
br label %108
98: ; preds = %93
%99 = load i8, i8* %3
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %100, 84
br i1 %101, label %106, label %102
102: ; preds = %98
%103 = load i8, i8* %3
%104 = sext i8 %103 to i32
%105 = icmp eq i32 %104, 116
br i1 %105, label %106, label %107
106: ; preds = %102, %98
store i32 6, i32* %2
br label %108
107: ; preds = %102
store i32 7, i32* %2
br label %108
108: ; preds = %107, %106, %97, %88, %79, %70, %61, %12, %7
%109 = load i32, i32* %2
ret i32 %109
}

LLVM IR (-O2):
define i32 @mapCharToInt(i8 signext %0) {
switch i8 %0, label %3 [
i8 48, label %12
i8 49, label %2
i8 89, label %8
i8 88, label %8
i8 87, label %8
i8 86, label %8
i8 83, label %8
i8 82, label %8
i8 77, label %8
i8 75, label %8
i8 72, label %8
i8 68, label %8
i8 66, label %8
i8 46, label %8
i8 78, label %9
i8 45, label %9
]
2: ; preds = %1
br label %12
3: ; preds = %1
%4 = and i8 %0, -33
switch i8 %4, label %5 [
i8 65, label %12
i8 67, label %10
i8 71, label %11
]
5: ; preds = %3
%6 = icmp eq i8 %4, 84
%7 = select i1 %6, i32 6, i32 7
br label %12
8: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
br label %12
9: ; preds = %1, %1
br label %12
10: ; preds = %3
br label %12
11: ; preds = %3
br label %12
12: ; preds = %3, %11, %10, %1, %9, %8, %5, %2
%13 = phi i32 [ 1, %2 ], [ 0, %1 ], [ 3, %3 ], [ %7, %5 ], [ 2, %8 ], [ 2, %9 ], [ 4, %10 ], [ 5, %11 ]
ret i32 %13
}