int xml_ishexadecimal(char ch, int *hex, int *sum) {
  if (ch < '0')
    return 0;
  if (*hex)
    *sum = 16 * *sum;
  else
    *sum = 10 * *sum;
  if (ch <= '9') {
    *sum = *sum + ch - 48;
    return 1;
  }
  if (ch < 'A')
    return 0;
  if ((*hex) && (ch <= 'F')) {
    *sum = *sum + ch - 55;
    return 1;
  }
  if ((ch == 'X') && (*hex != 1) && (*sum == 0)) {
    *hex = 1;
    return 1;
  }
  if (ch < 'a')
    return 0;
  if ((*hex) && (ch <= 'f')) {
    *sum = *sum + ch - 87;
    return 1;
  }
  if ((ch == 'x') && (*hex != 1) && (*sum == 0)) {
    *hex = 1;
    return 1;
  } else
    return 0;
}


x86 assembly (clang, -O0):
<xml_ishexadecimal>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x30,%eax
jge    112b <xml_ishexadecimal+0x2b>
movl   $0x0,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
je     114c <xml_ishexadecimal+0x4c>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
shl    $0x4,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    1159 <xml_ishexadecimal+0x59>
mov    -0x18(%rbp),%rax
imul   $0xa,(%rax),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movsbl -0x5(%rbp),%eax
cmp    $0x39,%eax
jg     1187 <xml_ishexadecimal+0x87>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
movsbl -0x5(%rbp),%eax
add    %eax,%ecx
sub    $0x30,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
movsbl -0x5(%rbp),%eax
cmp    $0x41,%eax
jge    11a0 <xml_ishexadecimal+0xa0>
movl   $0x0,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
je     11db <xml_ishexadecimal+0xdb>
movsbl -0x5(%rbp),%eax
cmp    $0x46,%eax
jg     11db <xml_ishexadecimal+0xdb>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
movsbl -0x5(%rbp),%eax
add    %eax,%ecx
sub    $0x37,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
movsbl -0x5(%rbp),%eax
cmp    $0x58,%eax
jne    1218 <xml_ishexadecimal+0x118>
mov    -0x10(%rbp),%rax
cmpl   $0x1,(%rax)
je     1218 <xml_ishexadecimal+0x118>
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
jne    1218 <xml_ishexadecimal+0x118>
mov    -0x10(%rbp),%rax
movl   $0x1,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
movsbl -0x5(%rbp),%eax
cmp    $0x61,%eax
jge    1231 <xml_ishexadecimal+0x131>
movl   $0x0,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
mov    -0x10(%rbp),%rax
cmpl   $0x0,(%rax)
je     126c <xml_ishexadecimal+0x16c>
movsbl -0x5(%rbp),%eax
cmp    $0x66,%eax
jg     126c <xml_ishexadecimal+0x16c>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
movsbl -0x5(%rbp),%eax
add    %eax,%ecx
sub    $0x57,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
movsbl -0x5(%rbp),%eax
cmp    $0x78,%eax
jne    12a9 <xml_ishexadecimal+0x1a9>
mov    -0x10(%rbp),%rax
cmpl   $0x1,(%rax)
je     12a9 <xml_ishexadecimal+0x1a9>
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
jne    12a9 <xml_ishexadecimal+0x1a9>
mov    -0x10(%rbp),%rax
movl   $0x1,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    12b0 <xml_ishexadecimal+0x1b0>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<xml_ishexadecimal>:
xor    %eax,%eax
cmp    $0x30,%dil
jl     1150 <xml_ishexadecimal+0x50>
mov    (%rdx),%ecx
lea    (%rcx,%rcx,1),%r8d
shl    $0x4,%ecx
cmpl   $0x0,(%rsi)
lea    (%r8,%r8,4),%r9d
cmovne %ecx,%r9d
mov    %r9d,(%rdx)
cmp    $0x39,%dil
ja     112e <xml_ishexadecimal+0x2e>
lea    (%r9,%rdi,1),%eax
add    $0xffffffd0,%eax
jmp    1149 <xml_ishexadecimal+0x49>
cmp    $0x41,%dil
jb     1150 <xml_ishexadecimal+0x50>
mov    (%rsi),%r8d
cmp    $0x46,%dil
ja     1151 <xml_ishexadecimal+0x51>
test   %r8d,%r8d
je     1151 <xml_ishexadecimal+0x51>
lea    (%r9,%rdi,1),%eax
add    $0xffffffc9,%eax
mov    %eax,(%rdx)
mov    $0x1,%eax
ret
cmp    $0x58,%dil
jne    116a <xml_ishexadecimal+0x6a>
cmp    $0x1,%r8d
je     116a <xml_ishexadecimal+0x6a>
test   %r9d,%r9d
jne    1150 <xml_ishexadecimal+0x50>
movl   $0x1,(%rsi)
jmp    114b <xml_ishexadecimal+0x4b>
cmp    $0x61,%dil
jb     1150 <xml_ishexadecimal+0x50>
cmp    $0x66,%dil
ja     1184 <xml_ishexadecimal+0x84>
test   %r8d,%r8d
je     1184 <xml_ishexadecimal+0x84>
lea    (%r9,%rdi,1),%eax
add    $0xffffffa9,%eax
jmp    1149 <xml_ishexadecimal+0x49>
cmp    $0x78,%dil
jne    1150 <xml_ishexadecimal+0x50>
cmp    $0x1,%r8d
jne    115d <xml_ishexadecimal+0x5d>
jmp    1150 <xml_ishexadecimal+0x50>

LLVM IR (-O0):
define i32 @xml_ishexadecimal(i8 signext %0, i32* %1, i32* %2) {
%4 = alloca i32
%5 = alloca i8
%6 = alloca i32*
%7 = alloca i32*
store i8 %0, i8* %5
store i32* %1, i32** %6
store i32* %2, i32** %7
%8 = load i8, i8* %5
%9 = sext i8 %8 to i32
%10 = icmp slt i32 %9, 48
br i1 %10, label %11, label %12
11: ; preds = %3
store i32 0, i32* %4
br label %109
12: ; preds = %3
%13 = load i32*, i32** %6
%14 = load i32, i32* %13
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %21
16: ; preds = %12
%17 = load i32*, i32** %7
%18 = load i32, i32* %17
%19 = mul nsw i32 16, %18
%20 = load i32*, i32** %7
store i32 %19, i32* %20
br label %26
21: ; preds = %12
%22 = load i32*, i32** %7
%23 = load i32, i32* %22
%24 = mul nsw i32 10, %23
%25 = load i32*, i32** %7
store i32 %24, i32* %25
br label %26
26: ; preds = %21, %16
%27 = load i8, i8* %5
%28 = sext i8 %27 to i32
%29 = icmp sle i32 %28, 57
br i1 %29, label %30, label %38
30: ; preds = %26
%31 = load i32*, i32** %7
%32 = load i32, i32* %31
%33 = load i8, i8* %5
%34 = sext i8 %33 to i32
%35 = add nsw i32 %32, %34
%36 = sub nsw i32 %35, 48
%37 = load i32*, i32** %7
store i32 %36, i32* %37
store i32 1, i32* %4
br label %109
38: ; preds = %26
%39 = load i8, i8* %5
%40 = sext i8 %39 to i32
%41 = icmp slt i32 %40, 65
br i1 %41, label %42, label %43
42: ; preds = %38
store i32 0, i32* %4
br label %109
43: ; preds = %38
%44 = load i32*, i32** %6
%45 = load i32, i32* %44
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %59
47: ; preds = %43
%48 = load i8, i8* %5
%49 = sext i8 %48 to i32
%50 = icmp sle i32 %49, 70
br i1 %50, label %51, label %59
51: ; preds = %47
%52 = load i32*, i32** %7
%53 = load i32, i32* %52
%54 = load i8, i8* %5
%55 = sext i8 %54 to i32
%56 = add nsw i32 %53, %55
%57 = sub nsw i32 %56, 55
%58 = load i32*, i32** %7
store i32 %57, i32* %58
store i32 1, i32* %4
br label %109
59: ; preds = %47, %43
%60 = load i8, i8* %5
%61 = sext i8 %60 to i32
%62 = icmp eq i32 %61, 88
br i1 %62, label %63, label %73
63: ; preds = %59
%64 = load i32*, i32** %6
%65 = load i32, i32* %64
%66 = icmp ne i32 %65, 1
br i1 %66, label %67, label %73
67: ; preds = %63
%68 = load i32*, i32** %7
%69 = load i32, i32* %68
%70 = icmp eq i32 %69, 0
br i1 %70, label %71, label %73
71: ; preds = %67
%72 = load i32*, i32** %6
store i32 1, i32* %72
store i32 1, i32* %4
br label %109
73: ; preds = %67, %63, %59
%74 = load i8, i8* %5
%75 = sext i8 %74 to i32
%76 = icmp slt i32 %75, 97
br i1 %76, label %77, label %78
77: ; preds = %73
store i32 0, i32* %4
br label %109
78: ; preds = %73
%79 = load i32*, i32** %6
%80 = load i32, i32* %79
%81 = icmp ne i32 %80, 0
br i1 %81, label %82, label %94
82: ; preds = %78
%83 = load i8, i8* %5
%84 = sext i8 %83 to i32
%85 = icmp sle i32 %84, 102
br i1 %85, label %86, label %94
86: ; preds = %82
%87 = load i32*, i32** %7
%88 = load i32, i32* %87
%89 = load i8, i8* %5
%90 = sext i8 %89 to i32
%91 = add nsw i32 %88, %90
%92 = sub nsw i32 %91, 87
%93 = load i32*, i32** %7
store i32 %92, i32* %93
store i32 1, i32* %4
br label %109
94: ; preds = %82, %78
%95 = load i8, i8* %5
%96 = sext i8 %95 to i32
%97 = icmp eq i32 %96, 120
br i1 %97, label %98, label %108
98: ; preds = %94
%99 = load i32*, i32** %6
%100 = load i32, i32* %99
%101 = icmp ne i32 %100, 1
br i1 %101, label %102, label %108
102: ; preds = %98
%103 = load i32*, i32** %7
%104 = load i32, i32* %103
%105 = icmp eq i32 %104, 0
br i1 %105, label %106, label %108
106: ; preds = %102
%107 = load i32*, i32** %6
store i32 1, i32* %107
store i32 1, i32* %4
br label %109
108: ; preds = %102, %98, %94
store i32 0, i32* %4
br label %109
109: ; preds = %108, %106, %86, %77, %71, %51, %42, %30, %11
%110 = load i32, i32* %4
ret i32 %110
}

LLVM IR (-O2):
define i32 @xml_ishexadecimal(i8 signext %0, i32* nocapture %1, i32* nocapture %2) {
%4 = sext i8 %0 to i32
%5 = icmp slt i8 %0, 48
br i1 %5, label %49, label %6
6: ; preds = %3
%7 = load i32, i32* %1
%8 = icmp eq i32 %7, 0
%9 = load i32, i32* %2
%10 = mul nsw i32 %9, 10
%11 = shl nsw i32 %9, 4
%12 = select i1 %8, i32 %10, i32 %11
store i32 %12, i32* %2
%13 = icmp ult i8 %0, 58
br i1 %13, label %14, label %17
14: ; preds = %6
%15 = add nsw i32 %12, %4
%16 = add nsw i32 %15, -48
store i32 %16, i32* %2
br label %49
17: ; preds = %6
%18 = icmp ult i8 %0, 65
br i1 %18, label %49, label %19
19: ; preds = %17
%20 = load i32, i32* %1
%21 = icmp ne i32 %20, 0
%22 = icmp ult i8 %0, 71
%23 = and i1 %22, %21
br i1 %23, label %24, label %27
24: ; preds = %19
%25 = add nsw i32 %12, %4
%26 = add nsw i32 %25, -55
store i32 %26, i32* %2
br label %49
27: ; preds = %19
%28 = icmp ne i8 %0, 88
%29 = icmp eq i32 %20, 1
%30 = select i1 %28, i1 true, i1 %29
br i1 %30, label %34, label %31
31: ; preds = %27
%32 = icmp eq i32 %12, 0
br i1 %32, label %33, label %49
33: ; preds = %31
store i32 1, i32* %1
br label %49
34: ; preds = %27
%35 = icmp ult i8 %0, 97
br i1 %35, label %49, label %36
36: ; preds = %34
%37 = icmp ult i8 %0, 103
%38 = and i1 %37, %21
br i1 %38, label %39, label %42
39: ; preds = %36
%40 = add nsw i32 %12, %4
%41 = add nsw i32 %40, -87
store i32 %41, i32* %2
br label %49
42: ; preds = %36
%43 = icmp ne i8 %0, 120
%44 = select i1 %43, i1 true, i1 %29
%45 = xor i1 %44, true
%46 = icmp eq i32 %12, 0
%47 = select i1 %45, i1 %46, i1 false
br i1 %47, label %48, label %49
48: ; preds = %42
store i32 1, i32* %1
br label %49
49: ; preds = %31, %42, %34, %17, %3, %48, %39, %33, %24, %14
%50 = phi i32 [ 1, %14 ], [ 1, %24 ], [ 1, %33 ], [ 1, %39 ], [ 1, %48 ], [ 0, %3 ], [ 0, %17 ], [ 0, %34 ], [ 0, %42 ], [ 0, %31 ]
ret i32 %50
}