int FRGL_AVI_ExtractTagNum(int tag) {
  int i, c;
  i = 0;
  c = tag & 0xff;
  if ((c >= '0') && (c <= '9'))
    i += c - '0';
  if ((c >= 'A') && (c <= 'Z'))
    i += c - 'A' + 10;
  if ((c >= 'a') && (c <= 'z'))
    i += c - 'a' + 10;
  i <<= 4;
  c = (tag >> 8) & 0xff;
  if ((c >= '0') && (c <= '9'))
    i += c - '0';
  if ((c >= 'A') && (c <= 'Z'))
    i += c - 'A' + 10;
  if ((c >= 'a') && (c <= 'z'))
    i += c - 'a' + 10;
  return (i);
}


x86 assembly (clang, -O0):
<FRGL_AVI_ExtractTagNum>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x30,-0xc(%rbp)
jl     1139 <FRGL_AVI_ExtractTagNum+0x39>
cmpl   $0x39,-0xc(%rbp)
jg     1139 <FRGL_AVI_ExtractTagNum+0x39>
mov    -0xc(%rbp),%eax
sub    $0x30,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x41,-0xc(%rbp)
jl     115c <FRGL_AVI_ExtractTagNum+0x5c>
cmpl   $0x5a,-0xc(%rbp)
jg     115c <FRGL_AVI_ExtractTagNum+0x5c>
mov    -0xc(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x61,-0xc(%rbp)
jl     117f <FRGL_AVI_ExtractTagNum+0x7f>
cmpl   $0x7a,-0xc(%rbp)
jg     117f <FRGL_AVI_ExtractTagNum+0x7f>
mov    -0xc(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x8,%eax
and    $0xff,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x30,-0xc(%rbp)
jl     11b6 <FRGL_AVI_ExtractTagNum+0xb6>
cmpl   $0x39,-0xc(%rbp)
jg     11b6 <FRGL_AVI_ExtractTagNum+0xb6>
mov    -0xc(%rbp),%eax
sub    $0x30,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x41,-0xc(%rbp)
jl     11d9 <FRGL_AVI_ExtractTagNum+0xd9>
cmpl   $0x5a,-0xc(%rbp)
jg     11d9 <FRGL_AVI_ExtractTagNum+0xd9>
mov    -0xc(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x61,-0xc(%rbp)
jl     11fc <FRGL_AVI_ExtractTagNum+0xfc>
cmpl   $0x7a,-0xc(%rbp)
jg     11fc <FRGL_AVI_ExtractTagNum+0xfc>
mov    -0xc(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<FRGL_AVI_ExtractTagNum>:
mov    %edi,%eax
movzbl %al,%ecx
lea    -0x30(%rcx),%esi
xor    %r8d,%r8d
cmp    $0xa,%esi
cmovae %r8d,%esi
lea    -0x41(%rcx),%edi
lea    -0x37(%rcx),%edx
cmp    $0x1a,%edi
cmovae %r8d,%edx
add    %esi,%edx
lea    -0x61(%rcx),%esi
add    $0xffffffa9,%ecx
cmp    $0x1a,%esi
cmovae %r8d,%ecx
add    %edx,%ecx
shl    $0x4,%ecx
movzbl %ah,%esi
lea    -0x30(%rsi),%edx
cmp    $0xa,%edx
cmovae %r8d,%edx
lea    -0x41(%rsi),%edi
lea    -0x37(%rsi),%eax
cmp    $0x1a,%edi
cmovae %r8d,%eax
lea    -0x61(%rsi),%edi
add    $0xffffffa9,%esi
cmp    $0x1a,%edi
cmovae %r8d,%esi
add    %edx,%eax
add    %esi,%eax
add    %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @FRGL_AVI_ExtractTagNum(i32 %0) {
%2 = and i32 %0, 255
%3 = add nsw i32 %2, -48
%4 = icmp ult i32 %3, 10
%5 = select i1 %4, i32 %3, i32 0
%6 = add nsw i32 %2, -65
%7 = icmp ult i32 %6, 26
%8 = add nsw i32 %2, -55
%9 = select i1 %7, i32 %8, i32 0
%10 = add nsw i32 %5, %9
%11 = add nsw i32 %2, -97
%12 = icmp ult i32 %11, 26
%13 = add nsw i32 %2, -87
%14 = select i1 %12, i32 %13, i32 0
%15 = add nsw i32 %10, %14
%16 = shl nsw i32 %15, 4
%17 = lshr i32 %0, 8
%18 = and i32 %17, 255
%19 = add nsw i32 %18, -48
%20 = icmp ult i32 %19, 10
%21 = select i1 %20, i32 %19, i32 0
%22 = add nsw i32 %18, -65
%23 = icmp ult i32 %22, 26
%24 = add nsw i32 %18, -55
%25 = select i1 %23, i32 %24, i32 0
%26 = add nsw i32 %18, -97
%27 = icmp ult i32 %26, 26
%28 = add nsw i32 %18, -87
%29 = select i1 %27, i32 %28, i32 0
%30 = add nsw i32 %25, %21
%31 = add nsw i32 %30, %29
%32 = add nsw i32 %31, %16
ret i32 %32
}