#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*/ message(char *, int);
void perimeterCoords(short returnCoords[2], short n) {
  if (n <= 10) {
    returnCoords[0] = n - 5;
    returnCoords[1] = -5;
  } else if (n <= 21) {
    returnCoords[0] = (n - 11) - 5;
    returnCoords[1] = 5;
  } else if (n <= 30) {
    returnCoords[0] = -5;
    returnCoords[1] = (n - 22) - 4;
  } else if (n <= 39) {
    returnCoords[0] = 5;
    returnCoords[1] = (n - 31) - 4;
  } else {
    message("ERROR! Bad perimeter coordinate request!", 1);
    returnCoords[0] = returnCoords[1] = 0;
  }
}


x86 assembly (clang, -O0):
<perimeterCoords>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %si,%ax
mov    %rdi,-0x8(%rbp)
mov    %ax,-0xa(%rbp)
movswl -0xa(%rbp),%eax
cmp    $0xa,%eax
jg     1150 <perimeterCoords+0x40>
movswl -0xa(%rbp),%eax
sub    $0x5,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
movw   $0xfffb,0x2(%rax)
jmp    1213 <perimeterCoords+0x103>
movswl -0xa(%rbp),%eax
cmp    $0x15,%eax
jg     1180 <perimeterCoords+0x70>
movswl -0xa(%rbp),%eax
sub    $0xb,%eax
sub    $0x5,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
mov    -0x8(%rbp),%rax
movw   $0x5,0x2(%rax)
jmp    120e <perimeterCoords+0xfe>
movswl -0xa(%rbp),%eax
cmp    $0x1e,%eax
jg     11b0 <perimeterCoords+0xa0>
mov    -0x8(%rbp),%rax
movw   $0xfffb,(%rax)
movswl -0xa(%rbp),%eax
sub    $0x16,%eax
sub    $0x4,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,0x2(%rax)
jmp    1209 <perimeterCoords+0xf9>
movswl -0xa(%rbp),%eax
cmp    $0x27,%eax
jg     11e0 <perimeterCoords+0xd0>
mov    -0x8(%rbp),%rax
movw   $0x5,(%rax)
movswl -0xa(%rbp),%eax
sub    $0x1f,%eax
sub    $0x4,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,0x2(%rax)
jmp    1204 <perimeterCoords+0xf4>
lea    0xe19(%rip),%rdi
mov    $0x1,%esi
call   1030 <message@plt>
mov    -0x8(%rbp),%rax
movw   $0x0,0x2(%rax)
mov    -0x8(%rbp),%rax
movw   $0x0,(%rax)
jmp    1209 <perimeterCoords+0xf9>
jmp    120e <perimeterCoords+0xfe>
jmp    1213 <perimeterCoords+0x103>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<perimeterCoords>:
push   %rbx
mov    %rdi,%rbx
cmp    $0xa,%si
jg     1128 <perimeterCoords+0x18>
add    $0xfffffffb,%esi
mov    %si,(%rbx)
movw   $0xfffb,0x2(%rbx)
pop    %rbx
ret
cmp    $0x15,%si
ja     113c <perimeterCoords+0x2c>
add    $0xfffffff0,%esi
mov    %si,(%rbx)
movw   $0x5,0x2(%rbx)
pop    %rbx
ret
cmp    $0x1e,%si
ja     114c <perimeterCoords+0x3c>
movw   $0xfffb,(%rbx)
add    $0xffffffe6,%esi
jmp    115a <perimeterCoords+0x4a>
cmp    $0x27,%si
ja     1160 <perimeterCoords+0x50>
movw   $0x5,(%rbx)
add    $0xffffffdd,%esi
mov    %si,0x2(%rbx)
pop    %rbx
ret
lea    0xe99(%rip),%rdi
mov    $0x1,%esi
call   1030 <message@plt>
movl   $0x0,(%rbx)
pop    %rbx
ret

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

LLVM IR (-O2):
@.str = [41 x i8] c"ERROR! Bad perimeter coordinate request!\00"
define void @perimeterCoords(i16* nocapture writeonly %0, i16 signext %1) {
%3 = icmp slt i16 %1, 11
br i1 %3, label %4, label %7
4: ; preds = %2
%5 = add i16 %1, -5
store i16 %5, i16* %0
%6 = getelementptr inbounds i16, i16* %0, i64 1
store i16 -5, i16* %6
br label %25
7: ; preds = %2
%8 = icmp ult i16 %1, 22
br i1 %8, label %9, label %12
9: ; preds = %7
%10 = add nsw i16 %1, -16
store i16 %10, i16* %0
%11 = getelementptr inbounds i16, i16* %0, i64 1
store i16 5, i16* %11
br label %25
12: ; preds = %7
%13 = icmp ult i16 %1, 31
br i1 %13, label %14, label %17
14: ; preds = %12
store i16 -5, i16* %0
%15 = add nsw i16 %1, -26
%16 = getelementptr inbounds i16, i16* %0, i64 1
store i16 %15, i16* %16
br label %25
17: ; preds = %12
%18 = icmp ult i16 %1, 40
br i1 %18, label %19, label %22
19: ; preds = %17
store i16 5, i16* %0
%20 = add nsw i16 %1, -35
%21 = getelementptr inbounds i16, i16* %0, i64 1
store i16 %20, i16* %21
br label %25
22: ; preds = %17
%23 = tail call i32 @message(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str, i64 0, i64 0), i32 1)
%24 = getelementptr inbounds i16, i16* %0, i64 1
store i16 0, i16* %24
store i16 0, i16* %0
br label %25
25: ; preds = %9, %19, %22, %14, %4
ret void
}