#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*/ drawFastHLine(short, short, short, short);
int /*<<< orphan*/ drawFastVLine(short, short, short, short);
int /*<<< orphan*/ writeLine(short, short, short, short, short);
void drawLine(short x0, short y0, short x1, short y1, short color) {
  if (x0 == x1) {
    if (y0 > y1) {
      short temp;
      temp = y0;
      y0 = y1;
      y1 = temp;
    };
    drawFastVLine(x0, y0, y1 - y0 + 1, color);
  } else if (y0 == y1) {
    if (x0 > x1) {
      short temp;
      temp = x0;
      x0 = x1;
      x1 = temp;
    };
    drawFastHLine(x0, y0, x1 - x0 + 1, color);
  } else {
    writeLine(x0, y0, x1, y1, color);
  }
}


x86 assembly (clang, -O0):
<drawLine>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %r8w,%ax
mov    %di,-0x2(%rbp)
mov    %si,-0x4(%rbp)
mov    %dx,-0x6(%rbp)
mov    %cx,-0x8(%rbp)
mov    %ax,-0xa(%rbp)
movswl -0x2(%rbp),%eax
movswl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jne    11b4 <drawLine+0x84>
movswl -0x4(%rbp),%eax
movswl -0x8(%rbp),%ecx
cmp    %ecx,%eax
jle    1188 <drawLine+0x58>
mov    -0x4(%rbp),%ax
mov    %ax,-0xc(%rbp)
mov    -0x8(%rbp),%ax
mov    %ax,-0x4(%rbp)
mov    -0xc(%rbp),%ax
mov    %ax,-0x8(%rbp)
mov    -0x2(%rbp),%dx
mov    -0x4(%rbp),%cx
movswl -0x8(%rbp),%eax
movswl -0x4(%rbp),%esi
sub    %esi,%eax
add    $0x1,%eax
movswl %dx,%edi
movswl %cx,%esi
movswl %ax,%edx
movswl -0xa(%rbp),%ecx
call   1040 <drawFastVLine@plt>
jmp    1243 <drawLine+0x113>
movswl -0x4(%rbp),%eax
movswl -0x8(%rbp),%ecx
cmp    %ecx,%eax
jne    1218 <drawLine+0xe8>
movswl -0x2(%rbp),%eax
movswl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jle    11ec <drawLine+0xbc>
mov    -0x2(%rbp),%ax
mov    %ax,-0xe(%rbp)
mov    -0x6(%rbp),%ax
mov    %ax,-0x2(%rbp)
mov    -0xe(%rbp),%ax
mov    %ax,-0x6(%rbp)
mov    -0x2(%rbp),%dx
mov    -0x4(%rbp),%cx
movswl -0x6(%rbp),%eax
movswl -0x2(%rbp),%esi
sub    %esi,%eax
add    $0x1,%eax
movswl %dx,%edi
movswl %cx,%esi
movswl %ax,%edx
movswl -0xa(%rbp),%ecx
call   1050 <drawFastHLine@plt>
jmp    123e <drawLine+0x10e>
mov    -0x2(%rbp),%si
mov    -0x4(%rbp),%dx
mov    -0x6(%rbp),%cx
mov    -0x8(%rbp),%ax
movswl %si,%edi
movswl %dx,%esi
movswl %cx,%edx
movswl %ax,%ecx
movswl -0xa(%rbp),%r8d
call   1030 <writeLine@plt>
jmp    1243 <drawLine+0x113>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawLine>:
cmp    %dx,%di
jne    1157 <drawLine+0x27>
cmp    %cx,%si
mov    %ecx,%eax
cmovg  %esi,%eax
cmovg  %ecx,%esi
sub    %esi,%eax
add    $0x1,%eax
movswl %ax,%edx
movswl %si,%esi
movswl %di,%edi
movswl %r8w,%ecx
jmp    1040 <drawFastVLine@plt>
cmp    %cx,%si
jne    117e <drawLine+0x4e>
cmp    %dx,%di
mov    %edx,%eax
cmovg  %edi,%eax
cmovg  %edx,%edi
sub    %edi,%eax
add    $0x1,%eax
movswl %ax,%edx
movswl %di,%edi
movswl %si,%esi
movswl %r8w,%ecx
jmp    1050 <drawFastHLine@plt>
movswl %di,%edi
movswl %si,%esi
movswl %dx,%edx
movswl %cx,%ecx
movswl %r8w,%r8d
jmp    1030 <writeLine@plt>

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

LLVM IR (-O2):
define void @drawLine(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3, i16 signext %4) {
%6 = icmp eq i16 %0, %2
br i1 %6, label %7, label %14
7: ; preds = %5
%8 = icmp sgt i16 %1, %3
%9 = select i1 %8, i16 %1, i16 %3
%10 = select i1 %8, i16 %3, i16 %1
%11 = sub i16 1, %10
%12 = add i16 %11, %9
%13 = tail call i32 @drawFastVLine(i16 signext %0, i16 signext %10, i16 signext %12, i16 signext %4)
br label %25
14: ; preds = %5
%15 = icmp eq i16 %1, %3
br i1 %15, label %16, label %23
16: ; preds = %14
%17 = icmp sgt i16 %0, %2
%18 = select i1 %17, i16 %0, i16 %2
%19 = select i1 %17, i16 %2, i16 %0
%20 = sub i16 1, %19
%21 = add i16 %20, %18
%22 = tail call i32 @drawFastHLine(i16 signext %19, i16 signext %1, i16 signext %21, i16 signext %4)
br label %25
23: ; preds = %14
%24 = tail call i32 @writeLine(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3, i16 signext %4)
br label %25
25: ; preds = %16, %23, %7
ret void
}