int ft_round(double d) {
  if ((long int)d == 0)
    return (0);
  if (d > 0) {
    if (d - (long int)d > 0.5)
      return ((long int)d + 1);
    return (d);
  }
  if (d - (long int)d > 0.5)
    return ((long int)d - 1);
  return ((long int)d);
}


x86 assembly (clang, -O0):
<ft_round>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
cvttsd2si -0x10(%rbp),%rax
cmp    $0x0,%rax
jne    1125 <ft_round+0x25>
movl   $0x0,-0x4(%rbp)
jmp    11bd <ft_round+0xbd>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    117c <ft_round+0x7c>
movsd  -0x10(%rbp),%xmm0
cvttsd2si -0x10(%rbp),%rax
cvtsi2sd %rax,%xmm1
subsd  %xmm1,%xmm0
movsd  0xead(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    116f <ft_round+0x6f>
cvttsd2si -0x10(%rbp),%rax
add    $0x1,%rax
mov    %eax,-0x4(%rbp)
jmp    11bd <ft_round+0xbd>
cvttsd2si -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    11bd <ft_round+0xbd>
movsd  -0x10(%rbp),%xmm0
cvttsd2si -0x10(%rbp),%rax
cvtsi2sd %rax,%xmm1
subsd  %xmm1,%xmm0
movsd  0xe68(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11b4 <ft_round+0xb4>
cvttsd2si -0x10(%rbp),%rax
sub    $0x1,%rax
mov    %eax,-0x4(%rbp)
jmp    11bd <ft_round+0xbd>
cvttsd2si -0x10(%rbp),%rax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_round>:
cvttsd2si %xmm0,%rax
test   %rax,%rax
je     112f <ft_round+0x2f>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
cvtsi2sd %rax,%xmm2
movapd %xmm0,%xmm1
subsd  %xmm2,%xmm1
jbe    1132 <ft_round+0x32>
ucomisd 0xed7(%rip),%xmm1
jbe    1140 <ft_round+0x40>
add    $0x1,%eax
ret
xor    %eax,%eax
ret
ucomisd 0xec6(%rip),%xmm1
jbe    113f <ft_round+0x3f>
add    $0xffffffff,%eax
ret
cvttsd2si %xmm0,%eax
ret

LLVM IR (-O0):
define i32 @ft_round(double %0) {
%2 = alloca i32
%3 = alloca double
store double %0, double* %3
%4 = load double, double* %3
%5 = fptosi double %4 to i64
%6 = icmp eq i64 %5, 0
br i1 %6, label %7, label %8
7: ; preds = %1
store i32 0, i32* %2
br label %42
8: ; preds = %1
%9 = load double, double* %3
%10 = fcmp ogt double %9, 0.000000e+00
br i1 %10, label %11, label %26
11: ; preds = %8
%12 = load double, double* %3
%13 = load double, double* %3
%14 = fptosi double %13 to i64
%15 = sitofp i64 %14 to double
%16 = fsub double %12, %15
%17 = fcmp ogt double %16, 5.000000e-01
br i1 %17, label %18, label %23
18: ; preds = %11
%19 = load double, double* %3
%20 = fptosi double %19 to i64
%21 = add nsw i64 %20, 1
%22 = trunc i64 %21 to i32
store i32 %22, i32* %2
br label %42
23: ; preds = %11
%24 = load double, double* %3
%25 = fptosi double %24 to i32
store i32 %25, i32* %2
br label %42
26: ; preds = %8
%27 = load double, double* %3
%28 = load double, double* %3
%29 = fptosi double %28 to i64
%30 = sitofp i64 %29 to double
%31 = fsub double %27, %30
%32 = fcmp ogt double %31, 5.000000e-01
br i1 %32, label %33, label %38
33: ; preds = %26
%34 = load double, double* %3
%35 = fptosi double %34 to i64
%36 = sub nsw i64 %35, 1
%37 = trunc i64 %36 to i32
store i32 %37, i32* %2
br label %42
38: ; preds = %26
%39 = load double, double* %3
%40 = fptosi double %39 to i64
%41 = trunc i64 %40 to i32
store i32 %41, i32* %2
br label %42
42: ; preds = %38, %33, %23, %18, %7
%43 = load i32, i32* %2
ret i32 %43
}

LLVM IR (-O2):
define i32 @ft_round(double %0) {
%2 = fptosi double %0 to i64
%3 = icmp eq i64 %2, 0
br i1 %3, label %19, label %4
4: ; preds = %1
%5 = fcmp ogt double %0, 0.000000e+00
%6 = sitofp i64 %2 to double
%7 = fsub double %0, %6
%8 = fcmp ogt double %7, 5.000000e-01
br i1 %5, label %9, label %15
9: ; preds = %4
br i1 %8, label %10, label %13
10: ; preds = %9
%11 = trunc i64 %2 to i32
%12 = add i32 %11, 1
br label %19
13: ; preds = %9
%14 = fptosi double %0 to i32
br label %19
15: ; preds = %4
%16 = trunc i64 %2 to i32
br i1 %8, label %17, label %19
17: ; preds = %15
%18 = add i32 %16, -1
br label %19
19: ; preds = %15, %1, %17, %13, %10
%20 = phi i32 [ %12, %10 ], [ %14, %13 ], [ %18, %17 ], [ 0, %1 ], [ %16, %15 ]
ret i32 %20
}