int freecell_solver_u2p_suit(const char *suit) {
  char c;
  c = ((((*suit) >= 'a') && ((*suit) <= 'z')) ? ((*suit) + 'A' - 'a')
                                              : (*suit));
  while ((c != 'H') && (c != 'S') && (c != 'D') && (c != 'C') && (c != ' ') &&
         (c != '\0')) {
    suit++;
    c = ((((*suit) >= 'a') && ((*suit) <= 'z')) ? ((*suit) + 'A' - 'a')
                                                : (*suit));
  }
  if (c == 'H')
    return 0;
  else if (c == 'C')
    return 1;
  else if (c == 'D')
    return 2;
  else if (c == 'S')
    return 3;
  else
    return 0;
}


x86 assembly (clang, -O0):
<freecell_solver_u2p_suit>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     113d <freecell_solver_u2p_suit+0x3d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7a,%eax
jg     113d <freecell_solver_u2p_suit+0x3d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
add    $0x41,%eax
sub    $0x61,%eax
mov    %eax,-0x18(%rbp)
jmp    1147 <freecell_solver_u2p_suit+0x47>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %al,-0x11(%rbp)
movsbl -0x11(%rbp),%ecx
xor    %eax,%eax
cmp    $0x48,%ecx
mov    %al,-0x19(%rbp)
je     11b4 <freecell_solver_u2p_suit+0xb4>
movsbl -0x11(%rbp),%ecx
xor    %eax,%eax
cmp    $0x53,%ecx
mov    %al,-0x19(%rbp)
je     11b4 <freecell_solver_u2p_suit+0xb4>
movsbl -0x11(%rbp),%ecx
xor    %eax,%eax
cmp    $0x44,%ecx
mov    %al,-0x19(%rbp)
je     11b4 <freecell_solver_u2p_suit+0xb4>
movsbl -0x11(%rbp),%ecx
xor    %eax,%eax
cmp    $0x43,%ecx
mov    %al,-0x19(%rbp)
je     11b4 <freecell_solver_u2p_suit+0xb4>
movsbl -0x11(%rbp),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x19(%rbp)
je     11b4 <freecell_solver_u2p_suit+0xb4>
movsbl -0x11(%rbp),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    11c4 <freecell_solver_u2p_suit+0xc4>
jmp    121a <freecell_solver_u2p_suit+0x11a>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x61,%eax
jl     1205 <freecell_solver_u2p_suit+0x105>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7a,%eax
jg     1205 <freecell_solver_u2p_suit+0x105>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
add    $0x41,%eax
sub    $0x61,%eax
mov    %eax,-0x20(%rbp)
jmp    120f <freecell_solver_u2p_suit+0x10f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %al,-0x11(%rbp)
jmp    114d <freecell_solver_u2p_suit+0x4d>
movsbl -0x11(%rbp),%eax
cmp    $0x48,%eax
jne    1233 <freecell_solver_u2p_suit+0x133>
movl   $0x0,-0x4(%rbp)
jmp    1285 <freecell_solver_u2p_suit+0x185>
movsbl -0x11(%rbp),%eax
cmp    $0x43,%eax
jne    124c <freecell_solver_u2p_suit+0x14c>
movl   $0x1,-0x4(%rbp)
jmp    1285 <freecell_solver_u2p_suit+0x185>
movsbl -0x11(%rbp),%eax
cmp    $0x44,%eax
jne    1265 <freecell_solver_u2p_suit+0x165>
movl   $0x2,-0x4(%rbp)
jmp    1285 <freecell_solver_u2p_suit+0x185>
movsbl -0x11(%rbp),%eax
cmp    $0x53,%eax
jne    127e <freecell_solver_u2p_suit+0x17e>
movl   $0x3,-0x4(%rbp)
jmp    1285 <freecell_solver_u2p_suit+0x185>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<freecell_solver_u2p_suit>:
lea    0xef9(%rip),%rax
jmp    1114 <freecell_solver_u2p_suit+0x14>
nopl   0x0(%rax)
add    $0x1,%rdi
movzbl (%rdi),%edx
lea    -0x61(%rdx),%ecx
lea    -0x20(%rdx),%esi
cmp    $0x1a,%cl
movzbl %sil,%ecx
cmovae %edx,%ecx
lea    -0x43(%rcx),%edx
cmp    $0x10,%dl
ja     1140 <freecell_solver_u2p_suit+0x40>
movzbl %dl,%ecx
movslq (%rax,%rcx,4),%rcx
add    %rax,%rcx
jmp    *%rcx
nopl   0x0(%rax,%rax,1)
test   %cl,%cl
je     1149 <freecell_solver_u2p_suit+0x49>
cmp    $0x20,%cl
jne    1110 <freecell_solver_u2p_suit+0x10>
xor    %eax,%eax
ret
mov    $0x1,%eax
ret
mov    $0x2,%eax
ret
mov    $0x3,%eax
ret

LLVM IR (-O0):
define i32 @freecell_solver_u2p_suit(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i8
store i8* %0, i8** %3
%5 = load i8*, i8** %3
%6 = load i8, i8* %5
%7 = sext i8 %6 to i32
%8 = icmp sge i32 %7, 97
br i1 %8, label %9, label %20
9: ; preds = %1
%10 = load i8*, i8** %3
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp sle i32 %12, 122
br i1 %13, label %14, label %20
14: ; preds = %9
%15 = load i8*, i8** %3
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = add nsw i32 %17, 65
%19 = sub nsw i32 %18, 97
br label %24
20: ; preds = %9, %1
%21 = load i8*, i8** %3
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
br label %24
24: ; preds = %20, %14
%25 = phi i32 [ %19, %14 ], [ %23, %20 ]
%26 = trunc i32 %25 to i8
store i8 %26, i8* %4
br label %27
27: ; preds = %75, %24
%28 = load i8, i8* %4
%29 = sext i8 %28 to i32
%30 = icmp ne i32 %29, 72
br i1 %30, label %31, label %51
31: ; preds = %27
%32 = load i8, i8* %4
%33 = sext i8 %32 to i32
%34 = icmp ne i32 %33, 83
br i1 %34, label %35, label %51
35: ; preds = %31
%36 = load i8, i8* %4
%37 = sext i8 %36 to i32
%38 = icmp ne i32 %37, 68
br i1 %38, label %39, label %51
39: ; preds = %35
%40 = load i8, i8* %4
%41 = sext i8 %40 to i32
%42 = icmp ne i32 %41, 67
br i1 %42, label %43, label %51
43: ; preds = %39
%44 = load i8, i8* %4
%45 = sext i8 %44 to i32
%46 = icmp ne i32 %45, 32
br i1 %46, label %47, label %51
47: ; preds = %43
%48 = load i8, i8* %4
%49 = sext i8 %48 to i32
%50 = icmp ne i32 %49, 0
br label %51
51: ; preds = %47, %43, %39, %35, %31, %27
%52 = phi i1 [ false, %43 ], [ false, %39 ], [ false, %35 ], [ false, %31 ], [ false, %27 ], [ %50, %47 ]
br i1 %52, label %53, label %78
53: ; preds = %51
%54 = load i8*, i8** %3
%55 = getelementptr inbounds i8, i8* %54, i32 1
store i8* %55, i8** %3
%56 = load i8*, i8** %3
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp sge i32 %58, 97
br i1 %59, label %60, label %71
60: ; preds = %53
%61 = load i8*, i8** %3
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = icmp sle i32 %63, 122
br i1 %64, label %65, label %71
65: ; preds = %60
%66 = load i8*, i8** %3
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = add nsw i32 %68, 65
%70 = sub nsw i32 %69, 97
br label %75
71: ; preds = %60, %53
%72 = load i8*, i8** %3
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
br label %75
75: ; preds = %71, %65
%76 = phi i32 [ %70, %65 ], [ %74, %71 ]
%77 = trunc i32 %76 to i8
store i8 %77, i8* %4
br label %27
78: ; preds = %51
%79 = load i8, i8* %4
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %80, 72
br i1 %81, label %82, label %83
82: ; preds = %78
store i32 0, i32* %2
br label %99
83: ; preds = %78
%84 = load i8, i8* %4
%85 = sext i8 %84 to i32
%86 = icmp eq i32 %85, 67
br i1 %86, label %87, label %88
87: ; preds = %83
store i32 1, i32* %2
br label %99
88: ; preds = %83
%89 = load i8, i8* %4
%90 = sext i8 %89 to i32
%91 = icmp eq i32 %90, 68
br i1 %91, label %92, label %93
92: ; preds = %88
store i32 2, i32* %2
br label %99
93: ; preds = %88
%94 = load i8, i8* %4
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %95, 83
br i1 %96, label %97, label %98
97: ; preds = %93
store i32 3, i32* %2
br label %99
98: ; preds = %93
store i32 0, i32* %2
br label %99
99: ; preds = %98, %97, %92, %87, %82
%100 = load i32, i32* %2
ret i32 %100
}

LLVM IR (-O2):
define i32 @freecell_solver_u2p_suit(i8* nocapture %0) {
br label %2
2: ; preds = %9, %1
%3 = phi i8* [ %10, %9 ], [ %0, %1 ]
%4 = load i8, i8* %3
%5 = add i8 %4, -97
%6 = icmp ult i8 %5, 26
%7 = add nsw i8 %4, -32
%8 = select i1 %6, i8 %7, i8 %4
switch i8 %8, label %9 [
i8 72, label %13
i8 67, label %14
i8 68, label %11
i8 83, label %12
i8 0, label %13
i8 32, label %13
]
9: ; preds = %2
%10 = getelementptr inbounds i8, i8* %3, i64 1
br label %2
11: ; preds = %2
br label %14
12: ; preds = %2
br label %14
13: ; preds = %2, %2, %2
br label %14
14: ; preds = %2, %13, %12, %11
%15 = phi i32 [ 2, %11 ], [ 3, %12 ], [ 0, %13 ], [ 1, %2 ]
ret i32 %15
}