char alpha_map(unsigned char c) {
  char a = '?';
  switch (c) {
  case 0:
  case 1:
  case 2:
  case 3:
  case 4:
  case 5:
  case 6:
  case 7:
  case 8:
  case 9:
    a = '0' + c;
    break;
  case 10:
    a = ' ';
    break;
  case 11:
  case 12:
  case 13:
  case 14:
  case 15:
  case 16:
  case 17:
  case 18:
  case 19:
  case 20:
  case 21:
  case 22:
  case 23:
  case 24:
  case 25:
  case 26:
  case 27:
  case 28:
  case 29:
  case 30:
  case 31:
  case 32:
  case 33:
  case 34:
  case 35:
  case 36:
    a = 'A' + c - 11;
    break;
  case 37:
  case 38:
  case 39:
  case 40:
  case 41:
  case 42:
  case 43:
  case 44:
  case 45:
  case 46:
  case 47:
  case 48:
  case 49:
  case 50:
  case 51:
  case 52:
  case 53:
  case 54:
  case 55:
  case 56:
  case 57:
  case 58:
  case 59:
  case 60:
  case 61:
  case 62:
    a = 'a' + c - 37;
    break;
  case 63:
    a = '-';
    break;
  case 64:
    a = '%';
    break;
  case 65:
    a = '/';
    break;
  case 66:
    a = '(';
    break;
  case 67:
    a = ')';
    break;
  case 68:
    a = '*';
    break;
  case 69:
    a = '+';
    break;
  case 70:
    a = '.';
    break;
  case 71:
    a = ':';
    break;
  case 72:
    a = '?';
    break;
  default:
    break;
  }
  return a;
}


x86 assembly (clang, -O0):
<alpha_map>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movb   $0x3f,-0x2(%rbp)
movzbl -0x1(%rbp),%eax
mov    %rax,-0x10(%rbp)
sub    $0x48,%rax
ja     11ca <alpha_map+0xca>
mov    -0x10(%rbp),%rax
lea    0xed5(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movzbl -0x1(%rbp),%eax
add    $0x30,%eax
mov    %al,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x20,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movzbl -0x1(%rbp),%eax
add    $0x41,%eax
sub    $0xb,%eax
mov    %al,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movzbl -0x1(%rbp),%eax
add    $0x61,%eax
sub    $0x25,%eax
mov    %al,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x2d,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x25,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x2f,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x28,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x29,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x2a,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x2b,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x2e,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x3a,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
movb   $0x3f,-0x2(%rbp)
jmp    11cf <alpha_map+0xcf>
jmp    11cf <alpha_map+0xcf>
movsbl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<alpha_map>:
mov    $0x3f,%al
cmp    $0x47,%dil
ja     1116 <alpha_map+0x16>
movsbq %dil,%rax
lea    0xeed(%rip),%rcx
mov    (%rax,%rcx,1),%al
ret

LLVM IR (-O0):
define signext i8 @alpha_map(i8 zeroext %0) {
%2 = alloca i8
%3 = alloca i8
store i8 %0, i8* %2
store i8 63, i8* %3
%4 = load i8, i8* %2
%5 = zext i8 %4 to i32
switch i32 %5, label %34 [
i32 0, label %6
i32 1, label %6
i32 2, label %6
i32 3, label %6
i32 4, label %6
i32 5, label %6
i32 6, label %6
i32 7, label %6
i32 8, label %6
i32 9, label %6
i32 10, label %11
i32 11, label %12
i32 12, label %12
i32 13, label %12
i32 14, label %12
i32 15, label %12
i32 16, label %12
i32 17, label %12
i32 18, label %12
i32 19, label %12
i32 20, label %12
i32 21, label %12
i32 22, label %12
i32 23, label %12
i32 24, label %12
i32 25, label %12
i32 26, label %12
i32 27, label %12
i32 28, label %12
i32 29, label %12
i32 30, label %12
i32 31, label %12
i32 32, label %12
i32 33, label %12
i32 34, label %12
i32 35, label %12
i32 36, label %12
i32 37, label %18
i32 38, label %18
i32 39, label %18
i32 40, label %18
i32 41, label %18
i32 42, label %18
i32 43, label %18
i32 44, label %18
i32 45, label %18
i32 46, label %18
i32 47, label %18
i32 48, label %18
i32 49, label %18
i32 50, label %18
i32 51, label %18
i32 52, label %18
i32 53, label %18
i32 54, label %18
i32 55, label %18
i32 56, label %18
i32 57, label %18
i32 58, label %18
i32 59, label %18
i32 60, label %18
i32 61, label %18
i32 62, label %18
i32 63, label %24
i32 64, label %25
i32 65, label %26
i32 66, label %27
i32 67, label %28
i32 68, label %29
i32 69, label %30
i32 70, label %31
i32 71, label %32
i32 72, label %33
]
6: ; preds = %1, %1, %1, %1, %1, %1, %1, %1, %1, %1
%7 = load i8, i8* %2
%8 = zext i8 %7 to i32
%9 = add nsw i32 48, %8
%10 = trunc i32 %9 to i8
store i8 %10, i8* %3
br label %35
11: ; preds = %1
store i8 32, i8* %3
br label %35
12: ; 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
%13 = load i8, i8* %2
%14 = zext i8 %13 to i32
%15 = add nsw i32 65, %14
%16 = sub nsw i32 %15, 11
%17 = trunc i32 %16 to i8
store i8 %17, i8* %3
br label %35
18: ; 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
%19 = load i8, i8* %2
%20 = zext i8 %19 to i32
%21 = add nsw i32 97, %20
%22 = sub nsw i32 %21, 37
%23 = trunc i32 %22 to i8
store i8 %23, i8* %3
br label %35
24: ; preds = %1
store i8 45, i8* %3
br label %35
25: ; preds = %1
store i8 37, i8* %3
br label %35
26: ; preds = %1
store i8 47, i8* %3
br label %35
27: ; preds = %1
store i8 40, i8* %3
br label %35
28: ; preds = %1
store i8 41, i8* %3
br label %35
29: ; preds = %1
store i8 42, i8* %3
br label %35
30: ; preds = %1
store i8 43, i8* %3
br label %35
31: ; preds = %1
store i8 46, i8* %3
br label %35
32: ; preds = %1
store i8 58, i8* %3
br label %35
33: ; preds = %1
store i8 63, i8* %3
br label %35
34: ; preds = %1
br label %35
35: ; preds = %34, %33, %32, %31, %30, %29, %28, %27, %26, %25, %24, %18, %12, %11, %6
%36 = load i8, i8* %3
ret i8 %36
}

LLVM IR (-O2):
@switch.table.alpha_map = [72 x i8] c"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-%/()*+.:"
define signext i8 @alpha_map(i8 zeroext %0) {
%2 = icmp ult i8 %0, 72
br i1 %2, label %3, label %7
3: ; preds = %1
%4 = sext i8 %0 to i64
%5 = getelementptr inbounds [72 x i8], [72 x i8]* @switch.table.alpha_map, i64 0, i64 %4
%6 = load i8, i8* %5
br label %7
7: ; preds = %3, %1
%8 = phi i8 [ 63, %1 ], [ %6, %3 ]
ret i8 %8
}