#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 */
scalar_t__ isdigit(char const);
int register_num(const char *name) {
  if ((name[0] == 'V' || name[0] == 'v') && name[1] != '\0' &&
      name[2] == '\0') {
    if (isdigit(name[1]))
      return name[1] - '0';
    else if ('A' <= name[1] && name[1] <= 'F')
      return name[1] - 'A' + 10;
    else if ('a' <= name[1] && name[1] <= 'f')
      return name[1] - 'a' + 10;
    else
      return -1;
  }
  return -1;
}


x86 assembly (clang, -O0):
<register_num>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x56,%eax
je     113c <register_num+0x2c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x76,%eax
jne    120c <register_num+0xfc>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     120c <register_num+0xfc>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    120c <register_num+0xfc>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1188 <register_num+0x78>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x4(%rbp)
jmp    1213 <register_num+0x103>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     11c4 <register_num+0xb4>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jg     11c4 <register_num+0xb4>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x4(%rbp)
jmp    1213 <register_num+0x103>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     1200 <register_num+0xf0>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x66,%eax
jg     1200 <register_num+0xf0>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x4(%rbp)
jmp    1213 <register_num+0x103>
movl   $0xffffffff,-0x4(%rbp)
jmp    1213 <register_num+0x103>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<register_num>:
push   %rbx
mov    (%rdi),%cl
mov    $0xffffffff,%eax
or     $0x20,%cl
cmp    $0x76,%cl
jne    1130 <register_num+0x20>
mov    %rdi,%rbx
mov    0x1(%rdi),%cl
test   %cl,%cl
je     1130 <register_num+0x20>
cmpb   $0x0,0x2(%rbx)
je     1132 <register_num+0x22>
pop    %rbx
ret
movsbl %cl,%edi
call   1030 <isdigit@plt>
mov    %rax,%rcx
movsbl 0x1(%rbx),%eax
test   %rcx,%rcx
je     114b <register_num+0x3b>
add    $0xffffffd0,%eax
pop    %rbx
ret
lea    -0x41(%rax),%ecx
cmp    $0x5,%cl
ja     1158 <register_num+0x48>
add    $0xffffffc9,%eax
pop    %rbx
ret
lea    -0x61(%rax),%ecx
add    $0xffffffa9,%eax
cmp    $0x6,%cl
mov    $0xffffffff,%ecx
cmovb  %eax,%ecx
mov    %ecx,%eax
pop    %rbx
ret

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

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