#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 */
long ceilf(float);
long lroundf(float x) {
  long t;
  if (x >= 0.0) {
    t = ceilf(x);
    if (t - x > 0.5)
      t -= 1.0;
    return (t);
  } else {
    t = ceilf(-x);
    if (t + x > 0.5)
      t -= 1.0;
    return (-t);
  }
}


x86 assembly (clang, -O0):
<lroundf>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     118a <lroundf+0x7a>
movss  -0xc(%rbp),%xmm0
call   1030 <ceilf@plt>
mov    %rax,-0x18(%rbp)
cvtsi2ssq -0x18(%rbp),%xmm0
subss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xea8(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    117d <lroundf+0x6d>
cvtsi2sdq -0x18(%rbp),%xmm0
movsd  0xe98(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    11eb <lroundf+0xdb>
movss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
call   1030 <ceilf@plt>
mov    %rax,-0x18(%rbp)
cvtsi2ssq -0x18(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe44(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11e1 <lroundf+0xd1>
cvtsi2sdq -0x18(%rbp),%xmm0
movsd  0xe34(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x18(%rbp)
xor    %eax,%eax
sub    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lroundf>:
sub    $0x18,%rsp
movaps %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
movaps %xmm1,(%rsp)
jae    116a <lroundf+0x5a>
movaps 0xee6(%rip),%xmm0
xorps  %xmm1,%xmm0
call   1030 <ceilf@plt>
mov    %rax,%rcx
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
addss  (%rsp),%xmm0
ucomiss 0xeb7(%rip),%xmm0
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  0xeaf(%rip),%xmm0
cvttsd2si %xmm0,%rax
cmovbe %rcx,%rax
neg    %rax
add    $0x18,%rsp
ret
movaps %xmm1,%xmm0
call   1030 <ceilf@plt>
mov    %rax,%rcx
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
subss  (%rsp),%xmm0
ucomiss 0xe77(%rip),%xmm0
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  0xe6f(%rip),%xmm0
cvttsd2si %xmm0,%rax
cmovbe %rcx,%rax
add    $0x18,%rsp
ret

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

LLVM IR (-O2):
define i64 @lroundf(float %0) {
%2 = fcmp ult float %0, 0.000000e+00
br i1 %2, label %12, label %3
3: ; preds = %1
%4 = tail call i64 @ceilf(float %0)
%5 = sitofp i64 %4 to float
%6 = fsub float %5, %0
%7 = fcmp ogt float %6, 5.000000e-01
%8 = sitofp i64 %4 to double
%9 = fadd double %8, -1.000000e+00
%10 = fptosi double %9 to i64
%11 = select i1 %7, i64 %10, i64 %4
br label %23
12: ; preds = %1
%13 = fneg float %0
%14 = tail call i64 @ceilf(float %13)
%15 = sitofp i64 %14 to float
%16 = fadd float %15, %0
%17 = fcmp ogt float %16, 5.000000e-01
%18 = sitofp i64 %14 to double
%19 = fadd double %18, -1.000000e+00
%20 = fptosi double %19 to i64
%21 = select i1 %17, i64 %20, i64 %14
%22 = sub nsw i64 0, %21
br label %23
23: ; preds = %12, %3
%24 = phi i64 [ %11, %3 ], [ %22, %12 ]
ret i64 %24
}