int hex(int ch1, int ch2) {
  if (ch1 >= '0' && ch1 <= '9')
    ch1 -= '0';
  else if (ch1 >= 'a')
    ch1 -= 'a' - 10;
  else
    ch1 -= 'A' - 10;
  if (ch2 >= '0' && ch2 <= '9')
    ch2 -= '0';
  else if (ch2 >= 'a')
    ch2 -= 'a' - 10;
  else
    ch2 -= 'A' - 10;
  return ((ch1 << 4) | ch2);
}


x86 assembly (clang, -O0):
<hex>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
cmpl   $0x30,-0x4(%rbp)
jl     112c <hex+0x2c>
cmpl   $0x39,-0x4(%rbp)
jg     112c <hex+0x2c>
mov    -0x4(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x4(%rbp)
jmp    1152 <hex+0x52>
cmpl   $0x61,-0x4(%rbp)
jl     1144 <hex+0x44>
mov    -0x4(%rbp),%eax
sub    $0x57,%eax
mov    %eax,-0x4(%rbp)
jmp    114d <hex+0x4d>
mov    -0x4(%rbp),%eax
sub    $0x37,%eax
mov    %eax,-0x4(%rbp)
jmp    1152 <hex+0x52>
cmpl   $0x30,-0x8(%rbp)
jl     1174 <hex+0x74>
cmpl   $0x39,-0x8(%rbp)
jg     1174 <hex+0x74>
mov    -0x8(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x8(%rbp)
jmp    119a <hex+0x9a>
cmpl   $0x61,-0x8(%rbp)
jl     118c <hex+0x8c>
mov    -0x8(%rbp),%eax
sub    $0x57,%eax
mov    %eax,-0x8(%rbp)
jmp    1195 <hex+0x95>
mov    -0x8(%rbp),%eax
sub    $0x37,%eax
mov    %eax,-0x8(%rbp)
jmp    119a <hex+0x9a>
mov    -0x4(%rbp),%eax
shl    $0x4,%eax
or     -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hex>:
lea    -0x30(%rdi),%eax
cmp    $0xa,%eax
jb     1117 <hex+0x17>
cmp    $0x61,%edi
jl     1112 <hex+0x12>
add    $0xffffffa9,%edi
jmp    1115 <hex+0x15>
add    $0xffffffc9,%edi
mov    %edi,%eax
lea    -0x30(%rsi),%ecx
cmp    $0xa,%ecx
jb     112e <hex+0x2e>
cmp    $0x61,%esi
jl     1129 <hex+0x29>
add    $0xffffffa9,%esi
jmp    112c <hex+0x2c>
add    $0xffffffc9,%esi
mov    %esi,%ecx
shl    $0x4,%eax
or     %ecx,%eax
ret

LLVM IR (-O0):
define i32 @hex(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%5 = load i32, i32* %3
%6 = icmp sge i32 %5, 48
br i1 %6, label %7, label %13
7: ; preds = %2
%8 = load i32, i32* %3
%9 = icmp sle i32 %8, 57
br i1 %9, label %10, label %13
10: ; preds = %7
%11 = load i32, i32* %3
%12 = sub nsw i32 %11, 48
store i32 %12, i32* %3
br label %23
13: ; preds = %7, %2
%14 = load i32, i32* %3
%15 = icmp sge i32 %14, 97
br i1 %15, label %16, label %19
16: ; preds = %13
%17 = load i32, i32* %3
%18 = sub nsw i32 %17, 87
store i32 %18, i32* %3
br label %22
19: ; preds = %13
%20 = load i32, i32* %3
%21 = sub nsw i32 %20, 55
store i32 %21, i32* %3
br label %22
22: ; preds = %19, %16
br label %23
23: ; preds = %22, %10
%24 = load i32, i32* %4
%25 = icmp sge i32 %24, 48
br i1 %25, label %26, label %32
26: ; preds = %23
%27 = load i32, i32* %4
%28 = icmp sle i32 %27, 57
br i1 %28, label %29, label %32
29: ; preds = %26
%30 = load i32, i32* %4
%31 = sub nsw i32 %30, 48
store i32 %31, i32* %4
br label %42
32: ; preds = %26, %23
%33 = load i32, i32* %4
%34 = icmp sge i32 %33, 97
br i1 %34, label %35, label %38
35: ; preds = %32
%36 = load i32, i32* %4
%37 = sub nsw i32 %36, 87
store i32 %37, i32* %4
br label %41
38: ; preds = %32
%39 = load i32, i32* %4
%40 = sub nsw i32 %39, 55
store i32 %40, i32* %4
br label %41
41: ; preds = %38, %35
br label %42
42: ; preds = %41, %29
%43 = load i32, i32* %3
%44 = shl i32 %43, 4
%45 = load i32, i32* %4
%46 = or i32 %44, %45
ret i32 %46
}

LLVM IR (-O2):
define i32 @hex(i32 %0, i32 %1) {
%3 = add i32 %0, -48
%4 = icmp ult i32 %3, 10
br i1 %4, label %11, label %5
5: ; preds = %2
%6 = icmp sgt i32 %0, 96
br i1 %6, label %7, label %9
7: ; preds = %5
%8 = add nsw i32 %0, -87
br label %11
9: ; preds = %5
%10 = add nsw i32 %0, -55
br label %11
11: ; preds = %2, %7, %9
%12 = phi i32 [ %8, %7 ], [ %10, %9 ], [ %3, %2 ]
%13 = add i32 %1, -48
%14 = icmp ult i32 %13, 10
br i1 %14, label %21, label %15
15: ; preds = %11
%16 = icmp sgt i32 %1, 96
br i1 %16, label %17, label %19
17: ; preds = %15
%18 = add nsw i32 %1, -87
br label %21
19: ; preds = %15
%20 = add nsw i32 %1, -55
br label %21
21: ; preds = %11, %17, %19
%22 = phi i32 [ %18, %17 ], [ %20, %19 ], [ %13, %11 ]
%23 = shl i32 %12, 4
%24 = or i32 %22, %23
ret i32 %24
}