unsigned char decode_base64_pair3(const char ch3, const char ch4) {
  unsigned char octet;
  switch (ch3) {
  case 'A':
  case 'E':
  case 'I':
  case 'M':
  case 'Q':
  case 'U':
  case 'Y':
  case 'c':
  case 'g':
  case 'k':
  case 'o':
  case 's':
  case 'w':
  case '0':
  case '4':
  case '8':
    octet = 0;
    break;
  case 'B':
  case 'F':
  case 'J':
  case 'N':
  case 'R':
  case 'V':
  case 'Z':
  case 'd':
  case 'h':
  case 'l':
  case 'p':
  case 't':
  case 'x':
  case '1':
  case '5':
  case '9':
    octet = 64;
    break;
  case 'C':
  case 'G':
  case 'K':
  case 'O':
  case 'S':
  case 'W':
  case 'a':
  case 'e':
  case 'i':
  case 'm':
  case 'q':
  case 'u':
  case 'y':
  case '2':
  case '6':
  case '+':
    octet = 128;
    break;
  case 'D':
  case 'H':
  case 'L':
  case 'P':
  case 'T':
  case 'X':
  case 'b':
  case 'f':
  case 'j':
  case 'n':
  case 'r':
  case 'v':
  case 'z':
  case '3':
  case '7':
  case '/':
    octet = 192;
    break;
  default:
    octet = 0;
    break;
  }
  if ('A' <= ch4 && ch4 <= 'Z')
    octet += ch4 - 'A';
  else if ('a' <= ch4 && ch4 <= 'z')
    octet += ch4 - 'a' + 26;
  else if ('0' <= ch4 && ch4 <= '9')
    octet += ch4 - '0' + 52;
  else if (ch4 == '+')
    octet += 62;
  else if (ch4 == '/')
    octet += 63;
  else
    ;
  return octet;
}


x86 assembly (clang, -O0):
<decode_base64_pair3>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movsbl -0x1(%rbp),%eax
add    $0xffffffd5,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x4f,%eax
ja     115e <decode_base64_pair3+0x5e>
mov    -0x10(%rbp),%rax
lea    0xecf(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x0,-0x3(%rbp)
jmp    1162 <decode_base64_pair3+0x62>
movb   $0x40,-0x3(%rbp)
jmp    1162 <decode_base64_pair3+0x62>
movb   $0x80,-0x3(%rbp)
jmp    1162 <decode_base64_pair3+0x62>
movb   $0xc0,-0x3(%rbp)
jmp    1162 <decode_base64_pair3+0x62>
movb   $0x0,-0x3(%rbp)
movsbl -0x2(%rbp),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     1195 <decode_base64_pair3+0x95>
movsbl -0x2(%rbp),%eax
cmp    $0x5a,%eax
jg     1195 <decode_base64_pair3+0x95>
movsbl -0x2(%rbp),%ecx
sub    $0x41,%ecx
movzbl -0x3(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x3(%rbp)
jmp    1252 <decode_base64_pair3+0x152>
movsbl -0x2(%rbp),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     11cb <decode_base64_pair3+0xcb>
movsbl -0x2(%rbp),%eax
cmp    $0x7a,%eax
jg     11cb <decode_base64_pair3+0xcb>
movsbl -0x2(%rbp),%ecx
sub    $0x61,%ecx
add    $0x1a,%ecx
movzbl -0x3(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x3(%rbp)
jmp    124d <decode_base64_pair3+0x14d>
movsbl -0x2(%rbp),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     1201 <decode_base64_pair3+0x101>
movsbl -0x2(%rbp),%eax
cmp    $0x39,%eax
jg     1201 <decode_base64_pair3+0x101>
movsbl -0x2(%rbp),%ecx
sub    $0x30,%ecx
add    $0x34,%ecx
movzbl -0x3(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x3(%rbp)
jmp    1248 <decode_base64_pair3+0x148>
movsbl -0x2(%rbp),%eax
cmp    $0x2b,%eax
jne    121d <decode_base64_pair3+0x11d>
movzbl -0x3(%rbp),%eax
add    $0x3e,%eax
mov    %al,-0x3(%rbp)
jmp    1243 <decode_base64_pair3+0x143>
movsbl -0x2(%rbp),%eax
cmp    $0x2f,%eax
jne    1239 <decode_base64_pair3+0x139>
movzbl -0x3(%rbp),%eax
add    $0x3f,%eax
mov    %al,-0x3(%rbp)
jmp    123e <decode_base64_pair3+0x13e>
jmp    123e <decode_base64_pair3+0x13e>
jmp    1243 <decode_base64_pair3+0x143>
jmp    1248 <decode_base64_pair3+0x148>
jmp    124d <decode_base64_pair3+0x14d>
jmp    1252 <decode_base64_pair3+0x152>
movzbl -0x3(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_base64_pair3>:
movslq %edi,%rax
add    $0xffffffffffffffd5,%rax
cmp    $0x4f,%eax
ja     1118 <decode_base64_pair3+0x18>
lea    0xeed(%rip),%rcx
mov    (%rax,%rcx,1),%al
jmp    111a <decode_base64_pair3+0x1a>
xor    %eax,%eax
lea    -0x41(%rsi),%ecx
cmp    $0x19,%cl
ja     1125 <decode_base64_pair3+0x25>
add    %cl,%al
ret
lea    -0x61(%rsi),%ecx
cmp    $0x19,%cl
ja     1133 <decode_base64_pair3+0x33>
add    %sil,%al
add    $0xb9,%al
ret
lea    -0x30(%rsi),%ecx
cmp    $0x9,%cl
ja     1141 <decode_base64_pair3+0x41>
add    %sil,%al
add    $0x4,%al
ret
cmp    $0x2f,%sil
je     1150 <decode_base64_pair3+0x50>
cmp    $0x2b,%sil
jne    1152 <decode_base64_pair3+0x52>
or     $0x3e,%al
ret
or     $0x3f,%al
ret

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

LLVM IR (-O2):
@switch.table.decode_base64_pair3 = [80 x i8] c"\80\00\00\00\C0\00@\80\C0\00@\80\C0\00@\00\00\00\00\00\00\00\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\00\00\00\00\00\00\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0\00@\80\C0"
define zeroext i8 @decode_base64_pair3(i8 signext %0, i8 signext %1) {
%3 = sext i8 %0 to i32
%4 = add nsw i32 %3, -43
%5 = icmp ult i32 %4, 80
br i1 %5, label %6, label %10
6: ; preds = %2
%7 = sext i32 %4 to i64
%8 = getelementptr inbounds [80 x i8], [80 x i8]* @switch.table.decode_base64_pair3, i64 0, i64 %7
%9 = load i8, i8* %8
br label %10
10: ; preds = %6, %2
%11 = phi i8 [ 0, %2 ], [ %9, %6 ]
%12 = add i8 %1, -65
%13 = icmp ult i8 %12, 26
br i1 %13, label %14, label %16
14: ; preds = %10
%15 = add nuw i8 %11, %12
br label %33
16: ; preds = %10
%17 = add i8 %1, -97
%18 = icmp ult i8 %17, 26
br i1 %18, label %19, label %22
19: ; preds = %16
%20 = add i8 %11, %1
%21 = add i8 %20, -71
br label %33
22: ; preds = %16
%23 = add i8 %1, -48
%24 = icmp ult i8 %23, 10
br i1 %24, label %25, label %28
25: ; preds = %22
%26 = add nuw i8 %11, %1
%27 = add nuw i8 %26, 4
br label %33
28: ; preds = %22
switch i8 %1, label %33 [
i8 43, label %29
i8 47, label %31
]
29: ; preds = %28
%30 = or i8 %11, 62
br label %33
31: ; preds = %28
%32 = or i8 %11, 63
br label %33
33: ; preds = %28, %19, %29, %31, %25, %14
%34 = phi i8 [ %15, %14 ], [ %21, %19 ], [ %27, %25 ], [ %30, %29 ], [ %32, %31 ], [ %11, %28 ]
ret i8 %34
}