short txtIndexOf(char c) {
  if (c >= 'A' && c <= 'Z')
    return (c - 'A' + 10);
  else if (c >= 'a' && c <= 'z')
    return (c - 'a' + 36);
  else if (c >= '0' && c <= '9')
    return (c - '0' + 62);
  switch (c) {
  case ':':
    return 72;
  case '/':
    return 73;
  case '.':
    return 74;
  case ',':
    return 75;
  case '-':
    return 76;
  default:
    break;
  }
  return 0;
}


x86 assembly (clang, -O0):
<txtIndexOf>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x3(%rbp)
movsbl -0x3(%rbp),%eax
cmp    $0x41,%eax
jl     1137 <txtIndexOf+0x37>
movsbl -0x3(%rbp),%eax
cmp    $0x5a,%eax
jg     1137 <txtIndexOf+0x37>
movsbl -0x3(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %ax,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movsbl -0x3(%rbp),%eax
cmp    $0x61,%eax
jl     1164 <txtIndexOf+0x64>
movsbl -0x3(%rbp),%eax
cmp    $0x7a,%eax
jg     1164 <txtIndexOf+0x64>
movsbl -0x3(%rbp),%eax
sub    $0x61,%eax
add    $0x24,%eax
mov    %ax,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movsbl -0x3(%rbp),%eax
cmp    $0x30,%eax
jl     1191 <txtIndexOf+0x91>
movsbl -0x3(%rbp),%eax
cmp    $0x39,%eax
jg     1191 <txtIndexOf+0x91>
movsbl -0x3(%rbp),%eax
sub    $0x30,%eax
add    $0x3e,%eax
mov    %ax,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
jmp    1196 <txtIndexOf+0x96>
jmp    119b <txtIndexOf+0x9b>
movsbl -0x3(%rbp),%eax
add    $0xffffffd4,%eax
mov    %eax,%ecx
mov    %rcx,-0x10(%rbp)
sub    $0xe,%eax
ja     11fc <txtIndexOf+0xfc>
mov    -0x10(%rbp),%rax
lea    0xe44(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movw   $0x48,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movw   $0x49,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movw   $0x4a,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movw   $0x4b,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
movw   $0x4c,-0x2(%rbp)
jmp    1207 <txtIndexOf+0x107>
jmp    1201 <txtIndexOf+0x101>
movw   $0x0,-0x2(%rbp)
movswl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<txtIndexOf>:
lea    -0x41(%rdi),%eax
cmp    $0x19,%al
ja     110f <txtIndexOf+0xf>
movzbl %dil,%eax
add    $0xffffffc9,%eax
ret
lea    -0x61(%rdi),%eax
cmp    $0x19,%al
ja     111e <txtIndexOf+0x1e>
movzbl %dil,%eax
add    $0xffffffc3,%eax
ret
lea    -0x30(%rdi),%eax
cmp    $0x9,%al
ja     112d <txtIndexOf+0x2d>
movzbl %dil,%eax
add    $0xe,%eax
ret
add    $0xffffffd4,%edi
cmp    $0xe,%edi
ja     115d <txtIndexOf+0x5d>
mov    $0x48,%ax
lea    0xec0(%rip),%rcx
movslq (%rcx,%rdi,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
mov    $0x4b,%ax
ret
mov    $0x4c,%ax
ret
mov    $0x4a,%ax
ret
mov    $0x49,%ax
ret
xor    %eax,%eax
ret

LLVM IR (-O0):
define signext i16 @txtIndexOf(i8 signext %0) {
%2 = alloca i16
%3 = alloca i8
store i8 %0, i8* %3
%4 = load i8, i8* %3
%5 = sext i8 %4 to i32
%6 = icmp sge i32 %5, 65
br i1 %6, label %7, label %17
7: ; preds = %1
%8 = load i8, i8* %3
%9 = sext i8 %8 to i32
%10 = icmp sle i32 %9, 90
br i1 %10, label %11, label %17
11: ; preds = %7
%12 = load i8, i8* %3
%13 = sext i8 %12 to i32
%14 = sub nsw i32 %13, 65
%15 = add nsw i32 %14, 10
%16 = trunc i32 %15 to i16
store i16 %16, i16* %2
br label %57
17: ; preds = %7, %1
%18 = load i8, i8* %3
%19 = sext i8 %18 to i32
%20 = icmp sge i32 %19, 97
br i1 %20, label %21, label %31
21: ; preds = %17
%22 = load i8, i8* %3
%23 = sext i8 %22 to i32
%24 = icmp sle i32 %23, 122
br i1 %24, label %25, label %31
25: ; preds = %21
%26 = load i8, i8* %3
%27 = sext i8 %26 to i32
%28 = sub nsw i32 %27, 97
%29 = add nsw i32 %28, 36
%30 = trunc i32 %29 to i16
store i16 %30, i16* %2
br label %57
31: ; preds = %21, %17
%32 = load i8, i8* %3
%33 = sext i8 %32 to i32
%34 = icmp sge i32 %33, 48
br i1 %34, label %35, label %45
35: ; preds = %31
%36 = load i8, i8* %3
%37 = sext i8 %36 to i32
%38 = icmp sle i32 %37, 57
br i1 %38, label %39, label %45
39: ; preds = %35
%40 = load i8, i8* %3
%41 = sext i8 %40 to i32
%42 = sub nsw i32 %41, 48
%43 = add nsw i32 %42, 62
%44 = trunc i32 %43 to i16
store i16 %44, i16* %2
br label %57
45: ; preds = %35, %31
br label %46
46: ; preds = %45
br label %47
47: ; preds = %46
%48 = load i8, i8* %3
%49 = sext i8 %48 to i32
switch i32 %49, label %55 [
i32 58, label %50
i32 47, label %51
i32 46, label %52
i32 44, label %53
i32 45, label %54
]
50: ; preds = %47
store i16 72, i16* %2
br label %57
51: ; preds = %47
store i16 73, i16* %2
br label %57
52: ; preds = %47
store i16 74, i16* %2
br label %57
53: ; preds = %47
store i16 75, i16* %2
br label %57
54: ; preds = %47
store i16 76, i16* %2
br label %57
55: ; preds = %47
br label %56
56: ; preds = %55
store i16 0, i16* %2
br label %57
57: ; preds = %56, %54, %53, %52, %51, %50, %39, %25, %11
%58 = load i16, i16* %2
ret i16 %58
}

LLVM IR (-O2):
define signext i16 @txtIndexOf(i8 signext %0) {
%2 = sext i8 %0 to i32
%3 = add i8 %0, -65
%4 = icmp ult i8 %3, 26
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = zext i8 %0 to i16
%7 = add nsw i16 %6, -55
br label %26
8: ; preds = %1
%9 = add i8 %0, -97
%10 = icmp ult i8 %9, 26
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = zext i8 %0 to i16
%13 = add nsw i16 %12, -61
br label %26
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 = zext i8 %0 to i16
%19 = add nuw nsw i16 %18, 14
br label %26
20: ; preds = %14
switch i32 %2, label %25 [
i32 58, label %26
i32 47, label %21
i32 46, label %22
i32 44, label %23
i32 45, label %24
]
21: ; preds = %20
br label %26
22: ; preds = %20
br label %26
23: ; preds = %20
br label %26
24: ; preds = %20
br label %26
25: ; preds = %20
br label %26
26: ; preds = %20, %25, %24, %23, %22, %21, %17, %11, %5
%27 = phi i16 [ %7, %5 ], [ %13, %11 ], [ %19, %17 ], [ 0, %25 ], [ 76, %24 ], [ 75, %23 ], [ 74, %22 ], [ 73, %21 ], [ 72, %20 ]
ret i16 %27
}