#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 uint8_t;
typedef int uint64_t;

/* Variables and functions */
int /*<<< orphan*/ bitch(char *, char *);
scalar_t__ isdigit(char);
int /*<<< orphan*/ isspace(char);
scalar_t__ isxdigit(char);
char *skip_white_space(char *);
int extract_u64(char **input, char *what, uint64_t *r) {
  char *s = *input;
  uint8_t result = 0;
  unsigned u;
  if (!isxdigit(*s)) {
    bitch("%s is not valid", what);
    return -1;
  }
  u = 0;
  while (isxdigit(*s)) {
    if (isdigit(*s)) {
      u = (u << 4) | (*s - '0');
    } else if (*s >= 'a' && *s <= 'f') {
      u = (u << 4) | (*s - 'a' + 10);
    } else {
      u = (u << 4) | (*s - 'A' + 10);
    }
    s++;
  }
  if (u > 0xffff) {
    bitch("%s is not valid, hex out of range", what);
    return -1;
  }
  result = (result << 16) | u;
  ;
  if (*s != ':') {
    bitch("%s is not valid", what);
    return -1;
  }
  s++;
  ;
  if (!isxdigit(*s)) {
    bitch("%s is not valid", what);
    return -1;
  }
  u = 0;
  while (isxdigit(*s)) {
    if (isdigit(*s)) {
      u = (u << 4) | (*s - '0');
    } else if (*s >= 'a' && *s <= 'f') {
      u = (u << 4) | (*s - 'a' + 10);
    } else {
      u = (u << 4) | (*s - 'A' + 10);
    }
    s++;
  }
  if (u > 0xffff) {
    bitch("%s is not valid, hex out of range", what);
    return -1;
  }
  result = (result << 16) | u;
  ;
  if (*s != ':') {
    bitch("%s is not valid", what);
    return -1;
  }
  s++;
  ;
  if (!isxdigit(*s)) {
    bitch("%s is not valid", what);
    return -1;
  }
  u = 0;
  while (isxdigit(*s)) {
    if (isdigit(*s)) {
      u = (u << 4) | (*s - '0');
    } else if (*s >= 'a' && *s <= 'f') {
      u = (u << 4) | (*s - 'a' + 10);
    } else {
      u = (u << 4) | (*s - 'A' + 10);
    }
    s++;
  }
  if (u > 0xffff) {
    bitch("%s is not valid, hex out of range", what);
    return -1;
  }
  result = (result << 16) | u;
  ;
  if (*s != ':') {
    bitch("%s is not valid", what);
    return -1;
  }
  s++;
  ;
  if (!isxdigit(*s)) {
    bitch("%s is not valid", what);
    return -1;
  }
  u = 0;
  while (isxdigit(*s)) {
    if (isdigit(*s)) {
      u = (u << 4) | (*s - '0');
    } else if (*s >= 'a' && *s <= 'f') {
      u = (u << 4) | (*s - 'a' + 10);
    } else {
      u = (u << 4) | (*s - 'A' + 10);
    }
    s++;
  }
  if (u > 0xffff) {
    bitch("%s is not valid, hex out of range", what);
    return -1;
  }
  result = (result << 16) | u;
  ;
  *r = result;
  if (*s && !isspace(*s) && *s != ';' && *s != ')') {
    bitch("%s is not valid", what);
    return -1;
  }
  *input = skip_white_space(s);
  if (!*input) {
    return -1;
  }
  return 1;
}


x86 assembly (clang, -O0):
<extract_u64>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
jne    11a8 <extract_u64+0x58>
mov    -0x18(%rbp),%rsi
lea    0xe69(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
movl   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
je     1260 <extract_u64+0x110>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     11f5 <extract_u64+0xa5>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    124f <extract_u64+0xff>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1232 <extract_u64+0xe2>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     1232 <extract_u64+0xe2>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    124a <extract_u64+0xfa>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    124f <extract_u64+0xff>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11af <extract_u64+0x5f>
cmpl   $0xffff,-0x30(%rbp)
jbe    1289 <extract_u64+0x139>
mov    -0x18(%rbp),%rsi
lea    0xd98(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x2c(%rbp),%eax
shl    $0x10,%eax
or     -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
je     12c1 <extract_u64+0x171>
mov    -0x18(%rbp),%rsi
lea    0xd50(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
jne    12ff <extract_u64+0x1af>
mov    -0x18(%rbp),%rsi
lea    0xd12(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
movl   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
je     13b7 <extract_u64+0x267>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     134c <extract_u64+0x1fc>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    13a6 <extract_u64+0x256>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1389 <extract_u64+0x239>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     1389 <extract_u64+0x239>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    13a1 <extract_u64+0x251>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    13a6 <extract_u64+0x256>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1306 <extract_u64+0x1b6>
cmpl   $0xffff,-0x30(%rbp)
jbe    13e0 <extract_u64+0x290>
mov    -0x18(%rbp),%rsi
lea    0xc41(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x2c(%rbp),%eax
shl    $0x10,%eax
or     -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
je     1418 <extract_u64+0x2c8>
mov    -0x18(%rbp),%rsi
lea    0xbf9(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
jne    1456 <extract_u64+0x306>
mov    -0x18(%rbp),%rsi
lea    0xbbb(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
movl   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
je     150e <extract_u64+0x3be>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     14a3 <extract_u64+0x353>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    14fd <extract_u64+0x3ad>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     14e0 <extract_u64+0x390>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     14e0 <extract_u64+0x390>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    14f8 <extract_u64+0x3a8>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    14fd <extract_u64+0x3ad>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    145d <extract_u64+0x30d>
cmpl   $0xffff,-0x30(%rbp)
jbe    1537 <extract_u64+0x3e7>
mov    -0x18(%rbp),%rsi
lea    0xaea(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x2c(%rbp),%eax
shl    $0x10,%eax
or     -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
je     156f <extract_u64+0x41f>
mov    -0x18(%rbp),%rsi
lea    0xaa2(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
jne    15ad <extract_u64+0x45d>
mov    -0x18(%rbp),%rsi
lea    0xa64(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
movl   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isxdigit@plt>
cmp    $0x0,%rax
je     1665 <extract_u64+0x515>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     15fa <extract_u64+0x4aa>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    1654 <extract_u64+0x504>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1637 <extract_u64+0x4e7>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jg     1637 <extract_u64+0x4e7>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x61,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    164f <extract_u64+0x4ff>
mov    -0x30(%rbp),%eax
shl    $0x4,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x41,%ecx
add    $0xa,%ecx
or     %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    1654 <extract_u64+0x504>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    15b4 <extract_u64+0x464>
cmpl   $0xffff,-0x30(%rbp)
jbe    168e <extract_u64+0x53e>
mov    -0x18(%rbp),%rsi
lea    0x993(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x2c(%rbp),%eax
shl    $0x10,%eax
or     -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1704 <extract_u64+0x5b4>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
jne    1704 <extract_u64+0x5b4>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3b,%eax
je     1704 <extract_u64+0x5b4>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x29,%eax
je     1704 <extract_u64+0x5b4>
mov    -0x18(%rbp),%rsi
lea    0x90d(%rip),%rdi
call   1040 <bitch@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
mov    -0x28(%rbp),%rdi
call   1060 <skip_white_space@plt>
mov    %rax,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
cmpq   $0x0,(%rax)
jne    1731 <extract_u64+0x5e1>
movl   $0xffffffff,-0x4(%rbp)
jmp    1738 <extract_u64+0x5e8>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<extract_u64>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdx,%r12
mov    %rsi,%r14
mov    %rdi,%r15
mov    (%rdi),%rbx
movsbl (%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     13c7 <extract_u64+0x277>
movsbl (%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     11ea <extract_u64+0x9a>
xor    %ebp,%ebp
jmp    11ad <extract_u64+0x5d>
nopl   0x0(%rax)
shl    $0x4,%ebp
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
or     %eax,%ebp
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1070 <isxdigit@plt>
test   %rax,%rax
je     11d6 <extract_u64+0x86>
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
jne    1190 <extract_u64+0x40>
movsbl (%rbx),%eax
lea    -0x61(%rax),%ecx
shl    $0x4,%ebp
cmp    $0x5,%cl
ja     11cd <extract_u64+0x7d>
add    $0xffffffa9,%eax
jmp    11d0 <extract_u64+0x80>
add    $0xffffffc9,%eax
or     %ebp,%eax
mov    %eax,%ebp
jmp    119b <extract_u64+0x4b>
cmp    $0x10000,%ebp
jb     11ea <extract_u64+0x9a>
lea    0xe2b(%rip),%rdi
jmp    13ce <extract_u64+0x27e>
cmpb   $0x3a,(%rbx)
jne    13c7 <extract_u64+0x277>
movsbl 0x1(%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     13c7 <extract_u64+0x277>
add    $0x1,%rbx
movsbl (%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     1272 <extract_u64+0x122>
xor    %ebp,%ebp
jmp    123d <extract_u64+0xed>
nopw   0x0(%rax,%rax,1)
shl    $0x4,%ebp
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
or     %eax,%ebp
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1070 <isxdigit@plt>
test   %rax,%rax
je     1266 <extract_u64+0x116>
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
jne    1220 <extract_u64+0xd0>
movsbl (%rbx),%eax
lea    -0x61(%rax),%ecx
shl    $0x4,%ebp
cmp    $0x5,%cl
ja     125d <extract_u64+0x10d>
add    $0xffffffa9,%eax
jmp    1260 <extract_u64+0x110>
add    $0xffffffc9,%eax
or     %ebp,%eax
mov    %eax,%ebp
jmp    122b <extract_u64+0xdb>
cmp    $0x10000,%ebp
jae    11de <extract_u64+0x8e>
cmpb   $0x3a,(%rbx)
jne    13c7 <extract_u64+0x277>
movsbl 0x1(%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     13c7 <extract_u64+0x277>
add    $0x1,%rbx
movsbl (%rbx),%edi
call   1070 <isxdigit@plt>
xor    %ebp,%ebp
test   %rax,%rax
jne    12cd <extract_u64+0x17d>
jmp    1302 <extract_u64+0x1b2>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
shl    $0x4,%ebp
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
or     %eax,%ebp
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1070 <isxdigit@plt>
test   %rax,%rax
je     12f6 <extract_u64+0x1a6>
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
jne    12b0 <extract_u64+0x160>
movsbl (%rbx),%eax
lea    -0x61(%rax),%ecx
shl    $0x4,%ebp
cmp    $0x5,%cl
ja     12ed <extract_u64+0x19d>
add    $0xffffffa9,%eax
jmp    12f0 <extract_u64+0x1a0>
add    $0xffffffc9,%eax
or     %ebp,%eax
mov    %eax,%ebp
jmp    12bb <extract_u64+0x16b>
cmp    $0x10000,%ebp
jae    11de <extract_u64+0x8e>
cmpb   $0x3a,(%rbx)
jne    13c7 <extract_u64+0x277>
movsbl 0x1(%rbx),%edi
call   1070 <isxdigit@plt>
test   %rax,%rax
je     13c7 <extract_u64+0x277>
add    $0x1,%rbx
movsbl (%rbx),%edi
call   1070 <isxdigit@plt>
xor    %r13d,%r13d
test   %rax,%rax
jne    1352 <extract_u64+0x202>
jmp    138b <extract_u64+0x23b>
shl    $0x4,%r13d
movsbl (%rbx),%eax
add    $0xffffffd0,%eax
or     %eax,%r13d
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1070 <isxdigit@plt>
test   %rax,%rax
je     137e <extract_u64+0x22e>
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %rax,%rax
jne    1333 <extract_u64+0x1e3>
movsbl (%rbx),%eax
lea    -0x61(%rax),%ecx
shl    $0x4,%r13d
cmp    $0x5,%cl
ja     1373 <extract_u64+0x223>
add    $0xffffffa9,%eax
jmp    1376 <extract_u64+0x226>
add    $0xffffffc9,%eax
or     %r13d,%eax
mov    %eax,%r13d
jmp    1340 <extract_u64+0x1f0>
cmp    $0x10000,%r13d
jae    11de <extract_u64+0x8e>
shl    $0x10,%ebp
or     %r13d,%ebp
mov    %ebp,(%r12)
mov    (%rbx),%al
test   %al,%al
je     13a7 <extract_u64+0x257>
movsbl %al,%edi
call   1050 <isspace@plt>
test   %eax,%eax
je     13bd <extract_u64+0x26d>
mov    %rbx,%rdi
call   1060 <skip_white_space@plt>
mov    %rax,(%r15)
cmp    $0x1,%rax
sbb    %eax,%eax
or     $0x1,%eax
jmp    13db <extract_u64+0x28b>
mov    (%rbx),%al
cmp    $0x29,%al
je     13a7 <extract_u64+0x257>
cmp    $0x3b,%al
je     13a7 <extract_u64+0x257>
lea    0xc32(%rip),%rdi
mov    %r14,%rsi
call   1040 <bitch@plt>
mov    $0xffffffff,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [16 x i8] c"%s is not valid\00"
@.str.1 = [34 x i8] c"%s is not valid, hex out of range\00"
define i32 @extract_u64(i8** %0, i8* %1, i32* %2) {
%4 = alloca i32
%5 = alloca i8**
%6 = alloca i8*
%7 = alloca i32*
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
store i8** %0, i8*** %5
store i8* %1, i8** %6
store i32* %2, i32** %7
%11 = load i8**, i8*** %5
%12 = load i8*, i8** %11
store i8* %12, i8** %8
store i32 0, i32* %9
%13 = load i8*, i8** %8
%14 = load i8, i8* %13
%15 = call i64 @isxdigit(i8 signext %14)
%16 = icmp ne i64 %15, 0
br i1 %16, label %20, label %17
17: ; preds = %3
%18 = load i8*, i8** %6
%19 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %18)
store i32 -1, i32* %4
br label %352
20: ; preds = %3
store i32 0, i32* %10
br label %21
21: ; preds = %68, %20
%22 = load i8*, i8** %8
%23 = load i8, i8* %22
%24 = call i64 @isxdigit(i8 signext %23)
%25 = icmp ne i64 %24, 0
br i1 %25, label %26, label %71
26: ; preds = %21
%27 = load i8*, i8** %8
%28 = load i8, i8* %27
%29 = call i64 @isdigit(i8 signext %28)
%30 = icmp ne i64 %29, 0
br i1 %30, label %31, label %39
31: ; preds = %26
%32 = load i32, i32* %10
%33 = shl i32 %32, 4
%34 = load i8*, i8** %8
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = sub nsw i32 %36, 48
%38 = or i32 %33, %37
store i32 %38, i32* %10
br label %68
39: ; preds = %26
%40 = load i8*, i8** %8
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp sge i32 %42, 97
br i1 %43, label %44, label %58
44: ; preds = %39
%45 = load i8*, i8** %8
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = icmp sle i32 %47, 102
br i1 %48, label %49, label %58
49: ; preds = %44
%50 = load i32, i32* %10
%51 = shl i32 %50, 4
%52 = load i8*, i8** %8
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = sub nsw i32 %54, 97
%56 = add nsw i32 %55, 10
%57 = or i32 %51, %56
store i32 %57, i32* %10
br label %67
58: ; preds = %44, %39
%59 = load i32, i32* %10
%60 = shl i32 %59, 4
%61 = load i8*, i8** %8
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = sub nsw i32 %63, 65
%65 = add nsw i32 %64, 10
%66 = or i32 %60, %65
store i32 %66, i32* %10
br label %67
67: ; preds = %58, %49
br label %68
68: ; preds = %67, %31
%69 = load i8*, i8** %8
%70 = getelementptr inbounds i8, i8* %69, i32 1
store i8* %70, i8** %8
br label %21
71: ; preds = %21
%72 = load i32, i32* %10
%73 = icmp ugt i32 %72, 65535
br i1 %73, label %74, label %77
74: ; preds = %71
%75 = load i8*, i8** %6
%76 = call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %75)
store i32 -1, i32* %4
br label %352
77: ; preds = %71
%78 = load i32, i32* %9
%79 = shl i32 %78, 16
%80 = load i32, i32* %10
%81 = or i32 %79, %80
store i32 %81, i32* %9
%82 = load i8*, i8** %8
%83 = load i8, i8* %82
%84 = sext i8 %83 to i32
%85 = icmp ne i32 %84, 58
br i1 %85, label %86, label %89
86: ; preds = %77
%87 = load i8*, i8** %6
%88 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %87)
store i32 -1, i32* %4
br label %352
89: ; preds = %77
%90 = load i8*, i8** %8
%91 = getelementptr inbounds i8, i8* %90, i32 1
store i8* %91, i8** %8
%92 = load i8*, i8** %8
%93 = load i8, i8* %92
%94 = call i64 @isxdigit(i8 signext %93)
%95 = icmp ne i64 %94, 0
br i1 %95, label %99, label %96
96: ; preds = %89
%97 = load i8*, i8** %6
%98 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %97)
store i32 -1, i32* %4
br label %352
99: ; preds = %89
store i32 0, i32* %10
br label %100
100: ; preds = %147, %99
%101 = load i8*, i8** %8
%102 = load i8, i8* %101
%103 = call i64 @isxdigit(i8 signext %102)
%104 = icmp ne i64 %103, 0
br i1 %104, label %105, label %150
105: ; preds = %100
%106 = load i8*, i8** %8
%107 = load i8, i8* %106
%108 = call i64 @isdigit(i8 signext %107)
%109 = icmp ne i64 %108, 0
br i1 %109, label %110, label %118
110: ; preds = %105
%111 = load i32, i32* %10
%112 = shl i32 %111, 4
%113 = load i8*, i8** %8
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = sub nsw i32 %115, 48
%117 = or i32 %112, %116
store i32 %117, i32* %10
br label %147
118: ; preds = %105
%119 = load i8*, i8** %8
%120 = load i8, i8* %119
%121 = sext i8 %120 to i32
%122 = icmp sge i32 %121, 97
br i1 %122, label %123, label %137
123: ; preds = %118
%124 = load i8*, i8** %8
%125 = load i8, i8* %124
%126 = sext i8 %125 to i32
%127 = icmp sle i32 %126, 102
br i1 %127, label %128, label %137
128: ; preds = %123
%129 = load i32, i32* %10
%130 = shl i32 %129, 4
%131 = load i8*, i8** %8
%132 = load i8, i8* %131
%133 = sext i8 %132 to i32
%134 = sub nsw i32 %133, 97
%135 = add nsw i32 %134, 10
%136 = or i32 %130, %135
store i32 %136, i32* %10
br label %146
137: ; preds = %123, %118
%138 = load i32, i32* %10
%139 = shl i32 %138, 4
%140 = load i8*, i8** %8
%141 = load i8, i8* %140
%142 = sext i8 %141 to i32
%143 = sub nsw i32 %142, 65
%144 = add nsw i32 %143, 10
%145 = or i32 %139, %144
store i32 %145, i32* %10
br label %146
146: ; preds = %137, %128
br label %147
147: ; preds = %146, %110
%148 = load i8*, i8** %8
%149 = getelementptr inbounds i8, i8* %148, i32 1
store i8* %149, i8** %8
br label %100
150: ; preds = %100
%151 = load i32, i32* %10
%152 = icmp ugt i32 %151, 65535
br i1 %152, label %153, label %156
153: ; preds = %150
%154 = load i8*, i8** %6
%155 = call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %154)
store i32 -1, i32* %4
br label %352
156: ; preds = %150
%157 = load i32, i32* %9
%158 = shl i32 %157, 16
%159 = load i32, i32* %10
%160 = or i32 %158, %159
store i32 %160, i32* %9
%161 = load i8*, i8** %8
%162 = load i8, i8* %161
%163 = sext i8 %162 to i32
%164 = icmp ne i32 %163, 58
br i1 %164, label %165, label %168
165: ; preds = %156
%166 = load i8*, i8** %6
%167 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %166)
store i32 -1, i32* %4
br label %352
168: ; preds = %156
%169 = load i8*, i8** %8
%170 = getelementptr inbounds i8, i8* %169, i32 1
store i8* %170, i8** %8
%171 = load i8*, i8** %8
%172 = load i8, i8* %171
%173 = call i64 @isxdigit(i8 signext %172)
%174 = icmp ne i64 %173, 0
br i1 %174, label %178, label %175
175: ; preds = %168
%176 = load i8*, i8** %6
%177 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %176)
store i32 -1, i32* %4
br label %352
178: ; preds = %168
store i32 0, i32* %10
br label %179
179: ; preds = %226, %178
%180 = load i8*, i8** %8
%181 = load i8, i8* %180
%182 = call i64 @isxdigit(i8 signext %181)
%183 = icmp ne i64 %182, 0
br i1 %183, label %184, label %229
184: ; preds = %179
%185 = load i8*, i8** %8
%186 = load i8, i8* %185
%187 = call i64 @isdigit(i8 signext %186)
%188 = icmp ne i64 %187, 0
br i1 %188, label %189, label %197
189: ; preds = %184
%190 = load i32, i32* %10
%191 = shl i32 %190, 4
%192 = load i8*, i8** %8
%193 = load i8, i8* %192
%194 = sext i8 %193 to i32
%195 = sub nsw i32 %194, 48
%196 = or i32 %191, %195
store i32 %196, i32* %10
br label %226
197: ; preds = %184
%198 = load i8*, i8** %8
%199 = load i8, i8* %198
%200 = sext i8 %199 to i32
%201 = icmp sge i32 %200, 97
br i1 %201, label %202, label %216
202: ; preds = %197
%203 = load i8*, i8** %8
%204 = load i8, i8* %203
%205 = sext i8 %204 to i32
%206 = icmp sle i32 %205, 102
br i1 %206, label %207, label %216
207: ; preds = %202
%208 = load i32, i32* %10
%209 = shl i32 %208, 4
%210 = load i8*, i8** %8
%211 = load i8, i8* %210
%212 = sext i8 %211 to i32
%213 = sub nsw i32 %212, 97
%214 = add nsw i32 %213, 10
%215 = or i32 %209, %214
store i32 %215, i32* %10
br label %225
216: ; preds = %202, %197
%217 = load i32, i32* %10
%218 = shl i32 %217, 4
%219 = load i8*, i8** %8
%220 = load i8, i8* %219
%221 = sext i8 %220 to i32
%222 = sub nsw i32 %221, 65
%223 = add nsw i32 %222, 10
%224 = or i32 %218, %223
store i32 %224, i32* %10
br label %225
225: ; preds = %216, %207
br label %226
226: ; preds = %225, %189
%227 = load i8*, i8** %8
%228 = getelementptr inbounds i8, i8* %227, i32 1
store i8* %228, i8** %8
br label %179
229: ; preds = %179
%230 = load i32, i32* %10
%231 = icmp ugt i32 %230, 65535
br i1 %231, label %232, label %235
232: ; preds = %229
%233 = load i8*, i8** %6
%234 = call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %233)
store i32 -1, i32* %4
br label %352
235: ; preds = %229
%236 = load i32, i32* %9
%237 = shl i32 %236, 16
%238 = load i32, i32* %10
%239 = or i32 %237, %238
store i32 %239, i32* %9
%240 = load i8*, i8** %8
%241 = load i8, i8* %240
%242 = sext i8 %241 to i32
%243 = icmp ne i32 %242, 58
br i1 %243, label %244, label %247
244: ; preds = %235
%245 = load i8*, i8** %6
%246 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %245)
store i32 -1, i32* %4
br label %352
247: ; preds = %235
%248 = load i8*, i8** %8
%249 = getelementptr inbounds i8, i8* %248, i32 1
store i8* %249, i8** %8
%250 = load i8*, i8** %8
%251 = load i8, i8* %250
%252 = call i64 @isxdigit(i8 signext %251)
%253 = icmp ne i64 %252, 0
br i1 %253, label %257, label %254
254: ; preds = %247
%255 = load i8*, i8** %6
%256 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %255)
store i32 -1, i32* %4
br label %352
257: ; preds = %247
store i32 0, i32* %10
br label %258
258: ; preds = %305, %257
%259 = load i8*, i8** %8
%260 = load i8, i8* %259
%261 = call i64 @isxdigit(i8 signext %260)
%262 = icmp ne i64 %261, 0
br i1 %262, label %263, label %308
263: ; preds = %258
%264 = load i8*, i8** %8
%265 = load i8, i8* %264
%266 = call i64 @isdigit(i8 signext %265)
%267 = icmp ne i64 %266, 0
br i1 %267, label %268, label %276
268: ; preds = %263
%269 = load i32, i32* %10
%270 = shl i32 %269, 4
%271 = load i8*, i8** %8
%272 = load i8, i8* %271
%273 = sext i8 %272 to i32
%274 = sub nsw i32 %273, 48
%275 = or i32 %270, %274
store i32 %275, i32* %10
br label %305
276: ; preds = %263
%277 = load i8*, i8** %8
%278 = load i8, i8* %277
%279 = sext i8 %278 to i32
%280 = icmp sge i32 %279, 97
br i1 %280, label %281, label %295
281: ; preds = %276
%282 = load i8*, i8** %8
%283 = load i8, i8* %282
%284 = sext i8 %283 to i32
%285 = icmp sle i32 %284, 102
br i1 %285, label %286, label %295
286: ; preds = %281
%287 = load i32, i32* %10
%288 = shl i32 %287, 4
%289 = load i8*, i8** %8
%290 = load i8, i8* %289
%291 = sext i8 %290 to i32
%292 = sub nsw i32 %291, 97
%293 = add nsw i32 %292, 10
%294 = or i32 %288, %293
store i32 %294, i32* %10
br label %304
295: ; preds = %281, %276
%296 = load i32, i32* %10
%297 = shl i32 %296, 4
%298 = load i8*, i8** %8
%299 = load i8, i8* %298
%300 = sext i8 %299 to i32
%301 = sub nsw i32 %300, 65
%302 = add nsw i32 %301, 10
%303 = or i32 %297, %302
store i32 %303, i32* %10
br label %304
304: ; preds = %295, %286
br label %305
305: ; preds = %304, %268
%306 = load i8*, i8** %8
%307 = getelementptr inbounds i8, i8* %306, i32 1
store i8* %307, i8** %8
br label %258
308: ; preds = %258
%309 = load i32, i32* %10
%310 = icmp ugt i32 %309, 65535
br i1 %310, label %311, label %314
311: ; preds = %308
%312 = load i8*, i8** %6
%313 = call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %312)
store i32 -1, i32* %4
br label %352
314: ; preds = %308
%315 = load i32, i32* %9
%316 = shl i32 %315, 16
%317 = load i32, i32* %10
%318 = or i32 %316, %317
store i32 %318, i32* %9
%319 = load i32, i32* %9
%320 = load i32*, i32** %7
store i32 %319, i32* %320
%321 = load i8*, i8** %8
%322 = load i8, i8* %321
%323 = sext i8 %322 to i32
%324 = icmp ne i32 %323, 0
br i1 %324, label %325, label %343
325: ; preds = %314
%326 = load i8*, i8** %8
%327 = load i8, i8* %326
%328 = call i32 @isspace(i8 signext %327)
%329 = icmp ne i32 %328, 0
br i1 %329, label %343, label %330
330: ; preds = %325
%331 = load i8*, i8** %8
%332 = load i8, i8* %331
%333 = sext i8 %332 to i32
%334 = icmp ne i32 %333, 59
br i1 %334, label %335, label %343
335: ; preds = %330
%336 = load i8*, i8** %8
%337 = load i8, i8* %336
%338 = sext i8 %337 to i32
%339 = icmp ne i32 %338, 41
br i1 %339, label %340, label %343
340: ; preds = %335
%341 = load i8*, i8** %6
%342 = call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %341)
store i32 -1, i32* %4
br label %352
343: ; preds = %335, %330, %325, %314
%344 = load i8*, i8** %8
%345 = call i8* @skip_white_space(i8* %344)
%346 = load i8**, i8*** %5
store i8* %345, i8** %346
%347 = load i8**, i8*** %5
%348 = load i8*, i8** %347
%349 = icmp ne i8* %348, null
br i1 %349, label %351, label %350
350: ; preds = %343
store i32 -1, i32* %4
br label %352
351: ; preds = %343
store i32 1, i32* %4
br label %352
352: ; preds = %351, %350, %340, %311, %254, %244, %232, %175, %165, %153, %96, %86, %74, %17
%353 = load i32, i32* %4
ret i32 %353
}

LLVM IR (-O2):
@.str = [16 x i8] c"%s is not valid\00"
@.str.1 = [34 x i8] c"%s is not valid, hex out of range\00"
define i32 @extract_u64(i8** nocapture %0, i8* %1, i32* nocapture writeonly %2) {
%4 = load i8*, i8** %0
%5 = load i8, i8* %4
%6 = tail call i64 @isxdigit(i8 signext %5)
%7 = icmp eq i64 %6, 0
br i1 %7, label %12, label %8
8: ; preds = %3
%9 = load i8, i8* %4
%10 = tail call i64 @isxdigit(i8 signext %9)
%11 = icmp eq i64 %10, 0
br i1 %11, label %48, label %14
12: ; preds = %3
%13 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
14: ; preds = %8, %38
%15 = phi i32 [ %39, %38 ], [ 0, %8 ]
%16 = phi i8* [ %40, %38 ], [ %4, %8 ]
%17 = load i8, i8* %16
%18 = tail call i64 @isdigit(i8 signext %17)
%19 = icmp eq i64 %18, 0
br i1 %19, label %26, label %20
20: ; preds = %14
%21 = shl i32 %15, 4
%22 = load i8, i8* %16
%23 = sext i8 %22 to i32
%24 = add nsw i32 %23, -48
%25 = or i32 %24, %21
br label %38
26: ; preds = %14
%27 = load i8, i8* %16
%28 = sext i8 %27 to i32
%29 = add i8 %27, -97
%30 = icmp ult i8 %29, 6
%31 = shl i32 %15, 4
br i1 %30, label %32, label %35
32: ; preds = %26
%33 = add nsw i32 %28, -87
%34 = or i32 %33, %31
br label %38
35: ; preds = %26
%36 = add nsw i32 %28, -55
%37 = or i32 %36, %31
br label %38
38: ; preds = %32, %35, %20
%39 = phi i32 [ %25, %20 ], [ %34, %32 ], [ %37, %35 ]
%40 = getelementptr inbounds i8, i8* %16, i64 1
%41 = load i8, i8* %40
%42 = tail call i64 @isxdigit(i8 signext %41)
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %14
44: ; preds = %38
%45 = icmp ugt i32 %39, 65535
br i1 %45, label %46, label %48
46: ; preds = %44
%47 = tail call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %1)
br label %220
48: ; preds = %8, %44
%49 = phi i8* [ %40, %44 ], [ %4, %8 ]
%50 = load i8, i8* %49
%51 = icmp eq i8 %50, 58
br i1 %51, label %54, label %52
52: ; preds = %48
%53 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
54: ; preds = %48
%55 = getelementptr inbounds i8, i8* %49, i64 1
%56 = load i8, i8* %55
%57 = tail call i64 @isxdigit(i8 signext %56)
%58 = icmp eq i64 %57, 0
br i1 %58, label %63, label %59
59: ; preds = %54
%60 = load i8, i8* %55
%61 = tail call i64 @isxdigit(i8 signext %60)
%62 = icmp eq i64 %61, 0
br i1 %62, label %99, label %65
63: ; preds = %54
%64 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
65: ; preds = %59, %89
%66 = phi i32 [ %90, %89 ], [ 0, %59 ]
%67 = phi i8* [ %91, %89 ], [ %55, %59 ]
%68 = load i8, i8* %67
%69 = tail call i64 @isdigit(i8 signext %68)
%70 = icmp eq i64 %69, 0
br i1 %70, label %77, label %71
71: ; preds = %65
%72 = shl i32 %66, 4
%73 = load i8, i8* %67
%74 = sext i8 %73 to i32
%75 = add nsw i32 %74, -48
%76 = or i32 %75, %72
br label %89
77: ; preds = %65
%78 = load i8, i8* %67
%79 = sext i8 %78 to i32
%80 = add i8 %78, -97
%81 = icmp ult i8 %80, 6
%82 = shl i32 %66, 4
br i1 %81, label %83, label %86
83: ; preds = %77
%84 = add nsw i32 %79, -87
%85 = or i32 %84, %82
br label %89
86: ; preds = %77
%87 = add nsw i32 %79, -55
%88 = or i32 %87, %82
br label %89
89: ; preds = %83, %86, %71
%90 = phi i32 [ %76, %71 ], [ %85, %83 ], [ %88, %86 ]
%91 = getelementptr inbounds i8, i8* %67, i64 1
%92 = load i8, i8* %91
%93 = tail call i64 @isxdigit(i8 signext %92)
%94 = icmp eq i64 %93, 0
br i1 %94, label %95, label %65
95: ; preds = %89
%96 = icmp ugt i32 %90, 65535
br i1 %96, label %97, label %99
97: ; preds = %95
%98 = tail call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %1)
br label %220
99: ; preds = %59, %95
%100 = phi i8* [ %91, %95 ], [ %55, %59 ]
%101 = load i8, i8* %100
%102 = icmp eq i8 %101, 58
br i1 %102, label %105, label %103
103: ; preds = %99
%104 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
105: ; preds = %99
%106 = getelementptr inbounds i8, i8* %100, i64 1
%107 = load i8, i8* %106
%108 = tail call i64 @isxdigit(i8 signext %107)
%109 = icmp eq i64 %108, 0
br i1 %109, label %114, label %110
110: ; preds = %105
%111 = load i8, i8* %106
%112 = tail call i64 @isxdigit(i8 signext %111)
%113 = icmp eq i64 %112, 0
br i1 %113, label %150, label %116
114: ; preds = %105
%115 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
116: ; preds = %110, %140
%117 = phi i32 [ %141, %140 ], [ 0, %110 ]
%118 = phi i8* [ %142, %140 ], [ %106, %110 ]
%119 = load i8, i8* %118
%120 = tail call i64 @isdigit(i8 signext %119)
%121 = icmp eq i64 %120, 0
br i1 %121, label %128, label %122
122: ; preds = %116
%123 = shl i32 %117, 4
%124 = load i8, i8* %118
%125 = sext i8 %124 to i32
%126 = add nsw i32 %125, -48
%127 = or i32 %126, %123
br label %140
128: ; preds = %116
%129 = load i8, i8* %118
%130 = sext i8 %129 to i32
%131 = add i8 %129, -97
%132 = icmp ult i8 %131, 6
%133 = shl i32 %117, 4
br i1 %132, label %134, label %137
134: ; preds = %128
%135 = add nsw i32 %130, -87
%136 = or i32 %135, %133
br label %140
137: ; preds = %128
%138 = add nsw i32 %130, -55
%139 = or i32 %138, %133
br label %140
140: ; preds = %134, %137, %122
%141 = phi i32 [ %127, %122 ], [ %136, %134 ], [ %139, %137 ]
%142 = getelementptr inbounds i8, i8* %118, i64 1
%143 = load i8, i8* %142
%144 = tail call i64 @isxdigit(i8 signext %143)
%145 = icmp eq i64 %144, 0
br i1 %145, label %146, label %116
146: ; preds = %140
%147 = icmp ugt i32 %141, 65535
br i1 %147, label %148, label %150
148: ; preds = %146
%149 = tail call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %1)
br label %220
150: ; preds = %110, %146
%151 = phi i32 [ %141, %146 ], [ 0, %110 ]
%152 = phi i8* [ %142, %146 ], [ %106, %110 ]
%153 = load i8, i8* %152
%154 = icmp eq i8 %153, 58
br i1 %154, label %157, label %155
155: ; preds = %150
%156 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
157: ; preds = %150
%158 = getelementptr inbounds i8, i8* %152, i64 1
%159 = load i8, i8* %158
%160 = tail call i64 @isxdigit(i8 signext %159)
%161 = icmp eq i64 %160, 0
br i1 %161, label %166, label %162
162: ; preds = %157
%163 = load i8, i8* %158
%164 = tail call i64 @isxdigit(i8 signext %163)
%165 = icmp eq i64 %164, 0
br i1 %165, label %202, label %168
166: ; preds = %157
%167 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
168: ; preds = %162, %192
%169 = phi i32 [ %193, %192 ], [ 0, %162 ]
%170 = phi i8* [ %194, %192 ], [ %158, %162 ]
%171 = load i8, i8* %170
%172 = tail call i64 @isdigit(i8 signext %171)
%173 = icmp eq i64 %172, 0
br i1 %173, label %180, label %174
174: ; preds = %168
%175 = shl i32 %169, 4
%176 = load i8, i8* %170
%177 = sext i8 %176 to i32
%178 = add nsw i32 %177, -48
%179 = or i32 %178, %175
br label %192
180: ; preds = %168
%181 = load i8, i8* %170
%182 = sext i8 %181 to i32
%183 = add i8 %181, -97
%184 = icmp ult i8 %183, 6
%185 = shl i32 %169, 4
br i1 %184, label %186, label %189
186: ; preds = %180
%187 = add nsw i32 %182, -87
%188 = or i32 %187, %185
br label %192
189: ; preds = %180
%190 = add nsw i32 %182, -55
%191 = or i32 %190, %185
br label %192
192: ; preds = %186, %189, %174
%193 = phi i32 [ %179, %174 ], [ %188, %186 ], [ %191, %189 ]
%194 = getelementptr inbounds i8, i8* %170, i64 1
%195 = load i8, i8* %194
%196 = tail call i64 @isxdigit(i8 signext %195)
%197 = icmp eq i64 %196, 0
br i1 %197, label %198, label %168
198: ; preds = %192
%199 = icmp ugt i32 %193, 65535
br i1 %199, label %200, label %202
200: ; preds = %198
%201 = tail call i32 @bitch(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.1, i64 0, i64 0), i8* %1)
br label %220
202: ; preds = %162, %198
%203 = phi i32 [ %193, %198 ], [ 0, %162 ]
%204 = phi i8* [ %194, %198 ], [ %158, %162 ]
%205 = shl i32 %151, 16
%206 = or i32 %203, %205
store i32 %206, i32* %2
%207 = load i8, i8* %204
%208 = icmp eq i8 %207, 0
br i1 %208, label %216, label %209
209: ; preds = %202
%210 = tail call i32 @isspace(i8 signext %207)
%211 = icmp eq i32 %210, 0
br i1 %211, label %212, label %216
212: ; preds = %209
%213 = load i8, i8* %204
switch i8 %213, label %214 [
i8 59, label %216
i8 41, label %216
]
214: ; preds = %212
%215 = tail call i32 @bitch(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %220
216: ; preds = %212, %212, %209, %202
%217 = tail call i8* @skip_white_space(i8* %204)
store i8* %217, i8** %0
%218 = icmp eq i8* %217, null
%219 = select i1 %218, i32 -1, i32 1
br label %220
220: ; preds = %216, %214, %200, %166, %155, %148, %114, %103, %97, %63, %52, %46, %12
%221 = phi i32 [ -1, %46 ], [ -1, %52 ], [ -1, %97 ], [ -1, %103 ], [ -1, %148 ], [ -1, %155 ], [ -1, %200 ], [ -1, %214 ], [ -1, %166 ], [ -1, %114 ], [ -1, %63 ], [ -1, %12 ], [ %219, %216 ]
ret i32 %221
}