#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 */
int CHAR_MIN;
int vercmp_char_value(char c) {
  if (c == '\0') {
    return 0;
  } else if (c >= 'A' && c <= 'Z') {
    return 1 + (c - 'A');
  } else if (c >= 'a' && c <= 'z') {
    return 1 + ('Z' - 'A' + 1) + (c - 'a');
  } else {
    int i = 1 + ('Z' - 'A' + 1) + ('z' - 'a' + 1) + ((int)c - CHAR_MIN);
    if (c > 'z') {
      i -= 'z' - 'a' + 1;
    }
    if (c > 'Z') {
      i -= 'Z' - 'A' + 1;
    }
    if (c > '\0') {
      i--;
    }
    return i;
  }
}


x86 assembly (clang, -O0):
<vercmp_char_value>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x5(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x0,%eax
jne    1123 <vercmp_char_value+0x23>
movl   $0x0,-0x4(%rbp)
jmp    11d6 <vercmp_char_value+0xd6>
movsbl -0x5(%rbp),%eax
cmp    $0x41,%eax
jl     114f <vercmp_char_value+0x4f>
movsbl -0x5(%rbp),%eax
cmp    $0x5a,%eax
jg     114f <vercmp_char_value+0x4f>
movsbl -0x5(%rbp),%eax
sub    $0x41,%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11d6 <vercmp_char_value+0xd6>
movsbl -0x5(%rbp),%eax
cmp    $0x61,%eax
jl     117b <vercmp_char_value+0x7b>
movsbl -0x5(%rbp),%eax
cmp    $0x7a,%eax
jg     117b <vercmp_char_value+0x7b>
movsbl -0x5(%rbp),%eax
sub    $0x61,%eax
add    $0x1b,%eax
mov    %eax,-0x4(%rbp)
jmp    11d6 <vercmp_char_value+0xd6>
movsbl -0x5(%rbp),%eax
mov    0x2e62(%rip),%rcx
sub    (%rcx),%eax
add    $0x35,%eax
mov    %eax,-0xc(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x7a,%eax
jle    11a4 <vercmp_char_value+0xa4>
mov    -0xc(%rbp),%eax
sub    $0x1a,%eax
mov    %eax,-0xc(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x5a,%eax
jle    11ba <vercmp_char_value+0xba>
mov    -0xc(%rbp),%eax
sub    $0x1a,%eax
mov    %eax,-0xc(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x0,%eax
jle    11d0 <vercmp_char_value+0xd0>
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<vercmp_char_value>:
mov    %edi,%eax
test   %al,%al
je     1112 <vercmp_char_value+0x12>
lea    -0x41(%rax),%ecx
cmp    $0x19,%cl
ja     1115 <vercmp_char_value+0x15>
add    $0xffffffc0,%eax
ret
xor    %eax,%eax
ret
lea    -0x61(%rax),%ecx
cmp    $0x19,%cl
ja     1121 <vercmp_char_value+0x21>
add    $0xffffffba,%eax
ret
mov    0x2ec0(%rip),%rcx
mov    %eax,%edx
sub    (%rcx),%edx
lea    0x35(%rdx),%ecx
add    $0x1b,%edx
cmp    $0x7b,%al
cmovl  %ecx,%edx
lea    -0x1a(%rdx),%ecx
cmp    $0x5b,%al
cmovl  %edx,%ecx
xor    %edx,%edx
test   %al,%al
setg   %dl
sub    %edx,%ecx
mov    %ecx,%eax
ret

LLVM IR (-O0):
@CHAR_MIN = global i32 0
define i32 @vercmp_char_value(i8 signext %0) {
%2 = alloca i32
%3 = alloca i8
%4 = alloca i32
store i8 %0, i8* %3
%5 = load i8, i8* %3
%6 = sext i8 %5 to i32
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %9
8: ; preds = %1
store i32 0, i32* %2
br label %63
9: ; preds = %1
%10 = load i8, i8* %3
%11 = sext i8 %10 to i32
%12 = icmp sge i32 %11, 65
br i1 %12, label %13, label %22
13: ; preds = %9
%14 = load i8, i8* %3
%15 = sext i8 %14 to i32
%16 = icmp sle i32 %15, 90
br i1 %16, label %17, label %22
17: ; preds = %13
%18 = load i8, i8* %3
%19 = sext i8 %18 to i32
%20 = sub nsw i32 %19, 65
%21 = add nsw i32 1, %20
store i32 %21, i32* %2
br label %63
22: ; preds = %13, %9
%23 = load i8, i8* %3
%24 = sext i8 %23 to i32
%25 = icmp sge i32 %24, 97
br i1 %25, label %26, label %35
26: ; preds = %22
%27 = load i8, i8* %3
%28 = sext i8 %27 to i32
%29 = icmp sle i32 %28, 122
br i1 %29, label %30, label %35
30: ; preds = %26
%31 = load i8, i8* %3
%32 = sext i8 %31 to i32
%33 = sub nsw i32 %32, 97
%34 = add nsw i32 27, %33
store i32 %34, i32* %2
br label %63
35: ; preds = %26, %22
%36 = load i8, i8* %3
%37 = sext i8 %36 to i32
%38 = load i32, i32* @CHAR_MIN
%39 = sub nsw i32 %37, %38
%40 = add nsw i32 53, %39
store i32 %40, i32* %4
%41 = load i8, i8* %3
%42 = sext i8 %41 to i32
%43 = icmp sgt i32 %42, 122
br i1 %43, label %44, label %47
44: ; preds = %35
%45 = load i32, i32* %4
%46 = sub nsw i32 %45, 26
store i32 %46, i32* %4
br label %47
47: ; preds = %44, %35
%48 = load i8, i8* %3
%49 = sext i8 %48 to i32
%50 = icmp sgt i32 %49, 90
br i1 %50, label %51, label %54
51: ; preds = %47
%52 = load i32, i32* %4
%53 = sub nsw i32 %52, 26
store i32 %53, i32* %4
br label %54
54: ; preds = %51, %47
%55 = load i8, i8* %3
%56 = sext i8 %55 to i32
%57 = icmp sgt i32 %56, 0
br i1 %57, label %58, label %61
58: ; preds = %54
%59 = load i32, i32* %4
%60 = add nsw i32 %59, -1
store i32 %60, i32* %4
br label %61
61: ; preds = %58, %54
%62 = load i32, i32* %4
store i32 %62, i32* %2
br label %63
63: ; preds = %61, %30, %17, %8
%64 = load i32, i32* %2
ret i32 %64
}

LLVM IR (-O2):
@CHAR_MIN = global i32 0
define i32 @vercmp_char_value(i8 signext %0) {
%2 = sext i8 %0 to i32
%3 = icmp eq i8 %0, 0
br i1 %3, label %26, label %4
4: ; preds = %1
%5 = add i8 %0, -65
%6 = icmp ult i8 %5, 26
br i1 %6, label %7, label %9
7: ; preds = %4
%8 = add nsw i32 %2, -64
br label %26
9: ; preds = %4
%10 = add i8 %0, -97
%11 = icmp ult i8 %10, 26
br i1 %11, label %12, label %14
12: ; preds = %9
%13 = add nsw i32 %2, -70
br label %26
14: ; preds = %9
%15 = load i32, i32* @CHAR_MIN
%16 = sub nsw i32 %2, %15
%17 = icmp sgt i8 %0, 122
%18 = select i1 %17, i32 27, i32 53
%19 = add nsw i32 %16, %18
%20 = icmp sgt i8 %0, 90
%21 = add nsw i32 %19, -26
%22 = select i1 %20, i32 %21, i32 %19
%23 = icmp sgt i8 %0, 0
%24 = sext i1 %23 to i32
%25 = add nsw i32 %22, %24
br label %26
26: ; preds = %1, %14, %12, %7
%27 = phi i32 [ %8, %7 ], [ %13, %12 ], [ %25, %14 ], [ 0, %1 ]
ret i32 %27
}