unsigned char atoc(char data) {
  unsigned char ucRes;
  if ((data >= 0x30) && (data <= 0x39)) {
    ucRes = data - 0x30;
  } else {
    if (data == 'a') {
      ucRes = 0x0a;
      ;
    } else if (data == 'b') {
      ucRes = 0x0b;
    } else if (data == 'c') {
      ucRes = 0x0c;
    } else if (data == 'd') {
      ucRes = 0x0d;
    } else if (data == 'e') {
      ucRes = 0x0e;
    } else if (data == 'f') {
      ucRes = 0x0f;
    }
  }
  return ucRes;
}


x86 assembly (clang, -O0):
<atoc>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x30,%eax
jl     1133 <atoc+0x33>
movsbl -0x1(%rbp),%eax
cmp    $0x39,%eax
jg     1133 <atoc+0x33>
movsbl -0x1(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x2(%rbp)
jmp    11d0 <atoc+0xd0>
movsbl -0x1(%rbp),%eax
cmp    $0x61,%eax
jne    1149 <atoc+0x49>
movb   $0xa,-0x2(%rbp)
jmp    11cb <atoc+0xcb>
movsbl -0x1(%rbp),%eax
cmp    $0x62,%eax
jne    115f <atoc+0x5f>
movb   $0xb,-0x2(%rbp)
jmp    11c6 <atoc+0xc6>
movsbl -0x1(%rbp),%eax
cmp    $0x63,%eax
jne    1175 <atoc+0x75>
movb   $0xc,-0x2(%rbp)
jmp    11c1 <atoc+0xc1>
movsbl -0x1(%rbp),%eax
cmp    $0x64,%eax
jne    118b <atoc+0x8b>
movb   $0xd,-0x2(%rbp)
jmp    11bc <atoc+0xbc>
movsbl -0x1(%rbp),%eax
cmp    $0x65,%eax
jne    11a1 <atoc+0xa1>
movb   $0xe,-0x2(%rbp)
jmp    11b7 <atoc+0xb7>
movsbl -0x1(%rbp),%eax
cmp    $0x66,%eax
jne    11b2 <atoc+0xb2>
movb   $0xf,-0x2(%rbp)
jmp    11b7 <atoc+0xb7>
jmp    11bc <atoc+0xbc>
jmp    11c1 <atoc+0xc1>
jmp    11c6 <atoc+0xc6>
jmp    11cb <atoc+0xcb>
jmp    11d0 <atoc+0xd0>
movzbl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<atoc>:
lea    -0x30(%rdi),%eax
lea    -0x62(%rdi),%ecx
add    $0xa9,%dil
cmp    $0x5,%cl
movzbl %dil,%ecx
mov    $0xa,%edx
cmovb  %ecx,%edx
cmp    $0xa,%al
movzbl %al,%eax
cmovae %edx,%eax
ret

LLVM IR (-O0):
define zeroext i8 @atoc(i8 signext %0) {
%2 = alloca i8
%3 = alloca i8
store i8 %0, i8* %2
%4 = load i8, i8* %2
%5 = sext i8 %4 to i32
%6 = icmp sge i32 %5, 48
br i1 %6, label %7, label %16
7: ; preds = %1
%8 = load i8, i8* %2
%9 = sext i8 %8 to i32
%10 = icmp sle i32 %9, 57
br i1 %10, label %11, label %16
11: ; preds = %7
%12 = load i8, i8* %2
%13 = sext i8 %12 to i32
%14 = sub nsw i32 %13, 48
%15 = trunc i32 %14 to i8
store i8 %15, i8* %3
br label %52
16: ; preds = %7, %1
%17 = load i8, i8* %2
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 97
br i1 %19, label %20, label %21
20: ; preds = %16
store i8 10, i8* %3
br label %51
21: ; preds = %16
%22 = load i8, i8* %2
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, 98
br i1 %24, label %25, label %26
25: ; preds = %21
store i8 11, i8* %3
br label %50
26: ; preds = %21
%27 = load i8, i8* %2
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 99
br i1 %29, label %30, label %31
30: ; preds = %26
store i8 12, i8* %3
br label %49
31: ; preds = %26
%32 = load i8, i8* %2
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 100
br i1 %34, label %35, label %36
35: ; preds = %31
store i8 13, i8* %3
br label %48
36: ; preds = %31
%37 = load i8, i8* %2
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 101
br i1 %39, label %40, label %41
40: ; preds = %36
store i8 14, i8* %3
br label %47
41: ; preds = %36
%42 = load i8, i8* %2
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 102
br i1 %44, label %45, label %46
45: ; preds = %41
store i8 15, i8* %3
br label %46
46: ; preds = %45, %41
br label %47
47: ; preds = %46, %40
br label %48
48: ; preds = %47, %35
br label %49
49: ; preds = %48, %30
br label %50
50: ; preds = %49, %25
br label %51
51: ; preds = %50, %20
br label %52
52: ; preds = %51, %11
%53 = load i8, i8* %3
ret i8 %53
}

LLVM IR (-O2):
define zeroext i8 @atoc(i8 signext %0) {
%2 = add i8 %0, -48
%3 = icmp ult i8 %2, 10
%4 = add i8 %0, -98
%5 = icmp ult i8 %4, 5
%6 = add i8 %0, -87
%7 = select i1 %5, i8 %6, i8 10
%8 = select i1 %3, i8 %2, i8 %7
ret i8 %8
}