unsigned int get_hex_u32(char *hex) {
  int i;
  unsigned int val = 0;
  for (i = 0; i < 8; ++i) {
    if (hex[i] >= '0' && hex[i] <= '9')
      val = (val << 4) | (hex[i] - 0);
    else if (hex[i] >= 'A' && hex[i] <= 'F')
      val = (val << 4) | (hex[i] - 'A' + 10);
    else if (hex[i] >= 'a' && hex[i] <= 'f')
      val = (val << 4) | (hex[i] - 'a' + 10);
    else
      break;
  }
  return val;
}


x86 assembly (clang, -O0):
<get_hex_u32>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x8,-0xc(%rbp)
jge    1223 <get_hex_u32+0x123>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1169 <get_hex_u32+0x69>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     1169 <get_hex_u32+0x69>
mov    -0x10(%rbp),%eax
shl    $0x4,%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x0,%ecx
or     %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    1210 <get_hex_u32+0x110>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     11b5 <get_hex_u32+0xb5>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     11b5 <get_hex_u32+0xb5>
mov    -0x10(%rbp),%eax
shl    $0x4,%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    120b <get_hex_u32+0x10b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1201 <get_hex_u32+0x101>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jg     1201 <get_hex_u32+0x101>
mov    -0x10(%rbp),%eax
shl    $0x4,%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    1206 <get_hex_u32+0x106>
jmp    1223 <get_hex_u32+0x123>
jmp    120b <get_hex_u32+0x10b>
jmp    1210 <get_hex_u32+0x110>
jmp    1215 <get_hex_u32+0x115>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1116 <get_hex_u32+0x16>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_hex_u32>:
movsbl (%rdi),%ecx
lea    -0x30(%rcx),%eax
cmp    $0xa,%al
jb     1127 <get_hex_u32+0x27>
lea    -0x41(%rcx),%eax
cmp    $0x5,%al
ja     1116 <get_hex_u32+0x16>
add    $0xffffffc9,%ecx
jmp    1127 <get_hex_u32+0x27>
lea    -0x61(%rcx),%edx
xor    %eax,%eax
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
add    $0xffffffa9,%ecx
movsbl 0x1(%rdi),%eax
lea    -0x30(%rax),%edx
cmp    $0xa,%dl
jae    113c <get_hex_u32+0x3c>
shl    $0x4,%ecx
or     %eax,%ecx
mov    %ecx,%eax
jmp    1160 <get_hex_u32+0x60>
lea    -0x41(%rax),%edx
cmp    $0x6,%dl
jae    114c <get_hex_u32+0x4c>
shl    $0x4,%ecx
add    $0xffffffc9,%eax
jmp    115e <get_hex_u32+0x5e>
lea    -0x61(%rax),%edx
cmp    $0x5,%dl
ja     12a7 <get_hex_u32+0x1a7>
shl    $0x4,%ecx
add    $0xffffffa9,%eax
or     %ecx,%eax
movsbl 0x2(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    1173 <get_hex_u32+0x73>
shl    $0x4,%eax
or     %ecx,%eax
jmp    1199 <get_hex_u32+0x99>
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    1183 <get_hex_u32+0x83>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    1195 <get_hex_u32+0x95>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
movsbl 0x3(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    11ac <get_hex_u32+0xac>
shl    $0x4,%eax
or     %ecx,%eax
jmp    11d2 <get_hex_u32+0xd2>
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    11bc <get_hex_u32+0xbc>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    11ce <get_hex_u32+0xce>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
movsbl 0x4(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    11e5 <get_hex_u32+0xe5>
shl    $0x4,%eax
or     %ecx,%eax
jmp    120b <get_hex_u32+0x10b>
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    11f5 <get_hex_u32+0xf5>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    1207 <get_hex_u32+0x107>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
movsbl 0x5(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    121e <get_hex_u32+0x11e>
shl    $0x4,%eax
or     %ecx,%eax
jmp    1240 <get_hex_u32+0x140>
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    122e <get_hex_u32+0x12e>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    123c <get_hex_u32+0x13c>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
movsbl 0x6(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    1253 <get_hex_u32+0x153>
shl    $0x4,%eax
or     %ecx,%eax
jmp    1275 <get_hex_u32+0x175>
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    1263 <get_hex_u32+0x163>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    1271 <get_hex_u32+0x171>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
movsbl 0x7(%rdi),%ecx
lea    -0x30(%rcx),%edx
cmp    $0xa,%dl
jae    1287 <get_hex_u32+0x187>
shl    $0x4,%eax
or     %ecx,%eax
ret
lea    -0x41(%rcx),%edx
cmp    $0x6,%dl
jae    1297 <get_hex_u32+0x197>
shl    $0x4,%eax
add    $0xffffffc9,%ecx
jmp    12a5 <get_hex_u32+0x1a5>
lea    -0x61(%rcx),%edx
cmp    $0x5,%dl
ja     1286 <get_hex_u32+0x186>
shl    $0x4,%eax
add    $0xffffffa9,%ecx
or     %eax,%ecx
mov    %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @get_hex_u32(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 %16, label %6
6: ; preds = %1
%7 = add i8 %2, -65
%8 = icmp ult i8 %7, 6
br i1 %8, label %9, label %11
9: ; preds = %6
%10 = add nsw i32 %3, -55
br label %16
11: ; preds = %6
%12 = add i8 %2, -97
%13 = icmp ult i8 %12, 6
br i1 %13, label %14, label %184
14: ; preds = %11
%15 = add nsw i32 %3, -87
br label %16
16: ; preds = %1, %14, %9
%17 = phi i32 [ %10, %9 ], [ %15, %14 ], [ %3, %1 ]
%18 = getelementptr inbounds i8, i8* %0, i64 1
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = add i8 %19, -48
%22 = icmp ult i8 %21, 10
br i1 %22, label %37, label %23
23: ; preds = %16
%24 = add i8 %19, -65
%25 = icmp ult i8 %24, 6
br i1 %25, label %33, label %26
26: ; preds = %23
%27 = add i8 %19, -97
%28 = icmp ult i8 %27, 6
br i1 %28, label %29, label %184
29: ; preds = %26
%30 = shl nsw i32 %17, 4
%31 = add nsw i32 %20, -87
%32 = or i32 %31, %30
br label %40
33: ; preds = %23
%34 = shl nsw i32 %17, 4
%35 = add nsw i32 %20, -55
%36 = or i32 %35, %34
br label %40
37: ; preds = %16
%38 = shl nsw i32 %17, 4
%39 = or i32 %38, %20
br label %40
40: ; preds = %37, %33, %29
%41 = phi i32 [ %39, %37 ], [ %36, %33 ], [ %32, %29 ]
%42 = getelementptr inbounds i8, i8* %0, i64 2
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = add i8 %43, -48
%46 = icmp ult i8 %45, 10
br i1 %46, label %61, label %47
47: ; preds = %40
%48 = add i8 %43, -65
%49 = icmp ult i8 %48, 6
br i1 %49, label %57, label %50
50: ; preds = %47
%51 = add i8 %43, -97
%52 = icmp ult i8 %51, 6
br i1 %52, label %53, label %184
53: ; preds = %50
%54 = shl nsw i32 %41, 4
%55 = add nsw i32 %44, -87
%56 = or i32 %55, %54
br label %64
57: ; preds = %47
%58 = shl nsw i32 %41, 4
%59 = add nsw i32 %44, -55
%60 = or i32 %59, %58
br label %64
61: ; preds = %40
%62 = shl nsw i32 %41, 4
%63 = or i32 %62, %44
br label %64
64: ; preds = %61, %57, %53
%65 = phi i32 [ %63, %61 ], [ %60, %57 ], [ %56, %53 ]
%66 = getelementptr inbounds i8, i8* %0, i64 3
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = add i8 %67, -48
%70 = icmp ult i8 %69, 10
br i1 %70, label %85, label %71
71: ; preds = %64
%72 = add i8 %67, -65
%73 = icmp ult i8 %72, 6
br i1 %73, label %81, label %74
74: ; preds = %71
%75 = add i8 %67, -97
%76 = icmp ult i8 %75, 6
br i1 %76, label %77, label %184
77: ; preds = %74
%78 = shl i32 %65, 4
%79 = add nsw i32 %68, -87
%80 = or i32 %79, %78
br label %88
81: ; preds = %71
%82 = shl i32 %65, 4
%83 = add nsw i32 %68, -55
%84 = or i32 %83, %82
br label %88
85: ; preds = %64
%86 = shl i32 %65, 4
%87 = or i32 %86, %68
br label %88
88: ; preds = %85, %81, %77
%89 = phi i32 [ %87, %85 ], [ %84, %81 ], [ %80, %77 ]
%90 = getelementptr inbounds i8, i8* %0, i64 4
%91 = load i8, i8* %90
%92 = sext i8 %91 to i32
%93 = add i8 %91, -48
%94 = icmp ult i8 %93, 10
br i1 %94, label %109, label %95
95: ; preds = %88
%96 = add i8 %91, -65
%97 = icmp ult i8 %96, 6
br i1 %97, label %105, label %98
98: ; preds = %95
%99 = add i8 %91, -97
%100 = icmp ult i8 %99, 6
br i1 %100, label %101, label %184
101: ; preds = %98
%102 = shl i32 %89, 4
%103 = add nsw i32 %92, -87
%104 = or i32 %103, %102
br label %112
105: ; preds = %95
%106 = shl i32 %89, 4
%107 = add nsw i32 %92, -55
%108 = or i32 %107, %106
br label %112
109: ; preds = %88
%110 = shl i32 %89, 4
%111 = or i32 %110, %92
br label %112
112: ; preds = %109, %105, %101
%113 = phi i32 [ %111, %109 ], [ %108, %105 ], [ %104, %101 ]
%114 = getelementptr inbounds i8, i8* %0, i64 5
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = add i8 %115, -48
%118 = icmp ult i8 %117, 10
br i1 %118, label %133, label %119
119: ; preds = %112
%120 = add i8 %115, -65
%121 = icmp ult i8 %120, 6
br i1 %121, label %129, label %122
122: ; preds = %119
%123 = add i8 %115, -97
%124 = icmp ult i8 %123, 6
br i1 %124, label %125, label %184
125: ; preds = %122
%126 = shl i32 %113, 4
%127 = add nsw i32 %116, -87
%128 = or i32 %127, %126
br label %136
129: ; preds = %119
%130 = shl i32 %113, 4
%131 = add nsw i32 %116, -55
%132 = or i32 %131, %130
br label %136
133: ; preds = %112
%134 = shl i32 %113, 4
%135 = or i32 %134, %116
br label %136
136: ; preds = %133, %129, %125
%137 = phi i32 [ %135, %133 ], [ %132, %129 ], [ %128, %125 ]
%138 = getelementptr inbounds i8, i8* %0, i64 6
%139 = load i8, i8* %138
%140 = sext i8 %139 to i32
%141 = add i8 %139, -48
%142 = icmp ult i8 %141, 10
br i1 %142, label %157, label %143
143: ; preds = %136
%144 = add i8 %139, -65
%145 = icmp ult i8 %144, 6
br i1 %145, label %153, label %146
146: ; preds = %143
%147 = add i8 %139, -97
%148 = icmp ult i8 %147, 6
br i1 %148, label %149, label %184
149: ; preds = %146
%150 = shl i32 %137, 4
%151 = add nsw i32 %140, -87
%152 = or i32 %151, %150
br label %160
153: ; preds = %143
%154 = shl i32 %137, 4
%155 = add nsw i32 %140, -55
%156 = or i32 %155, %154
br label %160
157: ; preds = %136
%158 = shl i32 %137, 4
%159 = or i32 %158, %140
br label %160
160: ; preds = %157, %153, %149
%161 = phi i32 [ %159, %157 ], [ %156, %153 ], [ %152, %149 ]
%162 = getelementptr inbounds i8, i8* %0, i64 7
%163 = load i8, i8* %162
%164 = sext i8 %163 to i32
%165 = add i8 %163, -48
%166 = icmp ult i8 %165, 10
br i1 %166, label %181, label %167
167: ; preds = %160
%168 = add i8 %163, -65
%169 = icmp ult i8 %168, 6
br i1 %169, label %177, label %170
170: ; preds = %167
%171 = add i8 %163, -97
%172 = icmp ult i8 %171, 6
br i1 %172, label %173, label %184
173: ; preds = %170
%174 = shl i32 %161, 4
%175 = add nsw i32 %164, -87
%176 = or i32 %175, %174
br label %184
177: ; preds = %167
%178 = shl i32 %161, 4
%179 = add nsw i32 %164, -55
%180 = or i32 %179, %178
br label %184
181: ; preds = %160
%182 = shl i32 %161, 4
%183 = or i32 %182, %164
br label %184
184: ; preds = %173, %177, %181, %170, %146, %122, %98, %74, %50, %26, %11
%185 = phi i32 [ 0, %11 ], [ %17, %26 ], [ %41, %50 ], [ %65, %74 ], [ %89, %98 ], [ %113, %122 ], [ %137, %146 ], [ %161, %170 ], [ %183, %181 ], [ %180, %177 ], [ %176, %173 ]
ret i32 %185
}