#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 */
short abs(short);
short distanceDiagonal(short x1, short y1, short x2, short y2) {
  return (((abs(x1 - x2)) > (abs(y1 - y2))) ? (abs(x1 - x2)) : (abs(y1 - y2)));
}


x86 assembly (clang, -O0):
<distanceDiagonal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %cx,%ax
mov    %dx,%cx
mov    %si,%dx
mov    %di,%si
mov    %si,-0x2(%rbp)
mov    %dx,-0x4(%rbp)
mov    %cx,-0x6(%rbp)
mov    %ax,-0x8(%rbp)
movswl -0x2(%rbp),%eax
movswl -0x6(%rbp),%ecx
sub    %ecx,%eax
movswl %ax,%edi
call   1030 <abs@plt>
cwtl
mov    %eax,-0xc(%rbp)
movswl -0x4(%rbp),%eax
movswl -0x8(%rbp),%ecx
sub    %ecx,%eax
movswl %ax,%edi
call   1030 <abs@plt>
mov    %ax,%cx
mov    -0xc(%rbp),%eax
movswl %cx,%ecx
cmp    %ecx,%eax
jle    1188 <distanceDiagonal+0x78>
movswl -0x2(%rbp),%eax
movswl -0x6(%rbp),%ecx
sub    %ecx,%eax
movswl %ax,%edi
call   1030 <abs@plt>
cwtl
mov    %eax,-0x10(%rbp)
jmp    119e <distanceDiagonal+0x8e>
movswl -0x4(%rbp),%eax
movswl -0x8(%rbp),%ecx
sub    %ecx,%eax
movswl %ax,%edi
call   1030 <abs@plt>
cwtl
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cwtl
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<distanceDiagonal>:
sub    %edx,%edi
mov    %edi,%edx
neg    %dx
cmovs  %di,%dx
sub    %ecx,%esi
mov    %esi,%eax
neg    %ax
cmovs  %si,%ax
cmp    %ax,%dx
cmova  %edx,%eax
ret

LLVM IR (-O0):
define signext i16 @distanceDiagonal(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3) {
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
store i16 %0, i16* %5
store i16 %1, i16* %6
store i16 %2, i16* %7
store i16 %3, i16* %8
%9 = load i16, i16* %5
%10 = sext i16 %9 to i32
%11 = load i16, i16* %7
%12 = sext i16 %11 to i32
%13 = sub nsw i32 %10, %12
%14 = trunc i32 %13 to i16
%15 = call signext i16 @abs(i16 signext %14)
%16 = sext i16 %15 to i32
%17 = load i16, i16* %6
%18 = sext i16 %17 to i32
%19 = load i16, i16* %8
%20 = sext i16 %19 to i32
%21 = sub nsw i32 %18, %20
%22 = trunc i32 %21 to i16
%23 = call signext i16 @abs(i16 signext %22)
%24 = sext i16 %23 to i32
%25 = icmp sgt i32 %16, %24
br i1 %25, label %26, label %35
26: ; preds = %4
%27 = load i16, i16* %5
%28 = sext i16 %27 to i32
%29 = load i16, i16* %7
%30 = sext i16 %29 to i32
%31 = sub nsw i32 %28, %30
%32 = trunc i32 %31 to i16
%33 = call signext i16 @abs(i16 signext %32)
%34 = sext i16 %33 to i32
br label %44
35: ; preds = %4
%36 = load i16, i16* %6
%37 = sext i16 %36 to i32
%38 = load i16, i16* %8
%39 = sext i16 %38 to i32
%40 = sub nsw i32 %37, %39
%41 = trunc i32 %40 to i16
%42 = call signext i16 @abs(i16 signext %41)
%43 = sext i16 %42 to i32
br label %44
44: ; preds = %35, %26
%45 = phi i32 [ %34, %26 ], [ %43, %35 ]
%46 = trunc i32 %45 to i16
ret i16 %46
}

LLVM IR (-O2):
define signext i16 @distanceDiagonal(i16 signext %0, i16 signext %1, i16 signext %2, i16 signext %3) {
%5 = sub i16 %0, %2
%6 = tail call i16 @llvm.abs.i16(i16 %5, i1 true)
%7 = sub i16 %1, %3
%8 = tail call i16 @llvm.abs.i16(i16 %7, i1 true)
%9 = icmp ugt i16 %6, %8
%10 = select i1 %9, i16 %6, i16 %8
ret i16 %10
}