char char_to_base64(int val) {
  switch (val) {
  case 'A' ... 'Z':
    return (val + 0) - 'A';
  case 'a' ... 'z':
    return (val + 26) - 'a';
  case '0' ... '9':
    return (val + 52) - '0';
  case '+':
    return 62;
  case '/':
    return 63;
  }
  return 0;
}


x86 assembly (clang, -O0):
<char_to_base64>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    -0x8(%rbp),%eax
add    $0xffffffd5,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0x4f,%eax
ja     1175 <char_to_base64+0x75>
mov    -0x10(%rbp),%rax
lea    0xed9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%eax
add    $0x0,%eax
sub    $0x41,%eax
mov    %al,-0x1(%rbp)
jmp    1179 <char_to_base64+0x79>
mov    -0x8(%rbp),%eax
add    $0x1a,%eax
sub    $0x61,%eax
mov    %al,-0x1(%rbp)
jmp    1179 <char_to_base64+0x79>
mov    -0x8(%rbp),%eax
add    $0x34,%eax
sub    $0x30,%eax
mov    %al,-0x1(%rbp)
jmp    1179 <char_to_base64+0x79>
movb   $0x3e,-0x1(%rbp)
jmp    1179 <char_to_base64+0x79>
movb   $0x3f,-0x1(%rbp)
jmp    1179 <char_to_base64+0x79>
movb   $0x0,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<char_to_base64>:
add    $0xffffffd5,%edi
cmp    $0x4f,%edi
ja     1116 <char_to_base64+0x16>
movslq %edi,%rax
lea    0xeee(%rip),%rcx
mov    (%rax,%rcx,1),%al
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
define signext i8 @char_to_base64(i32 %0) {
%2 = alloca i8
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
switch i32 %4, label %22 [
i32 65, label %5
i32 66, label %5
i32 67, label %5
i32 68, label %5
i32 69, label %5
i32 70, label %5
i32 71, label %5
i32 72, label %5
i32 73, label %5
i32 74, label %5
i32 75, label %5
i32 76, label %5
i32 77, label %5
i32 78, label %5
i32 79, label %5
i32 80, label %5
i32 81, label %5
i32 82, label %5
i32 83, label %5
i32 84, label %5
i32 85, label %5
i32 86, label %5
i32 87, label %5
i32 88, label %5
i32 89, label %5
i32 90, label %5
i32 97, label %10
i32 98, label %10
i32 99, label %10
i32 100, label %10
i32 101, label %10
i32 102, label %10
i32 103, label %10
i32 104, label %10
i32 105, label %10
i32 106, label %10
i32 107, label %10
i32 108, label %10
i32 109, label %10
i32 110, label %10
i32 111, label %10
i32 112, label %10
i32 113, label %10
i32 114, label %10
i32 115, label %10
i32 116, label %10
i32 117, label %10
i32 118, label %10
i32 119, label %10
i32 120, label %10
i32 121, label %10
i32 122, label %10
i32 48, label %15
i32 49, label %15
i32 50, label %15
i32 51, label %15
i32 52, label %15
i32 53, label %15
i32 54, label %15
i32 55, label %15
i32 56, label %15
i32 57, label %15
i32 43, label %20
i32 47, label %21
]
5: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
%6 = load i32, i32* %3
%7 = add nsw i32 %6, 0
%8 = sub nsw i32 %7, 65
%9 = trunc i32 %8 to i8
store i8 %9, i8* %2
br label %23
10: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
%11 = load i32, i32* %3
%12 = add nsw i32 %11, 26
%13 = sub nsw i32 %12, 97
%14 = trunc i32 %13 to i8
store i8 %14, i8* %2
br label %23
15: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
%16 = load i32, i32* %3
%17 = add nsw i32 %16, 52
%18 = sub nsw i32 %17, 48
%19 = trunc i32 %18 to i8
store i8 %19, i8* %2
br label %23
20: ; preds = %1
store i8 62, i8* %2
br label %23
21: ; preds = %1
store i8 63, i8* %2
br label %23
22: ; preds = %1
store i8 0, i8* %2
br label %23
23: ; preds = %22, %21, %20, %15, %10, %5
%24 = load i8, i8* %2
ret i8 %24
}

LLVM IR (-O2):
@switch.table.char_to_base64 = [80 x i8] c">\00\00\00?456789:;<=\00\00\00\00\00\00\00\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F\10\11\12\13\14\15\16\17\18\19\00\00\00\00\00\00\1A\1B\1C\1D\1E\1F !\22#$%&'()*+,-./0123"
define signext i8 @char_to_base64(i32 %0) {
%2 = add i32 %0, -43
%3 = icmp ult i32 %2, 80
br i1 %3, label %4, label %8
4: ; preds = %1
%5 = sext i32 %2 to i64
%6 = getelementptr inbounds [80 x i8], [80 x i8]* @switch.table.char_to_base64, i64 0, i64 %5
%7 = load i8, i8* %6
br label %8
8: ; preds = %1, %4
%9 = phi i8 [ %7, %4 ], [ 0, %1 ]
ret i8 %9
}