float rintf(float x) {
  long linteger;
  float fremainder;
  float ret;
  linteger = (long)x;
  fremainder = x - (float)linteger;
  if (x < 0.0) {
    if (fremainder == -0.5) {
      linteger = ((linteger + 1) & ~1);
    } else if (fremainder < -0.5) {
      linteger--;
    }
  } else {
    if (fremainder == 0.5) {
      linteger = ((linteger + 1) & ~1);
    } else if (fremainder > 0.5) {
      linteger++;
    }
  }
  ret = (float)linteger;
  return ret;
}


x86 assembly (clang, -O0):
<rintf>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
cvttss2si -0x4(%rbp),%rax
mov    %rax,-0x10(%rbp)
movss  -0x4(%rbp),%xmm0
cvtsi2ssq -0x10(%rbp),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11a4 <rintf+0xa4>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeba(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1173 <rintf+0x73>
jp     1173 <rintf+0x73>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
and    $0xfffffffffffffffe,%rax
mov    %rax,-0x10(%rbp)
jmp    119f <rintf+0x9f>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe84(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    119a <rintf+0x9a>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    119f <rintf+0x9f>
jmp    120b <rintf+0x10b>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4b(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11da <rintf+0xda>
jp     11da <rintf+0xda>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
and    $0xfffffffffffffffe,%rax
mov    %rax,-0x10(%rbp)
jmp    1206 <rintf+0x106>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe15(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1201 <rintf+0x101>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1206 <rintf+0x106>
jmp    120b <rintf+0x10b>
cvtsi2ssq -0x10(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rintf>:
cvttss2si %xmm0,%rax
cvtsi2ss %rax,%xmm1
xorps  %xmm2,%xmm2
ucomiss %xmm0,%xmm2
subss  %xmm1,%xmm0
jbe    113b <rintf+0x3b>
ucomiss 0xee7(%rip),%xmm0
jne    1121 <rintf+0x21>
jnp    1146 <rintf+0x46>
movss  0xedb(%rip),%xmm1
ucomiss %xmm0,%xmm1
jbe    115d <rintf+0x5d>
add    $0xffffffffffffffff,%rax
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
ret
ucomiss 0xebe(%rip),%xmm0
jne    1157 <rintf+0x57>
jp     1157 <rintf+0x57>
add    $0x1,%rax
and    $0xfffffffffffffffe,%rax
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
ret
jbe    115d <rintf+0x5d>
add    $0x1,%rax
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
ret

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

LLVM IR (-O2):
define float @rintf(float %0) {
%2 = fptosi float %0 to i64
%3 = sitofp i64 %2 to float
%4 = fsub float %0, %3
%5 = fcmp olt float %0, 0.000000e+00
br i1 %5, label %6, label %15
6: ; preds = %1
%7 = fcmp oeq float %4, -5.000000e-01
br i1 %7, label %8, label %11
8: ; preds = %6
%9 = add nsw i64 %2, 1
%10 = and i64 %9, -2
br label %24
11: ; preds = %6
%12 = fcmp olt float %4, -5.000000e-01
br i1 %12, label %13, label %24
13: ; preds = %11
%14 = add nsw i64 %2, -1
br label %24
15: ; preds = %1
%16 = fcmp oeq float %4, 5.000000e-01
br i1 %16, label %17, label %20
17: ; preds = %15
%18 = add nsw i64 %2, 1
%19 = and i64 %18, -2
br label %24
20: ; preds = %15
%21 = fcmp ogt float %4, 5.000000e-01
br i1 %21, label %22, label %24
22: ; preds = %20
%23 = add nsw i64 %2, 1
br label %24
24: ; preds = %17, %22, %20, %8, %13, %11
%25 = phi i64 [ %10, %8 ], [ %14, %13 ], [ %2, %11 ], [ %19, %17 ], [ %23, %22 ], [ %2, %20 ]
%26 = sitofp i64 %25 to float
ret float %26
}