unsigned char decode_base64_pair1(const char ch1, const char ch2) {
  unsigned char octet;
  if ('A' <= ch1 && ch1 <= 'Z')
    octet = 4 * (ch1 - 'A');
  else if ('a' <= ch1 && ch1 <= 'z')
    octet = 4 * (ch1 - 'a' + 26);
  else if ('0' <= ch1 && ch1 <= '9')
    octet = 4 * (ch1 - '0' + 52);
  else if (ch1 == '+')
    octet = 248;
  else if (ch1 == '/')
    octet = 252;
  if ('A' <= ch2 && ch2 <= 'P')
    ;
  else if ('Q' <= ch2 && ch2 <= 'Z')
    octet += 1;
  else if ('a' <= ch2 && ch2 <= 'f')
    octet += 1;
  else if ('g' <= ch2 && ch2 <= 'v')
    octet += 2;
  else if ('w' <= ch2 && ch2 <= 'z')
    octet += 3;
  else if ('0' <= ch2 && ch2 <= '9')
    octet += 3;
  else if (ch2 == '+')
    octet += 3;
  else if (ch2 == '/')
    octet += 3;
  else
    ;
  return octet;
}


x86 assembly (clang, -O0):
<decode_base64_pair1>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %dil,%cl
mov    %cl,-0x1(%rbp)
mov    %al,-0x2(%rbp)
movsbl -0x1(%rbp),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     1140 <decode_base64_pair1+0x40>
movsbl -0x1(%rbp),%eax
cmp    $0x5a,%eax
jg     1140 <decode_base64_pair1+0x40>
movsbl -0x1(%rbp),%eax
sub    $0x41,%eax
shl    $0x2,%eax
mov    %al,-0x3(%rbp)
jmp    11e1 <decode_base64_pair1+0xe1>
movsbl -0x1(%rbp),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     1173 <decode_base64_pair1+0x73>
movsbl -0x1(%rbp),%eax
cmp    $0x7a,%eax
jg     1173 <decode_base64_pair1+0x73>
movsbl -0x1(%rbp),%eax
sub    $0x61,%eax
add    $0x1a,%eax
shl    $0x2,%eax
mov    %al,-0x3(%rbp)
jmp    11dc <decode_base64_pair1+0xdc>
movsbl -0x1(%rbp),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     11a6 <decode_base64_pair1+0xa6>
movsbl -0x1(%rbp),%eax
cmp    $0x39,%eax
jg     11a6 <decode_base64_pair1+0xa6>
movsbl -0x1(%rbp),%eax
sub    $0x30,%eax
add    $0x34,%eax
shl    $0x2,%eax
mov    %al,-0x3(%rbp)
jmp    11d7 <decode_base64_pair1+0xd7>
movsbl -0x1(%rbp),%eax
cmp    $0x2b,%eax
jne    11bc <decode_base64_pair1+0xbc>
movb   $0xf8,-0x3(%rbp)
jmp    11d2 <decode_base64_pair1+0xd2>
movsbl -0x1(%rbp),%eax
cmp    $0x2f,%eax
jne    11cd <decode_base64_pair1+0xcd>
movb   $0xfc,-0x3(%rbp)
jmp    11d2 <decode_base64_pair1+0xd2>
jmp    11d7 <decode_base64_pair1+0xd7>
jmp    11dc <decode_base64_pair1+0xdc>
jmp    11e1 <decode_base64_pair1+0xe1>
movsbl -0x2(%rbp),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     1204 <decode_base64_pair1+0x104>
movsbl -0x2(%rbp),%eax
cmp    $0x50,%eax
jg     1204 <decode_base64_pair1+0x104>
jmp    1345 <decode_base64_pair1+0x245>
movsbl -0x2(%rbp),%ecx
mov    $0x51,%eax
cmp    %ecx,%eax
jg     1231 <decode_base64_pair1+0x131>
movsbl -0x2(%rbp),%eax
cmp    $0x5a,%eax
jg     1231 <decode_base64_pair1+0x131>
movzbl -0x3(%rbp),%eax
add    $0x1,%eax
mov    %al,-0x3(%rbp)
jmp    1340 <decode_base64_pair1+0x240>
movsbl -0x2(%rbp),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     125e <decode_base64_pair1+0x15e>
movsbl -0x2(%rbp),%eax
cmp    $0x66,%eax
jg     125e <decode_base64_pair1+0x15e>
movzbl -0x3(%rbp),%eax
add    $0x1,%eax
mov    %al,-0x3(%rbp)
jmp    133b <decode_base64_pair1+0x23b>
movsbl -0x2(%rbp),%ecx
mov    $0x67,%eax
cmp    %ecx,%eax
jg     128b <decode_base64_pair1+0x18b>
movsbl -0x2(%rbp),%eax
cmp    $0x76,%eax
jg     128b <decode_base64_pair1+0x18b>
movzbl -0x3(%rbp),%eax
add    $0x2,%eax
mov    %al,-0x3(%rbp)
jmp    1336 <decode_base64_pair1+0x236>
movsbl -0x2(%rbp),%ecx
mov    $0x77,%eax
cmp    %ecx,%eax
jg     12b8 <decode_base64_pair1+0x1b8>
movsbl -0x2(%rbp),%eax
cmp    $0x7a,%eax
jg     12b8 <decode_base64_pair1+0x1b8>
movzbl -0x3(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x3(%rbp)
jmp    1331 <decode_base64_pair1+0x231>
movsbl -0x2(%rbp),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     12e5 <decode_base64_pair1+0x1e5>
movsbl -0x2(%rbp),%eax
cmp    $0x39,%eax
jg     12e5 <decode_base64_pair1+0x1e5>
movzbl -0x3(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x3(%rbp)
jmp    132c <decode_base64_pair1+0x22c>
movsbl -0x2(%rbp),%eax
cmp    $0x2b,%eax
jne    1301 <decode_base64_pair1+0x201>
movzbl -0x3(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x3(%rbp)
jmp    1327 <decode_base64_pair1+0x227>
movsbl -0x2(%rbp),%eax
cmp    $0x2f,%eax
jne    131d <decode_base64_pair1+0x21d>
movzbl -0x3(%rbp),%eax
add    $0x3,%eax
mov    %al,-0x3(%rbp)
jmp    1322 <decode_base64_pair1+0x222>
jmp    1322 <decode_base64_pair1+0x222>
jmp    1327 <decode_base64_pair1+0x227>
jmp    132c <decode_base64_pair1+0x22c>
jmp    1331 <decode_base64_pair1+0x231>
jmp    1336 <decode_base64_pair1+0x236>
jmp    133b <decode_base64_pair1+0x23b>
jmp    1340 <decode_base64_pair1+0x240>
jmp    1345 <decode_base64_pair1+0x245>
movzbl -0x3(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_base64_pair1>:
mov    %edi,%eax
lea    -0x41(%rax),%ecx
cmp    $0x19,%cl
ja     1111 <decode_base64_pair1+0x11>
shl    $0x2,%al
add    $0xfc,%al
jmp    1139 <decode_base64_pair1+0x39>
lea    -0x61(%rax),%ecx
cmp    $0x19,%cl
ja     1120 <decode_base64_pair1+0x20>
shl    $0x2,%al
add    $0xe4,%al
jmp    1139 <decode_base64_pair1+0x39>
lea    -0x30(%rax),%ecx
cmp    $0x9,%cl
ja     112f <decode_base64_pair1+0x2f>
shl    $0x2,%al
add    $0x10,%al
jmp    1139 <decode_base64_pair1+0x39>
cmp    $0x2f,%al
sete   %al
shl    $0x2,%al
or     $0xf8,%al
lea    -0x41(%rsi),%ecx
cmp    $0x10,%cl
jae    1142 <decode_base64_pair1+0x42>
ret
lea    -0x51(%rsi),%ecx
cmp    $0x9,%cl
jbe    1152 <decode_base64_pair1+0x52>
lea    -0x61(%rsi),%ecx
cmp    $0x5,%cl
ja     1155 <decode_base64_pair1+0x55>
add    $0x1,%al
ret
lea    -0x67(%rsi),%ecx
cmp    $0xf,%cl
ja     1160 <decode_base64_pair1+0x60>
add    $0x2,%al
ret
lea    -0x77(%rsi),%ecx
cmp    $0x3,%cl
jbe    117c <decode_base64_pair1+0x7c>
lea    -0x30(%rsi),%ecx
cmp    $0x9,%cl
jbe    117c <decode_base64_pair1+0x7c>
cmp    $0x2f,%sil
je     117c <decode_base64_pair1+0x7c>
cmp    $0x2b,%sil
jne    1141 <decode_base64_pair1+0x41>
add    $0x3,%al
ret

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

LLVM IR (-O2):
define zeroext i8 @decode_base64_pair1(i8 signext %0, i8 signext %1) {
%3 = add i8 %0, -65
%4 = icmp ult i8 %3, 26
br i1 %4, label %5, label %8
5: ; preds = %2
%6 = shl i8 %0, 2
%7 = add nsw i8 %6, -4
br label %23
8: ; preds = %2
%9 = add i8 %0, -97
%10 = icmp ult i8 %9, 26
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = shl i8 %0, 2
%13 = add i8 %12, -28
br label %23
14: ; preds = %8
%15 = add i8 %0, -48
%16 = icmp ult i8 %15, 10
br i1 %16, label %17, label %20
17: ; preds = %14
%18 = shl nuw i8 %0, 2
%19 = add nuw nsw i8 %18, 16
br label %23
20: ; preds = %14
%21 = icmp eq i8 %0, 47
%22 = select i1 %21, i8 -4, i8 -8
br label %23
23: ; preds = %20, %11, %17, %5
%24 = phi i8 [ %7, %5 ], [ %13, %11 ], [ %19, %17 ], [ %22, %20 ]
%25 = add i8 %1, -65
%26 = icmp ult i8 %25, 16
br i1 %26, label %57, label %27
27: ; preds = %23
%28 = add i8 %1, -81
%29 = icmp ult i8 %28, 10
br i1 %29, label %30, label %32
30: ; preds = %27
%31 = add i8 %24, 1
br label %57
32: ; preds = %27
%33 = add i8 %1, -97
%34 = icmp ult i8 %33, 6
br i1 %34, label %35, label %37
35: ; preds = %32
%36 = add i8 %24, 1
br label %57
37: ; preds = %32
%38 = add i8 %1, -103
%39 = icmp ult i8 %38, 16
br i1 %39, label %40, label %42
40: ; preds = %37
%41 = add i8 %24, 2
br label %57
42: ; preds = %37
%43 = add i8 %1, -119
%44 = icmp ult i8 %43, 4
br i1 %44, label %45, label %47
45: ; preds = %42
%46 = add i8 %24, 3
br label %57
47: ; preds = %42
%48 = add i8 %1, -48
%49 = icmp ult i8 %48, 10
br i1 %49, label %50, label %52
50: ; preds = %47
%51 = add i8 %24, 3
br label %57
52: ; preds = %47
switch i8 %1, label %57 [
i8 43, label %53
i8 47, label %55
]
53: ; preds = %52
%54 = add i8 %24, 3
br label %57
55: ; preds = %52
%56 = add i8 %24, 3
br label %57
57: ; preds = %52, %30, %40, %50, %55, %53, %45, %35, %23
%58 = phi i8 [ %24, %23 ], [ %31, %30 ], [ %36, %35 ], [ %41, %40 ], [ %46, %45 ], [ %51, %50 ], [ %54, %53 ], [ %56, %55 ], [ %24, %52 ]
ret i8 %58
}