unsigned long long int ceilingUp(float num) {
  float difference;
  if ((((int)num) - num) < 0) {
    difference = -(((int)num) - num);
  } else {
    difference = ((int)num) - num;
  }
  if (difference < 0.5) {
    return (((int)num));
  } else if (difference >= 0.5) {
    return (((int)num) + 1);
  }
}


x86 assembly (clang, -O0):
<ceilingUp>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0xc(%rbp)
cvttss2si -0xc(%rbp),%eax
cvtsi2ss %eax,%xmm1
subss  -0xc(%rbp),%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm1,%xmm0
jbe    1148 <ceilingUp+0x48>
cvttss2si -0xc(%rbp),%eax
cvtsi2ss %eax,%xmm0
subss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    115b <ceilingUp+0x5b>
cvttss2si -0xc(%rbp),%eax
cvtsi2ss %eax,%xmm0
subss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe94(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1186 <ceilingUp+0x86>
cvttss2si -0xc(%rbp),%eax
cltq
mov    %rax,-0x8(%rbp)
jmp    11b9 <ceilingUp+0xb9>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe69(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     11b4 <ceilingUp+0xb4>
cvttss2si -0xc(%rbp),%eax
add    $0x1,%eax
cltq
mov    %rax,-0x8(%rbp)
jmp    11b9 <ceilingUp+0xb9>
jmp    11b9 <ceilingUp+0xb9>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ceilingUp>:
cvttss2si %xmm0,%ecx
cvttps2dq %xmm0,%xmm1
cvtdq2ps %xmm1,%xmm1
subss  %xmm0,%xmm1
movaps 0xeea(%rip),%xmm2
xorps  %xmm1,%xmm2
xorps  %xmm3,%xmm3
movaps %xmm1,%xmm0
cmpltss %xmm3,%xmm0
andps  %xmm0,%xmm2
andnps %xmm1,%xmm0
orps   %xmm2,%xmm0
movss  0xedb(%rip),%xmm1
ucomiss %xmm0,%xmm1
ja     1146 <ceilingUp+0x46>
ucomiss 0xecf(%rip),%xmm0
jb     1149 <ceilingUp+0x49>
add    $0x1,%ecx
movslq %ecx,%rax
ret

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

LLVM IR (-O2):
define i64 @ceilingUp(float %0) {
%2 = fptosi float %0 to i32
%3 = sitofp i32 %2 to float
%4 = fsub float %3, %0
%5 = fcmp olt float %4, 0.000000e+00
%6 = fneg float %4
%7 = select i1 %5, float %6, float %4
%8 = fcmp olt float %7, 5.000000e-01
br i1 %8, label %9, label %11
9: ; preds = %1
%10 = sext i32 %2 to i64
br label %16
11: ; preds = %1
%12 = fcmp ult float %7, 5.000000e-01
br i1 %12, label %16, label %13
13: ; preds = %11
%14 = add nsw i32 %2, 1
%15 = sext i32 %14 to i64
br label %16
16: ; preds = %11, %13, %9
%17 = phi i64 [ %10, %9 ], [ %15, %13 ], [ undef, %11 ]
ret i64 %17
}