int tobinhex(char c, int radix) {
  switch (c) {
  case '0':
    return (0x0);
  case '1':
    return (0x1);
  case '2':
    return (radix > 2 ? 0x2 : -1);
  case '3':
    return (radix > 3 ? 0x3 : -1);
  case '4':
    return (radix > 4 ? 0x4 : -1);
  case '5':
    return (radix > 5 ? 0x5 : -1);
  case '6':
    return (radix > 6 ? 0x6 : -1);
  case '7':
    return (radix > 7 ? 0x7 : -1);
  case '8':
    return (radix > 8 ? 0x8 : -1);
  case '9':
    return (radix > 9 ? 0x9 : -1);
  case 'A':
  case 'a':
    return (radix > 10 ? 0xa : -1);
  case 'B':
  case 'b':
    return (radix > 11 ? 0xb : -1);
  case 'C':
  case 'c':
    return (radix > 12 ? 0xc : -1);
  case 'D':
  case 'd':
    return (radix > 13 ? 0xd : -1);
  case 'E':
  case 'e':
    return (radix > 14 ? 0xe : -1);
  case 'F':
  case 'f':
    return (radix > 15 ? 0xf : -1);
  }
  return (-1);
}


x86 assembly (clang, -O0):
<tobinhex>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
mov    %esi,-0xc(%rbp)
movsbl -0x5(%rbp),%eax
add    $0xffffffd0,%eax
mov    %eax,%ecx
mov    %rcx,-0x18(%rbp)
sub    $0x36,%eax
ja     12c9 <tobinhex+0x1c9>
mov    -0x18(%rbp),%rax
lea    0xed2(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x0,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
movl   $0x1,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x2,%ecx
cmp    $0x2,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x3,%ecx
cmp    $0x3,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x4,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x5,%ecx
cmp    $0x5,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x6,%ecx
cmp    $0x6,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x7,%ecx
cmp    $0x7,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x8,%ecx
cmp    $0x8,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0x9,%ecx
cmp    $0x9,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xa,%ecx
cmp    $0xa,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xb,%ecx
cmp    $0xb,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xc,%ecx
cmp    $0xc,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xd,%ecx
cmp    $0xd,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xe,%ecx
cmp    $0xe,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
mov    -0xc(%rbp),%edx
mov    $0xffffffff,%eax
mov    $0xf,%ecx
cmp    $0xf,%edx
cmovg  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d0 <tobinhex+0x1d0>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<tobinhex>:
add    $0xffffffd0,%edi
cmp    $0x36,%edi
ja     11e3 <tobinhex+0xe3>
xor    %eax,%eax
lea    0xeeb(%rip),%rcx
movslq (%rcx,%rdi,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
cmp    $0xb,%esi
mov    $0xa,%ecx
jmp    11da <tobinhex+0xda>
cmp    $0xc,%esi
mov    $0xb,%ecx
jmp    11da <tobinhex+0xda>
cmp    $0xd,%esi
mov    $0xc,%ecx
jmp    11da <tobinhex+0xda>
cmp    $0xe,%esi
mov    $0xd,%ecx
jmp    11da <tobinhex+0xda>
cmp    $0xf,%esi
mov    $0xe,%ecx
jmp    11da <tobinhex+0xda>
xor    %eax,%eax
cmp    $0x10,%esi
setge  %al
shl    $0x4,%eax
add    $0xffffffff,%eax
ret
mov    $0x1,%eax
ret
xor    %eax,%eax
cmp    $0x3,%esi
setge  %al
lea    (%rax,%rax,2),%eax
add    $0xffffffff,%eax
ret
xor    %eax,%eax
cmp    $0x4,%esi
setge  %al
lea    -0x1(,%rax,4),%eax
ret
xor    %eax,%eax
cmp    $0x5,%esi
setge  %al
lea    (%rax,%rax,4),%eax
add    $0xffffffff,%eax
ret
cmp    $0x6,%esi
mov    $0x5,%ecx
jmp    11da <tobinhex+0xda>
cmp    $0x7,%esi
mov    $0x6,%ecx
jmp    11da <tobinhex+0xda>
xor    %eax,%eax
cmp    $0x8,%esi
setge  %al
lea    -0x1(,%rax,8),%eax
ret
xor    %eax,%eax
cmp    $0x9,%esi
setge  %al
lea    (%rax,%rax,8),%eax
add    $0xffffffff,%eax
ret
cmp    $0xa,%esi
mov    $0x9,%ecx
mov    $0xffffffff,%eax
cmovge %ecx,%eax
ret
mov    $0xffffffff,%eax
ret

LLVM IR (-O0):
define i32 @tobinhex(i8 signext %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8
%5 = alloca i32
store i8 %0, i8* %4
store i32 %1, i32* %5
%6 = load i8, i8* %4
%7 = sext i8 %6 to i32
switch i32 %7, label %80 [
i32 48, label %8
i32 49, label %9
i32 50, label %10
i32 51, label %15
i32 52, label %20
i32 53, label %25
i32 54, label %30
i32 55, label %35
i32 56, label %40
i32 57, label %45
i32 65, label %50
i32 97, label %50
i32 66, label %55
i32 98, label %55
i32 67, label %60
i32 99, label %60
i32 68, label %65
i32 100, label %65
i32 69, label %70
i32 101, label %70
i32 70, label %75
i32 102, label %75
]
8: ; preds = %2
store i32 0, i32* %3
br label %81
9: ; preds = %2
store i32 1, i32* %3
br label %81
10: ; preds = %2
%11 = load i32, i32* %5
%12 = icmp sgt i32 %11, 2
%13 = zext i1 %12 to i64
%14 = select i1 %12, i32 2, i32 -1
store i32 %14, i32* %3
br label %81
15: ; preds = %2
%16 = load i32, i32* %5
%17 = icmp sgt i32 %16, 3
%18 = zext i1 %17 to i64
%19 = select i1 %17, i32 3, i32 -1
store i32 %19, i32* %3
br label %81
20: ; preds = %2
%21 = load i32, i32* %5
%22 = icmp sgt i32 %21, 4
%23 = zext i1 %22 to i64
%24 = select i1 %22, i32 4, i32 -1
store i32 %24, i32* %3
br label %81
25: ; preds = %2
%26 = load i32, i32* %5
%27 = icmp sgt i32 %26, 5
%28 = zext i1 %27 to i64
%29 = select i1 %27, i32 5, i32 -1
store i32 %29, i32* %3
br label %81
30: ; preds = %2
%31 = load i32, i32* %5
%32 = icmp sgt i32 %31, 6
%33 = zext i1 %32 to i64
%34 = select i1 %32, i32 6, i32 -1
store i32 %34, i32* %3
br label %81
35: ; preds = %2
%36 = load i32, i32* %5
%37 = icmp sgt i32 %36, 7
%38 = zext i1 %37 to i64
%39 = select i1 %37, i32 7, i32 -1
store i32 %39, i32* %3
br label %81
40: ; preds = %2
%41 = load i32, i32* %5
%42 = icmp sgt i32 %41, 8
%43 = zext i1 %42 to i64
%44 = select i1 %42, i32 8, i32 -1
store i32 %44, i32* %3
br label %81
45: ; preds = %2
%46 = load i32, i32* %5
%47 = icmp sgt i32 %46, 9
%48 = zext i1 %47 to i64
%49 = select i1 %47, i32 9, i32 -1
store i32 %49, i32* %3
br label %81
50: ; preds = %2, %2
%51 = load i32, i32* %5
%52 = icmp sgt i32 %51, 10
%53 = zext i1 %52 to i64
%54 = select i1 %52, i32 10, i32 -1
store i32 %54, i32* %3
br label %81
55: ; preds = %2, %2
%56 = load i32, i32* %5
%57 = icmp sgt i32 %56, 11
%58 = zext i1 %57 to i64
%59 = select i1 %57, i32 11, i32 -1
store i32 %59, i32* %3
br label %81
60: ; preds = %2, %2
%61 = load i32, i32* %5
%62 = icmp sgt i32 %61, 12
%63 = zext i1 %62 to i64
%64 = select i1 %62, i32 12, i32 -1
store i32 %64, i32* %3
br label %81
65: ; preds = %2, %2
%66 = load i32, i32* %5
%67 = icmp sgt i32 %66, 13
%68 = zext i1 %67 to i64
%69 = select i1 %67, i32 13, i32 -1
store i32 %69, i32* %3
br label %81
70: ; preds = %2, %2
%71 = load i32, i32* %5
%72 = icmp sgt i32 %71, 14
%73 = zext i1 %72 to i64
%74 = select i1 %72, i32 14, i32 -1
store i32 %74, i32* %3
br label %81
75: ; preds = %2, %2
%76 = load i32, i32* %5
%77 = icmp sgt i32 %76, 15
%78 = zext i1 %77 to i64
%79 = select i1 %77, i32 15, i32 -1
store i32 %79, i32* %3
br label %81
80: ; preds = %2
store i32 -1, i32* %3
br label %81
81: ; preds = %80, %75, %70, %65, %60, %55, %50, %45, %40, %35, %30, %25, %20, %15, %10, %9, %8
%82 = load i32, i32* %3
ret i32 %82
}

LLVM IR (-O2):
define i32 @tobinhex(i8 signext %0, i32 %1) {
%3 = sext i8 %0 to i32
switch i32 %3, label %47 [
i32 48, label %48
i32 49, label %4
i32 50, label %5
i32 51, label %8
i32 52, label %11
i32 53, label %14
i32 54, label %17
i32 55, label %20
i32 56, label %23
i32 57, label %26
i32 65, label %29
i32 97, label %29
i32 66, label %32
i32 98, label %32
i32 67, label %35
i32 99, label %35
i32 68, label %38
i32 100, label %38
i32 69, label %41
i32 101, label %41
i32 70, label %44
i32 102, label %44
]
4: ; preds = %2
br label %48
5: ; preds = %2
%6 = icmp sgt i32 %1, 2
%7 = select i1 %6, i32 2, i32 -1
br label %48
8: ; preds = %2
%9 = icmp sgt i32 %1, 3
%10 = select i1 %9, i32 3, i32 -1
br label %48
11: ; preds = %2
%12 = icmp sgt i32 %1, 4
%13 = select i1 %12, i32 4, i32 -1
br label %48
14: ; preds = %2
%15 = icmp sgt i32 %1, 5
%16 = select i1 %15, i32 5, i32 -1
br label %48
17: ; preds = %2
%18 = icmp sgt i32 %1, 6
%19 = select i1 %18, i32 6, i32 -1
br label %48
20: ; preds = %2
%21 = icmp sgt i32 %1, 7
%22 = select i1 %21, i32 7, i32 -1
br label %48
23: ; preds = %2
%24 = icmp sgt i32 %1, 8
%25 = select i1 %24, i32 8, i32 -1
br label %48
26: ; preds = %2
%27 = icmp sgt i32 %1, 9
%28 = select i1 %27, i32 9, i32 -1
br label %48
29: ; preds = %2, %2
%30 = icmp sgt i32 %1, 10
%31 = select i1 %30, i32 10, i32 -1
br label %48
32: ; preds = %2, %2
%33 = icmp sgt i32 %1, 11
%34 = select i1 %33, i32 11, i32 -1
br label %48
35: ; preds = %2, %2
%36 = icmp sgt i32 %1, 12
%37 = select i1 %36, i32 12, i32 -1
br label %48
38: ; preds = %2, %2
%39 = icmp sgt i32 %1, 13
%40 = select i1 %39, i32 13, i32 -1
br label %48
41: ; preds = %2, %2
%42 = icmp sgt i32 %1, 14
%43 = select i1 %42, i32 14, i32 -1
br label %48
44: ; preds = %2, %2
%45 = icmp sgt i32 %1, 15
%46 = select i1 %45, i32 15, i32 -1
br label %48
47: ; preds = %2
br label %48
48: ; preds = %2, %47, %44, %41, %38, %35, %32, %29, %26, %23, %20, %17, %14, %11, %8, %5, %4
%49 = phi i32 [ -1, %47 ], [ %46, %44 ], [ %43, %41 ], [ %40, %38 ], [ %37, %35 ], [ %34, %32 ], [ %31, %29 ], [ %28, %26 ], [ %25, %23 ], [ %22, %20 ], [ %19, %17 ], [ %16, %14 ], [ %13, %11 ], [ %10, %8 ], [ %7, %5 ], [ 1, %4 ], [ 0, %2 ]
ret i32 %49
}