#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int int32_t;

/* Variables and functions */
int32_t hex4_to_int(const char *hex4) {
  unsigned char c = *hex4++;
  int hval = 0, value;
  if (c >= '0' && c <= '9')
    hval = c - '0';
  else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
    hval = (c | 0x20) - 'a' + 10;
  } else {
    return -1;
  }
  value = hval;
  c = *hex4++;
  if (c >= '0' && c <= '9')
    hval = c - '0';
  else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
    hval = (c | 0x20) - 'a' + 10;
  } else {
    return -1;
  }
  value = (value << 4) | hval;
  c = *hex4++;
  if (c >= '0' && c <= '9')
    hval = c - '0';
  else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
    hval = (c | 0x20) - 'a' + 10;
  } else {
    return -1;
  }
  value = (value << 4) | hval;
  c = *hex4++;
  if (c >= '0' && c <= '9')
    hval = c - '0';
  else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
    hval = (c | 0x20) - 'a' + 10;
  } else {
    return -1;
  }
  value = (value << 4) | hval;
  return value;
}


x86 assembly (clang, -O0):
<hex4_to_int>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x11(%rbp)
movl   $0x0,-0x18(%rbp)
movzbl -0x11(%rbp),%eax
cmp    $0x30,%eax
jl     114c <hex4_to_int+0x4c>
movzbl -0x11(%rbp),%eax
cmp    $0x39,%eax
jg     114c <hex4_to_int+0x4c>
movzbl -0x11(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
jmp    1192 <hex4_to_int+0x92>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x61,%eax
jl     1181 <hex4_to_int+0x81>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x66,%eax
jg     1181 <hex4_to_int+0x81>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x18(%rbp)
jmp    118d <hex4_to_int+0x8d>
movl   $0xffffffff,-0x4(%rbp)
jmp    134b <hex4_to_int+0x24b>
jmp    1192 <hex4_to_int+0x92>
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x11(%rbp)
movzbl -0x11(%rbp),%eax
cmp    $0x30,%eax
jl     11d5 <hex4_to_int+0xd5>
movzbl -0x11(%rbp),%eax
cmp    $0x39,%eax
jg     11d5 <hex4_to_int+0xd5>
movzbl -0x11(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
jmp    121b <hex4_to_int+0x11b>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x61,%eax
jl     120a <hex4_to_int+0x10a>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x66,%eax
jg     120a <hex4_to_int+0x10a>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x18(%rbp)
jmp    1216 <hex4_to_int+0x116>
movl   $0xffffffff,-0x4(%rbp)
jmp    134b <hex4_to_int+0x24b>
jmp    121b <hex4_to_int+0x11b>
mov    -0x1c(%rbp),%eax
shl    $0x4,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x11(%rbp)
movzbl -0x11(%rbp),%eax
cmp    $0x30,%eax
jl     1264 <hex4_to_int+0x164>
movzbl -0x11(%rbp),%eax
cmp    $0x39,%eax
jg     1264 <hex4_to_int+0x164>
movzbl -0x11(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
jmp    12aa <hex4_to_int+0x1aa>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x61,%eax
jl     1299 <hex4_to_int+0x199>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x66,%eax
jg     1299 <hex4_to_int+0x199>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x18(%rbp)
jmp    12a5 <hex4_to_int+0x1a5>
movl   $0xffffffff,-0x4(%rbp)
jmp    134b <hex4_to_int+0x24b>
jmp    12aa <hex4_to_int+0x1aa>
mov    -0x1c(%rbp),%eax
shl    $0x4,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x11(%rbp)
movzbl -0x11(%rbp),%eax
cmp    $0x30,%eax
jl     12f3 <hex4_to_int+0x1f3>
movzbl -0x11(%rbp),%eax
cmp    $0x39,%eax
jg     12f3 <hex4_to_int+0x1f3>
movzbl -0x11(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x18(%rbp)
jmp    1339 <hex4_to_int+0x239>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x61,%eax
jl     1328 <hex4_to_int+0x228>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
cmp    $0x66,%eax
jg     1328 <hex4_to_int+0x228>
movzbl -0x11(%rbp),%eax
or     $0x20,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x18(%rbp)
jmp    1334 <hex4_to_int+0x234>
movl   $0xffffffff,-0x4(%rbp)
jmp    134b <hex4_to_int+0x24b>
jmp    1339 <hex4_to_int+0x239>
mov    -0x1c(%rbp),%eax
shl    $0x4,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hex4_to_int>:
movzbl (%rdi),%ecx
lea    -0x30(%rcx),%eax
cmp    $0x9,%al
ja     110f <hex4_to_int+0xf>
add    $0xffffffd0,%ecx
jmp    1126 <hex4_to_int+0x26>
or     $0x20,%ecx
lea    -0x61(%rcx),%edx
mov    $0xffffffff,%eax
cmp    $0x5,%edx
ja     11a4 <hex4_to_int+0xa4>
add    $0xffffffa9,%ecx
movzbl 0x1(%rdi),%edx
lea    -0x30(%rdx),%eax
cmp    $0x9,%al
ja     1136 <hex4_to_int+0x36>
add    $0xffffffd0,%edx
jmp    1149 <hex4_to_int+0x49>
or     $0x20,%edx
lea    -0x61(%rdx),%esi
mov    $0xffffffff,%eax
cmp    $0x5,%esi
ja     11a4 <hex4_to_int+0xa4>
add    $0xffffffa9,%edx
movzbl 0x2(%rdi),%esi
lea    -0x30(%rsi),%eax
cmp    $0x9,%al
ja     1159 <hex4_to_int+0x59>
add    $0xffffffd0,%esi
jmp    116e <hex4_to_int+0x6e>
or     $0x20,%esi
lea    -0x61(%rsi),%r8d
mov    $0xffffffff,%eax
cmp    $0x5,%r8d
ja     11a4 <hex4_to_int+0xa4>
add    $0xffffffa9,%esi
movzbl 0x3(%rdi),%edi
lea    -0x30(%rdi),%eax
cmp    $0x9,%al
ja     117e <hex4_to_int+0x7e>
add    $0xffffffd0,%edi
jmp    1193 <hex4_to_int+0x93>
or     $0x20,%edi
lea    -0x61(%rdi),%r8d
mov    $0xffffffff,%eax
cmp    $0x5,%r8d
ja     11a4 <hex4_to_int+0xa4>
add    $0xffffffa9,%edi
shl    $0x8,%ecx
shl    $0x4,%edx
or     %ecx,%edx
or     %esi,%edx
shl    $0x4,%edx
or     %edi,%edx
mov    %edx,%eax
ret

LLVM IR (-O0):
define i32 @hex4_to_int(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i8
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %3
%7 = load i8*, i8** %3
%8 = getelementptr inbounds i8, i8* %7, i32 1
store i8* %8, i8** %3
%9 = load i8, i8* %7
store i8 %9, i8* %4
store i32 0, i32* %5
%10 = load i8, i8* %4
%11 = zext i8 %10 to i32
%12 = icmp sge i32 %11, 48
br i1 %12, label %13, label %21
13: ; preds = %1
%14 = load i8, i8* %4
%15 = zext i8 %14 to i32
%16 = icmp sle i32 %15, 57
br i1 %16, label %17, label %21
17: ; preds = %13
%18 = load i8, i8* %4
%19 = zext i8 %18 to i32
%20 = sub nsw i32 %19, 48
store i32 %20, i32* %5
br label %39
21: ; preds = %13, %1
%22 = load i8, i8* %4
%23 = zext i8 %22 to i32
%24 = or i32 %23, 32
%25 = icmp sge i32 %24, 97
br i1 %25, label %26, label %37
26: ; preds = %21
%27 = load i8, i8* %4
%28 = zext i8 %27 to i32
%29 = or i32 %28, 32
%30 = icmp sle i32 %29, 102
br i1 %30, label %31, label %37
31: ; preds = %26
%32 = load i8, i8* %4
%33 = zext i8 %32 to i32
%34 = or i32 %33, 32
%35 = sub nsw i32 %34, 97
%36 = add nsw i32 %35, 10
store i32 %36, i32* %5
br label %38
37: ; preds = %26, %21
store i32 -1, i32* %2
br label %153
38: ; preds = %31
br label %39
39: ; preds = %38, %17
%40 = load i32, i32* %5
store i32 %40, i32* %6
%41 = load i8*, i8** %3
%42 = getelementptr inbounds i8, i8* %41, i32 1
store i8* %42, i8** %3
%43 = load i8, i8* %41
store i8 %43, i8* %4
%44 = load i8, i8* %4
%45 = zext i8 %44 to i32
%46 = icmp sge i32 %45, 48
br i1 %46, label %47, label %55
47: ; preds = %39
%48 = load i8, i8* %4
%49 = zext i8 %48 to i32
%50 = icmp sle i32 %49, 57
br i1 %50, label %51, label %55
51: ; preds = %47
%52 = load i8, i8* %4
%53 = zext i8 %52 to i32
%54 = sub nsw i32 %53, 48
store i32 %54, i32* %5
br label %73
55: ; preds = %47, %39
%56 = load i8, i8* %4
%57 = zext i8 %56 to i32
%58 = or i32 %57, 32
%59 = icmp sge i32 %58, 97
br i1 %59, label %60, label %71
60: ; preds = %55
%61 = load i8, i8* %4
%62 = zext i8 %61 to i32
%63 = or i32 %62, 32
%64 = icmp sle i32 %63, 102
br i1 %64, label %65, label %71
65: ; preds = %60
%66 = load i8, i8* %4
%67 = zext i8 %66 to i32
%68 = or i32 %67, 32
%69 = sub nsw i32 %68, 97
%70 = add nsw i32 %69, 10
store i32 %70, i32* %5
br label %72
71: ; preds = %60, %55
store i32 -1, i32* %2
br label %153
72: ; preds = %65
br label %73
73: ; preds = %72, %51
%74 = load i32, i32* %6
%75 = shl i32 %74, 4
%76 = load i32, i32* %5
%77 = or i32 %75, %76
store i32 %77, i32* %6
%78 = load i8*, i8** %3
%79 = getelementptr inbounds i8, i8* %78, i32 1
store i8* %79, i8** %3
%80 = load i8, i8* %78
store i8 %80, i8* %4
%81 = load i8, i8* %4
%82 = zext i8 %81 to i32
%83 = icmp sge i32 %82, 48
br i1 %83, label %84, label %92
84: ; preds = %73
%85 = load i8, i8* %4
%86 = zext i8 %85 to i32
%87 = icmp sle i32 %86, 57
br i1 %87, label %88, label %92
88: ; preds = %84
%89 = load i8, i8* %4
%90 = zext i8 %89 to i32
%91 = sub nsw i32 %90, 48
store i32 %91, i32* %5
br label %110
92: ; preds = %84, %73
%93 = load i8, i8* %4
%94 = zext i8 %93 to i32
%95 = or i32 %94, 32
%96 = icmp sge i32 %95, 97
br i1 %96, label %97, label %108
97: ; preds = %92
%98 = load i8, i8* %4
%99 = zext i8 %98 to i32
%100 = or i32 %99, 32
%101 = icmp sle i32 %100, 102
br i1 %101, label %102, label %108
102: ; preds = %97
%103 = load i8, i8* %4
%104 = zext i8 %103 to i32
%105 = or i32 %104, 32
%106 = sub nsw i32 %105, 97
%107 = add nsw i32 %106, 10
store i32 %107, i32* %5
br label %109
108: ; preds = %97, %92
store i32 -1, i32* %2
br label %153
109: ; preds = %102
br label %110
110: ; preds = %109, %88
%111 = load i32, i32* %6
%112 = shl i32 %111, 4
%113 = load i32, i32* %5
%114 = or i32 %112, %113
store i32 %114, i32* %6
%115 = load i8*, i8** %3
%116 = getelementptr inbounds i8, i8* %115, i32 1
store i8* %116, i8** %3
%117 = load i8, i8* %115
store i8 %117, i8* %4
%118 = load i8, i8* %4
%119 = zext i8 %118 to i32
%120 = icmp sge i32 %119, 48
br i1 %120, label %121, label %129
121: ; preds = %110
%122 = load i8, i8* %4
%123 = zext i8 %122 to i32
%124 = icmp sle i32 %123, 57
br i1 %124, label %125, label %129
125: ; preds = %121
%126 = load i8, i8* %4
%127 = zext i8 %126 to i32
%128 = sub nsw i32 %127, 48
store i32 %128, i32* %5
br label %147
129: ; preds = %121, %110
%130 = load i8, i8* %4
%131 = zext i8 %130 to i32
%132 = or i32 %131, 32
%133 = icmp sge i32 %132, 97
br i1 %133, label %134, label %145
134: ; preds = %129
%135 = load i8, i8* %4
%136 = zext i8 %135 to i32
%137 = or i32 %136, 32
%138 = icmp sle i32 %137, 102
br i1 %138, label %139, label %145
139: ; preds = %134
%140 = load i8, i8* %4
%141 = zext i8 %140 to i32
%142 = or i32 %141, 32
%143 = sub nsw i32 %142, 97
%144 = add nsw i32 %143, 10
store i32 %144, i32* %5
br label %146
145: ; preds = %134, %129
store i32 -1, i32* %2
br label %153
146: ; preds = %139
br label %147
147: ; preds = %146, %125
%148 = load i32, i32* %6
%149 = shl i32 %148, 4
%150 = load i32, i32* %5
%151 = or i32 %149, %150
store i32 %151, i32* %6
%152 = load i32, i32* %6
store i32 %152, i32* %2
br label %153
153: ; preds = %147, %145, %108, %71, %37
%154 = load i32, i32* %2
ret i32 %154
}

LLVM IR (-O2):
define i32 @hex4_to_int(i8* nocapture %0) {
%2 = getelementptr inbounds i8, i8* %0, i64 1
%3 = load i8, i8* %0
%4 = zext i8 %3 to i32
%5 = add i8 %3, -48
%6 = icmp ult i8 %5, 10
br i1 %6, label %7, label %9
7: ; preds = %1
%8 = add nsw i32 %4, -48
br label %15
9: ; preds = %1
%10 = or i32 %4, 32
%11 = add nsw i32 %10, -97
%12 = icmp ult i32 %11, 6
br i1 %12, label %13, label %67
13: ; preds = %9
%14 = add nsw i32 %10, -87
br label %15
15: ; preds = %13, %7
%16 = phi i32 [ %8, %7 ], [ %14, %13 ]
%17 = getelementptr inbounds i8, i8* %0, i64 2
%18 = load i8, i8* %2
%19 = zext i8 %18 to i32
%20 = add i8 %18, -48
%21 = icmp ult i8 %20, 10
br i1 %21, label %22, label %24
22: ; preds = %15
%23 = add nsw i32 %19, -48
br label %30
24: ; preds = %15
%25 = or i32 %19, 32
%26 = add nsw i32 %25, -97
%27 = icmp ult i32 %26, 6
br i1 %27, label %28, label %67
28: ; preds = %24
%29 = add nsw i32 %25, -87
br label %30
30: ; preds = %28, %22
%31 = phi i32 [ %23, %22 ], [ %29, %28 ]
%32 = getelementptr inbounds i8, i8* %0, i64 3
%33 = load i8, i8* %17
%34 = zext i8 %33 to i32
%35 = add i8 %33, -48
%36 = icmp ult i8 %35, 10
br i1 %36, label %37, label %39
37: ; preds = %30
%38 = add nsw i32 %34, -48
br label %45
39: ; preds = %30
%40 = or i32 %34, 32
%41 = add nsw i32 %40, -97
%42 = icmp ult i32 %41, 6
br i1 %42, label %43, label %67
43: ; preds = %39
%44 = add nsw i32 %40, -87
br label %45
45: ; preds = %43, %37
%46 = phi i32 [ %38, %37 ], [ %44, %43 ]
%47 = shl nsw i32 %16, 8
%48 = shl nsw i32 %31, 4
%49 = or i32 %48, %47
%50 = or i32 %49, %46
%51 = load i8, i8* %32
%52 = zext i8 %51 to i32
%53 = add i8 %51, -48
%54 = icmp ult i8 %53, 10
br i1 %54, label %55, label %57
55: ; preds = %45
%56 = add nsw i32 %52, -48
br label %63
57: ; preds = %45
%58 = or i32 %52, 32
%59 = add nsw i32 %58, -97
%60 = icmp ult i32 %59, 6
br i1 %60, label %61, label %67
61: ; preds = %57
%62 = add nsw i32 %58, -87
br label %63
63: ; preds = %61, %55
%64 = phi i32 [ %56, %55 ], [ %62, %61 ]
%65 = shl i32 %50, 4
%66 = or i32 %64, %65
br label %67
67: ; preds = %57, %39, %24, %9, %63
%68 = phi i32 [ %66, %63 ], [ -1, %9 ], [ -1, %24 ], [ -1, %39 ], [ -1, %57 ]
ret i32 %68
}