#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 distanceFastApproximation(short x1, short y1, short x2, short y2) {
  short dx = abs(x1 - x2);
  short dy = abs(y1 - y2);
  return (((dx) > (dy)) ? (dx) : (dy)) + (((dx) < (dy)) ? (dx) : (dy)) / 2;
}


x86 assembly (clang, -O0):
<distanceFastApproximation>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%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>
mov    %ax,-0xa(%rbp)
movswl -0x4(%rbp),%eax
movswl -0x8(%rbp),%ecx
sub    %ecx,%eax
movswl %ax,%edi
call   1030 <abs@plt>
mov    %ax,-0xc(%rbp)
movswl -0xa(%rbp),%eax
movswl -0xc(%rbp),%ecx
cmp    %ecx,%eax
jle    117c <distanceFastApproximation+0x6c>
movswl -0xa(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    1183 <distanceFastApproximation+0x73>
movswl -0xc(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
movswl -0xa(%rbp),%eax
movswl -0xc(%rbp),%ecx
cmp    %ecx,%eax
jge    11a5 <distanceFastApproximation+0x95>
movswl -0xa(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    11ac <distanceFastApproximation+0x9c>
movswl -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x14(%rbp),%eax
add    %ecx,%eax
cwtl
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<distanceFastApproximation>:
sub    %edx,%edi
mov    %edi,%eax
neg    %ax
cmovs  %di,%ax
sub    %ecx,%esi
mov    %esi,%ecx
neg    %cx
cmovs  %si,%cx
cmp    %cx,%ax
mov    %ecx,%edx
cmova  %eax,%edx
cmovb  %eax,%ecx
movzwl %cx,%eax
shr    %eax
add    %edx,%eax
ret

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

LLVM IR (-O2):
define signext i16 @distanceFastApproximation(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
%11 = icmp ult i16 %6, %8
%12 = select i1 %11, i16 %6, i16 %8
%13 = lshr i16 %12, 1
%14 = add nuw i16 %13, %10
ret i16 %14
}