float vrintf(float x) {
  float y, iy;
  int i;
  i = (int)x;
  iy = (float)i;
  if (x >= 0) {
    if (iy + 0.5 > x)
      y = iy;
    else
      y = iy + 1.0;
  } else {
    if (iy - 0.5 < x)
      y = iy;
    else
      y = iy - 1.0;
  }
  return (y);
}


x86 assembly (clang, -O0):
<vrintf>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
cvttss2si -0x4(%rbp),%eax
mov    %eax,-0x10(%rbp)
cvtsi2ssl -0x10(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     1186 <vrintf+0x86>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec3(%rip),%xmm1
addsd  %xmm1,%xmm0
movss  -0x4(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1163 <vrintf+0x63>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1181 <vrintf+0x81>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe94(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    11e0 <vrintf+0xe0>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe69(%rip),%xmm0
subsd  %xmm0,%xmm1
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11bd <vrintf+0xbd>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    11db <vrintf+0xdb>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe3a(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    11e0 <vrintf+0xe0>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<vrintf>:
movaps %xmm0,%xmm1
cvttps2dq %xmm0,%xmm2
cvtdq2ps %xmm2,%xmm0
xorps  %xmm3,%xmm3
ucomiss %xmm3,%xmm1
cvtdq2pd %xmm2,%xmm2
jae    1136 <vrintf+0x36>
movsd  0xef2(%rip),%xmm3
addsd  %xmm2,%xmm3
cvtss2sd %xmm1,%xmm1
ucomisd %xmm3,%xmm1
ja     115b <vrintf+0x5b>
addsd  0xee4(%rip),%xmm2
jmp    1154 <vrintf+0x54>
movsd  0xec2(%rip),%xmm3
addsd  %xmm2,%xmm3
cvtss2sd %xmm1,%xmm1
ucomisd %xmm1,%xmm3
ja     115b <vrintf+0x5b>
addsd  0xeb4(%rip),%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
ret

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

LLVM IR (-O2):
define float @vrintf(float %0) {
%2 = fptosi float %0 to i32
%3 = sitofp i32 %2 to float
%4 = fcmp ult float %0, 0.000000e+00
%5 = sitofp i32 %2 to double
br i1 %4, label %13, label %6
6: ; preds = %1
%7 = fadd double %5, 5.000000e-01
%8 = fpext float %0 to double
%9 = fcmp ogt double %7, %8
br i1 %9, label %20, label %10
10: ; preds = %6
%11 = fadd double %5, 1.000000e+00
%12 = fptrunc double %11 to float
br label %20
13: ; preds = %1
%14 = fadd double %5, -5.000000e-01
%15 = fpext float %0 to double
%16 = fcmp olt double %14, %15
br i1 %16, label %20, label %17
17: ; preds = %13
%18 = fadd double %5, -1.000000e+00
%19 = fptrunc double %18 to float
br label %20
20: ; preds = %13, %6, %17, %10
%21 = phi float [ %12, %10 ], [ %19, %17 ], [ %3, %6 ], [ %3, %13 ]
ret float %21
}