#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 */

/* Variables and functions */
char *skip_spaces(char const *);
char *hex_to_signed(const char *str, long *out) {
  const char *cur = skip_spaces(str);
  long value = 0;
  int isneg = 0, isempty = 1;
  if (cur[0] == '+') {
    cur += 1;
  } else if (cur[0] == '-') {
    cur += 1;
    isneg = 1;
  }
  if (cur[0] == '0' && cur[1] == 'x') {
    cur += 2;
  }
  while (*cur != '\0') {
    if (*cur >= '0' && *cur <= '9') {
      value = (value * 16) + (*cur - '0');
    } else if (*cur >= 'a' && *cur <= 'f') {
      value = (value * 16) + 10 + (*cur - 'a');
    } else if (*cur >= 'A' && *cur <= 'F') {
      value = (value * 16) + 10 + (*cur - 'A');
    } else {
      break;
    }
    isempty = 0;
    ++cur;
  }
  if (isempty) {
    return (char *)str;
  }
  if (isneg) {
    *out = -value;
  } else {
    *out = value;
  }
  return (char *)cur;
}


x86 assembly (clang, -O0):
<hex_to_signed>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <skip_spaces@plt>
mov    %rax,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1164 <hex_to_signed+0x54>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    118c <hex_to_signed+0x7c>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1187 <hex_to_signed+0x77>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
movl   $0x1,-0x2c(%rbp)
jmp    118c <hex_to_signed+0x7c>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    11b9 <hex_to_signed+0xa9>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
jne    11b9 <hex_to_signed+0xa9>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
jmp    11be <hex_to_signed+0xae>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12c0 <hex_to_signed+0x1b0>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     120f <hex_to_signed+0xff>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     120f <hex_to_signed+0xff>
mov    -0x28(%rbp),%rax
shl    $0x4,%rax
mov    -0x20(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    12a8 <hex_to_signed+0x198>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1254 <hex_to_signed+0x144>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     1254 <hex_to_signed+0x144>
mov    -0x28(%rbp),%rax
shl    $0x4,%rax
add    $0xa,%rax
mov    -0x20(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x61,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    12a3 <hex_to_signed+0x193>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x41,%eax
jl     1299 <hex_to_signed+0x189>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x46,%eax
jg     1299 <hex_to_signed+0x189>
mov    -0x28(%rbp),%rax
shl    $0x4,%rax
add    $0xa,%rax
mov    -0x20(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x41,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    129e <hex_to_signed+0x18e>
jmp    12c0 <hex_to_signed+0x1b0>
jmp    12a3 <hex_to_signed+0x193>
jmp    12a8 <hex_to_signed+0x198>
movl   $0x0,-0x30(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    11be <hex_to_signed+0xae>
cmpl   $0x0,-0x30(%rbp)
je     12d7 <hex_to_signed+0x1c7>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1308 <hex_to_signed+0x1f8>
cmpl   $0x0,-0x2c(%rbp)
je     12f5 <hex_to_signed+0x1e5>
xor    %eax,%eax
mov    %eax,%ecx
sub    -0x28(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
jmp    1300 <hex_to_signed+0x1f0>
mov    -0x28(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hex_to_signed>:
push   %r15
push   %r14
push   %rbx
mov    %rsi,%r14
mov    %rdi,%r15
call   1030 <skip_spaces@plt>
mov    (%rax),%dil
mov    $0x1,%r8b
cmp    $0x2b,%dil
je     1135 <hex_to_signed+0x25>
cmp    $0x2d,%dil
jne    113d <hex_to_signed+0x2d>
xor    %r8d,%r8d
mov    0x1(%rax),%dil
add    $0x1,%rax
cmp    $0x30,%dil
jne    1154 <hex_to_signed+0x44>
xor    %ecx,%ecx
cmpb   $0x78,0x1(%rax)
sete   %cl
mov    (%rax,%rcx,2),%dil
lea    (%rax,%rcx,2),%rax
test   %dil,%dil
je     11f6 <hex_to_signed+0xe6>
mov    $0xffffff9f,%r9d
xor    %ebx,%ebx
xor    %esi,%esi
jmp    118d <hex_to_signed+0x7d>
nopl   0x0(%rax)
shl    $0x4,%rsi
lea    (%r9,%rcx,1),%edi
add    $0x31,%edi
add    %rdi,%rsi
movzbl 0x1(%rax),%edi
add    $0x1,%rax
mov    $0x1,%bl
test   %dil,%dil
je     11e3 <hex_to_signed+0xd3>
movsbq %dil,%rcx
lea    -0x30(%rcx),%edx
cmp    $0x9,%dl
jbe    1170 <hex_to_signed+0x60>
lea    -0x61(%rdi),%edx
cmp    $0x5,%dl
ja     11c0 <hex_to_signed+0xb0>
shl    $0x4,%rsi
mov    %rsi,%rdi
or     $0xa,%rdi
add    %r9d,%ecx
mov    %rcx,%rsi
jmp    117b <hex_to_signed+0x6b>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0xbf,%dil
cmp    $0x5,%dil
ja     11de <hex_to_signed+0xce>
shl    $0x4,%rsi
mov    %rsi,%rdi
or     $0xa,%rdi
lea    (%r9,%rcx,1),%esi
add    $0x20,%esi
jmp    117b <hex_to_signed+0x6b>
test   $0x1,%bl
je     11f6 <hex_to_signed+0xe6>
mov    %rsi,%rcx
neg    %rcx
test   %r8b,%r8b
cmovne %rsi,%rcx
mov    %rcx,(%r14)
mov    %rax,%r15
mov    %r15,%rax
pop    %rbx
pop    %r14
pop    %r15
ret

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

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