#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 */
scalar_t__ ceil(float);
float floor(float);
float sqrt(float);
int crown(int ind1, int ind2, int N1, int N2) {
  int N12, N22;
  int rind1, rind2;
  int valcrown;
  float val;
  N12 = N1 / 2;
  N22 = N2 / 2;
  if (ind1 < N12)
    rind1 = ind1;
  else
    rind1 = ind1 - N1;
  if (ind2 < N22)
    rind2 = ind2;
  else
    rind2 = ind2 - N2;
  val = sqrt((float)(rind1 * rind1 + rind2 * rind2));
  if ((val - floor(val)) < 0.5)
    valcrown = (int)floor(val);
  else
    valcrown = (int)ceil(val);
  return valcrown;
}


x86 assembly (clang, -O0):
<crown>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x18(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1177 <crown+0x47>
mov    -0x4(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1180 <crown+0x50>
mov    -0x4(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1197 <crown+0x67>
mov    -0x8(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    11a0 <crown+0x70>
mov    -0x8(%rbp),%eax
sub    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x20(%rbp),%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
call   1040 <sqrt@plt>
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x28(%rbp),%xmm0
call   1050 <floor@plt>
movaps %xmm0,%xmm1
movss  -0x2c(%rbp),%xmm0
subss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe16(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    120a <crown+0xda>
movss  -0x28(%rbp),%xmm0
call   1050 <floor@plt>
cvttss2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
jmp    1217 <crown+0xe7>
movss  -0x28(%rbp),%xmm0
call   1030 <ceil@plt>
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<crown>:
push   %rax
mov    %edx,%r8d
shr    $0x1f,%r8d
add    %edx,%r8d
sar    %r8d
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
xor    %r9d,%r9d
cmp    %edi,%r8d
cmovg  %r9d,%edx
sub    %edx,%edi
cmp    %esi,%eax
cmovg  %r9d,%ecx
sub    %ecx,%esi
imul   %edi,%edi
imul   %esi,%esi
add    %edi,%esi
cvtsi2ss %esi,%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1175 <crown+0x45>
sqrtss %xmm0,%xmm0
jmp    117a <crown+0x4a>
call   1050 <sqrt@plt>
movss  %xmm0,0x4(%rsp)
call   1040 <floorf@plt>
movss  0x4(%rsp),%xmm3
movaps %xmm3,%xmm1
subss  %xmm0,%xmm1
movss  0xe66(%rip),%xmm2
ucomiss %xmm1,%xmm2
jbe    11a5 <crown+0x75>
cvttss2si %xmm0,%eax
pop    %rcx
ret
movaps %xmm3,%xmm0
call   1030 <ceil@plt>
pop    %rcx
ret

LLVM IR (-O0):
define i32 @crown(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca float
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%15 = load i32, i32* %7
%16 = sdiv i32 %15, 2
store i32 %16, i32* %9
%17 = load i32, i32* %8
%18 = sdiv i32 %17, 2
store i32 %18, i32* %10
%19 = load i32, i32* %5
%20 = load i32, i32* %9
%21 = icmp slt i32 %19, %20
br i1 %21, label %22, label %24
22: ; preds = %4
%23 = load i32, i32* %5
store i32 %23, i32* %11
br label %28
24: ; preds = %4
%25 = load i32, i32* %5
%26 = load i32, i32* %7
%27 = sub nsw i32 %25, %26
store i32 %27, i32* %11
br label %28
28: ; preds = %24, %22
%29 = load i32, i32* %6
%30 = load i32, i32* %10
%31 = icmp slt i32 %29, %30
br i1 %31, label %32, label %34
32: ; preds = %28
%33 = load i32, i32* %6
store i32 %33, i32* %12
br label %38
34: ; preds = %28
%35 = load i32, i32* %6
%36 = load i32, i32* %8
%37 = sub nsw i32 %35, %36
store i32 %37, i32* %12
br label %38
38: ; preds = %34, %32
%39 = load i32, i32* %11
%40 = load i32, i32* %11
%41 = mul nsw i32 %39, %40
%42 = load i32, i32* %12
%43 = load i32, i32* %12
%44 = mul nsw i32 %42, %43
%45 = add nsw i32 %41, %44
%46 = sitofp i32 %45 to float
%47 = call float @sqrt(float %46)
store float %47, float* %14
%48 = load float, float* %14
%49 = load float, float* %14
%50 = call float @floor(float %49)
%51 = fsub float %48, %50
%52 = fpext float %51 to double
%53 = fcmp olt double %52, 5.000000e-01
br i1 %53, label %54, label %58
54: ; preds = %38
%55 = load float, float* %14
%56 = call float @floor(float %55)
%57 = fptosi float %56 to i32
store i32 %57, i32* %13
br label %62
58: ; preds = %38
%59 = load float, float* %14
%60 = call i64 @ceil(float %59)
%61 = trunc i64 %60 to i32
store i32 %61, i32* %13
br label %62
62: ; preds = %58, %54
%63 = load i32, i32* %13
ret i32 %63
}

LLVM IR (-O2):
define i32 @crown(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = sdiv i32 %2, 2
%6 = sdiv i32 %3, 2
%7 = icmp sgt i32 %5, %0
%8 = select i1 %7, i32 0, i32 %2
%9 = sub nsw i32 %0, %8
%10 = icmp sgt i32 %6, %1
%11 = select i1 %10, i32 0, i32 %3
%12 = sub nsw i32 %1, %11
%13 = mul nsw i32 %9, %9
%14 = mul nsw i32 %12, %12
%15 = add nuw nsw i32 %14, %13
%16 = sitofp i32 %15 to float
%17 = tail call float @sqrt(float %16)
%18 = tail call float @llvm.floor.f32(float %17)
%19 = fsub float %17, %18
%20 = fcmp olt float %19, 5.000000e-01
br i1 %20, label %21, label %23
21: ; preds = %4
%22 = fptosi float %18 to i32
br label %26
23: ; preds = %4
%24 = tail call i64 @ceil(float %17)
%25 = trunc i64 %24 to i32
br label %26
26: ; preds = %23, %21
%27 = phi i32 [ %22, %21 ], [ %25, %23 ]
ret i32 %27
}