#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 /*<<< orphan*/ printf(char *, char, char);
int is_occupied(char *board, char x, char y) {
  x = x - 'a';
  y = 7 - (y - '1');
  if ((x < 0) || (x > 7) || (y < 0) || (y > 7)) {
    printf("DEBUG (is_occupied): Invalid coordinate given (%d, %d)\n", x, y);
    return -1;
  }
  char piece = board[y * 8 + x];
  if ((piece >= 'a') && (piece <= 'z'))
    return -1;
  if ((piece > 'A') && (piece <= 'Z'))
    return 1;
  return 0;
}


x86 assembly (clang, -O0):
<is_occupied>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %dl,%al
mov    %sil,%cl
mov    %rdi,-0x10(%rbp)
mov    %cl,-0x11(%rbp)
mov    %al,-0x12(%rbp)
movsbl -0x11(%rbp),%eax
sub    $0x61,%eax
mov    %al,-0x11(%rbp)
movsbl -0x12(%rbp),%ecx
sub    $0x31,%ecx
mov    $0x7,%eax
sub    %ecx,%eax
mov    %al,-0x12(%rbp)
movsbl -0x11(%rbp),%eax
cmp    $0x0,%eax
jl     1176 <is_occupied+0x66>
movsbl -0x11(%rbp),%eax
cmp    $0x7,%eax
jg     1176 <is_occupied+0x66>
movsbl -0x12(%rbp),%eax
cmp    $0x0,%eax
jl     1176 <is_occupied+0x66>
movsbl -0x12(%rbp),%eax
cmp    $0x7,%eax
jle    1198 <is_occupied+0x88>
mov    -0x11(%rbp),%al
lea    0xe80(%rip),%rdi
movsbl %al,%esi
movsbl -0x12(%rbp),%edx
call   1030 <printf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    1205 <is_occupied+0xf5>
mov    -0x10(%rbp),%rax
movsbl -0x12(%rbp),%ecx
shl    $0x3,%ecx
movsbl -0x11(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x13(%rbp)
movsbl -0x13(%rbp),%eax
cmp    $0x61,%eax
jl     11d8 <is_occupied+0xc8>
movsbl -0x13(%rbp),%eax
cmp    $0x7a,%eax
jg     11d8 <is_occupied+0xc8>
movl   $0xffffffff,-0x4(%rbp)
jmp    1205 <is_occupied+0xf5>
movsbl -0x13(%rbp),%eax
cmp    $0x41,%eax
jle    11fe <is_occupied+0xee>
movsbl -0x13(%rbp),%eax
cmp    $0x5a,%eax
jg     11fe <is_occupied+0xee>
movl   $0x1,-0x4(%rbp)
jmp    1205 <is_occupied+0xf5>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_occupied>:
push   %rax
add    $0x9f,%sil
mov    $0x38,%al
sub    %dl,%al
mov    %eax,%ecx
or     %sil,%cl
cmp    $0x8,%cl
jae    114a <is_occupied+0x3a>
movzbl %al,%eax
movzbl %sil,%ecx
lea    (%rcx,%rax,8),%rax
mov    (%rdi,%rax,1),%al
lea    -0x61(%rax),%ecx
add    $0xbe,%al
xor    %edx,%edx
cmp    $0x19,%al
setb   %dl
cmp    $0x1a,%cl
mov    $0xffffffff,%eax
cmovae %edx,%eax
pop    %rcx
ret
movsbl %sil,%esi
movsbl %al,%edx
lea    0xea8(%rip),%rdi
call   1030 <printf@plt>
mov    $0xffffffff,%eax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [56 x i8] c"DEBUG (is_occupied): Invalid coordinate given (%d, %d)\0A\00"
define i32 @is_occupied(i8* %0, i8 signext %1, i8 signext %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
store i8* %0, i8** %5
store i8 %1, i8* %6
store i8 %2, i8* %7
%9 = load i8, i8* %6
%10 = sext i8 %9 to i32
%11 = sub nsw i32 %10, 97
%12 = trunc i32 %11 to i8
store i8 %12, i8* %6
%13 = load i8, i8* %7
%14 = sext i8 %13 to i32
%15 = sub nsw i32 %14, 49
%16 = sub nsw i32 7, %15
%17 = trunc i32 %16 to i8
store i8 %17, i8* %7
%18 = load i8, i8* %6
%19 = sext i8 %18 to i32
%20 = icmp slt i32 %19, 0
br i1 %20, label %33, label %21
21: ; preds = %3
%22 = load i8, i8* %6
%23 = sext i8 %22 to i32
%24 = icmp sgt i32 %23, 7
br i1 %24, label %33, label %25
25: ; preds = %21
%26 = load i8, i8* %7
%27 = sext i8 %26 to i32
%28 = icmp slt i32 %27, 0
br i1 %28, label %33, label %29
29: ; preds = %25
%30 = load i8, i8* %7
%31 = sext i8 %30 to i32
%32 = icmp sgt i32 %31, 7
br i1 %32, label %33, label %37
33: ; preds = %29, %25, %21, %3
%34 = load i8, i8* %6
%35 = load i8, i8* %7
%36 = call i32 @printf(i8* getelementptr inbounds ([56 x i8], [56 x i8]* @.str, i64 0, i64 0), i8 signext %34, i8 signext %35)
store i32 -1, i32* %4
br label %66
37: ; preds = %29
%38 = load i8*, i8** %5
%39 = load i8, i8* %7
%40 = sext i8 %39 to i32
%41 = mul nsw i32 %40, 8
%42 = load i8, i8* %6
%43 = sext i8 %42 to i32
%44 = add nsw i32 %41, %43
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %38, i64 %45
%47 = load i8, i8* %46
store i8 %47, i8* %8
%48 = load i8, i8* %8
%49 = sext i8 %48 to i32
%50 = icmp sge i32 %49, 97
br i1 %50, label %51, label %56
51: ; preds = %37
%52 = load i8, i8* %8
%53 = sext i8 %52 to i32
%54 = icmp sle i32 %53, 122
br i1 %54, label %55, label %56
55: ; preds = %51
store i32 -1, i32* %4
br label %66
56: ; preds = %51, %37
%57 = load i8, i8* %8
%58 = sext i8 %57 to i32
%59 = icmp sgt i32 %58, 65
br i1 %59, label %60, label %65
60: ; preds = %56
%61 = load i8, i8* %8
%62 = sext i8 %61 to i32
%63 = icmp sle i32 %62, 90
br i1 %63, label %64, label %65
64: ; preds = %60
store i32 1, i32* %4
br label %66
65: ; preds = %60, %56
store i32 0, i32* %4
br label %66
66: ; preds = %65, %64, %55, %33
%67 = load i32, i32* %4
ret i32 %67
}

LLVM IR (-O2):
@.str = [56 x i8] c"DEBUG (is_occupied): Invalid coordinate given (%d, %d)\0A\00"
define i32 @is_occupied(i8* nocapture %0, i8 signext %1, i8 signext %2) {
%4 = add i8 %1, -97
%5 = sub i8 56, %2
%6 = or i8 %5, %4
%7 = icmp ult i8 %6, 8
br i1 %7, label %10, label %8
8: ; preds = %3
%9 = tail call i32 @printf(i8* getelementptr inbounds ([56 x i8], [56 x i8]* @.str, i64 0, i64 0), i8 signext %4, i8 signext %5)
br label %23
10: ; preds = %3
%11 = zext i8 %5 to i64
%12 = zext i8 %4 to i64
%13 = shl nuw nsw i64 %11, 3
%14 = add nuw nsw i64 %13, %12
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = load i8, i8* %15
%17 = add i8 %16, -97
%18 = icmp ult i8 %17, 26
%19 = add i8 %16, -66
%20 = icmp ult i8 %19, 25
%21 = zext i1 %20 to i32
%22 = select i1 %18, i32 -1, i32 %21
br label %23
23: ; preds = %10, %8
%24 = phi i32 [ -1, %8 ], [ %22, %10 ]
ret i32 %24
}