int IntFromHex(char *pChars) {
  int Hi;
  int Lo;
  int Result;
  Hi = pChars[0];
  if ('0' <= Hi && Hi <= '9') {
    Hi -= '0';
  } else if ('a' <= Hi && Hi <= 'f') {
    Hi -= ('a' - 10);
  } else if ('A' <= Hi && Hi <= 'F') {
    Hi -= ('A' - 10);
  }
  Lo = pChars[1];
  if ('0' <= Lo && Lo <= '9') {
    Lo -= '0';
  } else if ('a' <= Lo && Lo <= 'f') {
    Lo -= ('a' - 10);
  } else if ('A' <= Lo && Lo <= 'F') {
    Lo -= ('A' - 10);
  }
  Result = Lo + (16 * Hi);
  return (Result);
}


x86 assembly (clang, -O0):
<IntFromHex>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0xc(%rbp)
mov    $0x30,%eax
cmp    -0xc(%rbp),%eax
jg     1138 <IntFromHex+0x38>
cmpl   $0x39,-0xc(%rbp)
jg     1138 <IntFromHex+0x38>
mov    -0xc(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0xc(%rbp)
jmp    1189 <IntFromHex+0x89>
mov    $0x61,%eax
cmp    -0xc(%rbp),%eax
jg     115e <IntFromHex+0x5e>
cmpl   $0x66,-0xc(%rbp)
jg     115e <IntFromHex+0x5e>
mov    -0xc(%rbp),%eax
sub    $0x57,%eax
mov    %eax,-0xc(%rbp)
jmp    1184 <IntFromHex+0x84>
mov    $0x41,%eax
cmp    -0xc(%rbp),%eax
jg     117f <IntFromHex+0x7f>
cmpl   $0x46,-0xc(%rbp)
jg     117f <IntFromHex+0x7f>
mov    -0xc(%rbp),%eax
sub    $0x37,%eax
mov    %eax,-0xc(%rbp)
jmp    1184 <IntFromHex+0x84>
jmp    1189 <IntFromHex+0x89>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,-0x10(%rbp)
mov    $0x30,%eax
cmp    -0x10(%rbp),%eax
jg     11ba <IntFromHex+0xba>
cmpl   $0x39,-0x10(%rbp)
jg     11ba <IntFromHex+0xba>
mov    -0x10(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x10(%rbp)
jmp    120b <IntFromHex+0x10b>
mov    $0x61,%eax
cmp    -0x10(%rbp),%eax
jg     11e0 <IntFromHex+0xe0>
cmpl   $0x66,-0x10(%rbp)
jg     11e0 <IntFromHex+0xe0>
mov    -0x10(%rbp),%eax
sub    $0x57,%eax
mov    %eax,-0x10(%rbp)
jmp    1206 <IntFromHex+0x106>
mov    $0x41,%eax
cmp    -0x10(%rbp),%eax
jg     1201 <IntFromHex+0x101>
cmpl   $0x46,-0x10(%rbp)
jg     1201 <IntFromHex+0x101>
mov    -0x10(%rbp),%eax
sub    $0x37,%eax
mov    %eax,-0x10(%rbp)
jmp    1206 <IntFromHex+0x106>
jmp    120b <IntFromHex+0x10b>
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%ecx
shl    $0x4,%ecx
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<IntFromHex>:
movsbl (%rdi),%eax
lea    -0x30(%rax),%ecx
cmp    $0x9,%cl
ja     1110 <IntFromHex+0x10>
add    $0xffffffd0,%eax
jmp    112b <IntFromHex+0x2b>
lea    -0x61(%rax),%ecx
cmp    $0x5,%cl
ja     111d <IntFromHex+0x1d>
add    $0xffffffa9,%eax
jmp    112b <IntFromHex+0x2b>
lea    -0x41(%rax),%ecx
lea    -0x37(%rax),%edx
cmp    $0x6,%cl
cmovae %eax,%edx
mov    %edx,%eax
movsbl 0x1(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
ja     113c <IntFromHex+0x3c>
add    $0xffffffd0,%ecx
jmp    1157 <IntFromHex+0x57>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1149 <IntFromHex+0x49>
add    $0xffffffa9,%ecx
jmp    1157 <IntFromHex+0x57>
lea    -0x41(%rcx),%edx
lea    -0x37(%rcx),%esi
cmp    $0x6,%dl
cmovae %ecx,%esi
mov    %esi,%ecx
shl    $0x4,%eax
add    %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @IntFromHex(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = sext i8 %2 to i32
%4 = add i8 %2, -48
%5 = icmp ult i8 %4, 10
br i1 %5, label %6, label %8
6: ; preds = %1
%7 = add nsw i32 %3, -48
br label %18
8: ; preds = %1
%9 = add i8 %2, -97
%10 = icmp ult i8 %9, 6
br i1 %10, label %11, label %13
11: ; preds = %8
%12 = add nsw i32 %3, -87
br label %18
13: ; preds = %8
%14 = add i8 %2, -65
%15 = icmp ult i8 %14, 6
%16 = add nsw i32 %3, -55
%17 = select i1 %15, i32 %16, i32 %3
br label %18
18: ; preds = %13, %11, %6
%19 = phi i32 [ %7, %6 ], [ %12, %11 ], [ %17, %13 ]
%20 = getelementptr inbounds i8, i8* %0, i64 1
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = add i8 %21, -48
%24 = icmp ult i8 %23, 10
br i1 %24, label %25, label %27
25: ; preds = %18
%26 = add nsw i32 %22, -48
br label %37
27: ; preds = %18
%28 = add i8 %21, -97
%29 = icmp ult i8 %28, 6
br i1 %29, label %30, label %32
30: ; preds = %27
%31 = add nsw i32 %22, -87
br label %37
32: ; preds = %27
%33 = add i8 %21, -65
%34 = icmp ult i8 %33, 6
%35 = add nsw i32 %22, -55
%36 = select i1 %34, i32 %35, i32 %22
br label %37
37: ; preds = %32, %30, %25
%38 = phi i32 [ %26, %25 ], [ %31, %30 ], [ %36, %32 ]
%39 = shl nsw i32 %19, 4
%40 = add nsw i32 %38, %39
ret i32 %40
}