int stringToHex(char *s) {
  unsigned int result = 0;
  int c;
  while (*s) {
    if ((*s >= '0' && *s <= '9') || (*s >= 'A' && *s <= 'F') ||
        (*s >= 'a' && *s <= 'f')) {
      result = result << 4;
      if (c = (*s - '0'), (c >= 0 && c <= 9))
        result += c;
      else if (c = (*s - 'A'), (c >= 0 && c <= 5))
        result += (c + 10);
      else if (c = (*s - 'a'), (c >= 0 && c <= 5))
        result += (c + 10);
    } else
      break;
    ++s;
  }
  return result;
}


x86 assembly (clang, -O0):
<stringToHex>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
cmpb   $0x0,(%rax)
je     1277 <stringToHex+0x177>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     113c <stringToHex+0x3c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    117c <stringToHex+0x7c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     115c <stringToHex+0x5c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x46,%eax
jle    117c <stringToHex+0x7c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1261 <stringToHex+0x161>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     1261 <stringToHex+0x161>
mov    -0xc(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x10(%rbp)
mov    %al,-0x11(%rbp)
jl     11ab <stringToHex+0xab>
cmpl   $0x9,-0x10(%rbp)
setle  %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
test   $0x1,%al
jne    11bb <stringToHex+0xbb>
jmp    11c9 <stringToHex+0xc9>
mov    -0x10(%rbp),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
jmp    125c <stringToHex+0x15c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x41,%eax
mov    %eax,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x10(%rbp)
mov    %al,-0x12(%rbp)
jl     11ef <stringToHex+0xef>
cmpl   $0x5,-0x10(%rbp)
setle  %al
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%al
test   $0x1,%al
jne    11ff <stringToHex+0xff>
jmp    1210 <stringToHex+0x110>
mov    -0x10(%rbp),%eax
add    $0xa,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
jmp    1257 <stringToHex+0x157>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
sub    $0x61,%eax
mov    %eax,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x10(%rbp)
mov    %al,-0x13(%rbp)
jl     1236 <stringToHex+0x136>
cmpl   $0x5,-0x10(%rbp)
setle  %al
mov    %al,-0x13(%rbp)
mov    -0x13(%rbp),%al
test   $0x1,%al
jne    1246 <stringToHex+0x146>
jmp    1252 <stringToHex+0x152>
mov    -0x10(%rbp),%eax
add    $0xa,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
jmp    1257 <stringToHex+0x157>
jmp    125c <stringToHex+0x15c>
jmp    1266 <stringToHex+0x166>
jmp    1277 <stringToHex+0x177>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    110f <stringToHex+0xf>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<stringToHex>:
mov    (%rdi),%cl
test   %cl,%cl
je     1150 <stringToHex+0x50>
add    $0x1,%rdi
xor    %eax,%eax
jmp    1125 <stringToHex+0x25>
xchg   %ax,%ax
shl    $0x4,%eax
add    %edx,%eax
movzbl %cl,%ecx
add    %ecx,%eax
movzbl (%rdi),%ecx
add    $0x1,%rdi
test   %cl,%cl
je     114f <stringToHex+0x4f>
lea    -0x30(%rcx),%esi
mov    $0xffffffd0,%edx
cmp    $0xa,%sil
jb     1110 <stringToHex+0x10>
lea    -0x41(%rcx),%esi
mov    $0xffffffc9,%edx
cmp    $0x6,%sil
jb     1110 <stringToHex+0x10>
lea    -0x61(%rcx),%esi
mov    $0xffffffa9,%edx
cmp    $0x5,%sil
jbe    1110 <stringToHex+0x10>
ret
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @stringToHex(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %25, label %4
4: ; preds = %1, %16
%5 = phi i8 [ %23, %16 ], [ %2, %1 ]
%6 = phi i32 [ %21, %16 ], [ 0, %1 ]
%7 = phi i8* [ %22, %16 ], [ %0, %1 ]
%8 = add i8 %5, -48
%9 = icmp ult i8 %8, 10
br i1 %9, label %16, label %10
10: ; preds = %4
%11 = add i8 %5, -65
%12 = icmp ult i8 %11, 6
br i1 %12, label %16, label %13
13: ; preds = %10
%14 = add i8 %5, -97
%15 = icmp ult i8 %14, 6
br i1 %15, label %16, label %25
16: ; preds = %13, %10, %4
%17 = phi i32 [ -48, %4 ], [ -55, %10 ], [ -87, %13 ]
%18 = shl i32 %6, 4
%19 = zext i8 %5 to i32
%20 = add i32 %18, %17
%21 = add i32 %20, %19
%22 = getelementptr inbounds i8, i8* %7, i64 1
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 0
br i1 %24, label %25, label %4
25: ; preds = %16, %13, %1
%26 = phi i32 [ 0, %1 ], [ %6, %13 ], [ %21, %16 ]
ret i32 %26
}