short _bdf_ceiling(double v) {
  short val, neg;
  val = neg = 0;
  if (v < 0) {
    neg = 1;
    while (v < -1.0) {
      val++;
      v += 1.0;
    }
  } else if (v > 0) {
    while (v > 1.0) {
      val++;
      v -= 1.0;
    }
    if (v > 0.0)
      val++;
  }
  return (!neg) ? val : -val;
}


x86 assembly (clang, -O0):
<_bdf_ceiling>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movw   $0x0,-0xc(%rbp)
movw   $0x0,-0xa(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    1164 <_bdf_ceiling+0x64>
movw   $0x1,-0xc(%rbp)
movsd  0xed7(%rip),%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    115f <_bdf_ceiling+0x5f>
mov    -0xa(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xa(%rbp)
movsd  0xeb0(%rip),%xmm0
addsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1129 <_bdf_ceiling+0x29>
jmp    11e1 <_bdf_ceiling+0xe1>
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11dc <_bdf_ceiling+0xdc>
jmp    117b <_bdf_ceiling+0x7b>
movsd  -0x8(%rbp),%xmm0
movsd  0xe78(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11b9 <_bdf_ceiling+0xb9>
mov    -0xa(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xa(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xe55(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    117b <_bdf_ceiling+0x7b>
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11d7 <_bdf_ceiling+0xd7>
mov    -0xa(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xa(%rbp)
jmp    11dc <_bdf_ceiling+0xdc>
jmp    11e1 <_bdf_ceiling+0xe1>
cmpw   $0x0,-0xc(%rbp)
jne    11f8 <_bdf_ceiling+0xf8>
movswl -0xa(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    1203 <_bdf_ceiling+0x103>
movswl -0xa(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cwtl
pop    %rbp
ret

x86 assembly (clang, -O2):
<_bdf_ceiling>:
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    113e <_bdf_ceiling+0x3e>
movsd  0xef6(%rip),%xmm1
xor    %eax,%eax
ucomisd %xmm0,%xmm1
jbe    113d <_bdf_ceiling+0x3d>
movsd  0xede(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
addsd  %xmm2,%xmm0
add    $0xffffffff,%eax
ucomisd %xmm0,%xmm1
ja     1130 <_bdf_ceiling+0x30>
ret
xor    %eax,%eax
ucomisd %xmm1,%xmm0
jbe    113d <_bdf_ceiling+0x3d>
ucomisd 0xeb2(%rip),%xmm0
jbe    116d <_bdf_ceiling+0x6d>
movsd  0xeb0(%rip),%xmm1
movsd  0xea0(%rip),%xmm2
add    $0x1,%eax
addsd  %xmm1,%xmm0
ucomisd %xmm2,%xmm0
ja     1160 <_bdf_ceiling+0x60>
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    113d <_bdf_ceiling+0x3d>
add    $0x1,%eax
ret

LLVM IR (-O0):
define signext i16 @_bdf_ceiling(double %0) {
%2 = alloca double
%3 = alloca i16
%4 = alloca i16
store double %0, double* %2
store i16 0, i16* %4
store i16 0, i16* %3
%5 = load double, double* %2
%6 = fcmp olt double %5, 0.000000e+00
br i1 %6, label %7, label %17
7: ; preds = %1
store i16 1, i16* %4
br label %8
8: ; preds = %11, %7
%9 = load double, double* %2
%10 = fcmp olt double %9, -1.000000e+00
br i1 %10, label %11, label %16
11: ; preds = %8
%12 = load i16, i16* %3
%13 = add i16 %12, 1
store i16 %13, i16* %3
%14 = load double, double* %2
%15 = fadd double %14, 1.000000e+00
store double %15, double* %2
br label %8
16: ; preds = %8
br label %37
17: ; preds = %1
%18 = load double, double* %2
%19 = fcmp ogt double %18, 0.000000e+00
br i1 %19, label %20, label %36
20: ; preds = %17
br label %21
21: ; preds = %24, %20
%22 = load double, double* %2
%23 = fcmp ogt double %22, 1.000000e+00
br i1 %23, label %24, label %29
24: ; preds = %21
%25 = load i16, i16* %3
%26 = add i16 %25, 1
store i16 %26, i16* %3
%27 = load double, double* %2
%28 = fsub double %27, 1.000000e+00
store double %28, double* %2
br label %21
29: ; preds = %21
%30 = load double, double* %2
%31 = fcmp ogt double %30, 0.000000e+00
br i1 %31, label %32, label %35
32: ; preds = %29
%33 = load i16, i16* %3
%34 = add i16 %33, 1
store i16 %34, i16* %3
br label %35
35: ; preds = %32, %29
br label %36
36: ; preds = %35, %17
br label %37
37: ; preds = %36, %16
%38 = load i16, i16* %4
%39 = icmp ne i16 %38, 0
br i1 %39, label %43, label %40
40: ; preds = %37
%41 = load i16, i16* %3
%42 = sext i16 %41 to i32
br label %47
43: ; preds = %37
%44 = load i16, i16* %3
%45 = sext i16 %44 to i32
%46 = sub nsw i32 0, %45
br label %47
47: ; preds = %43, %40
%48 = phi i32 [ %42, %40 ], [ %46, %43 ]
%49 = trunc i32 %48 to i16
ret i16 %49
}

LLVM IR (-O2):
define signext i16 @_bdf_ceiling(double %0) {
%2 = fcmp olt double %0, 0.000000e+00
br i1 %2, label %3, label %11
3: ; preds = %1
%4 = fcmp olt double %0, -1.000000e+00
br i1 %4, label %5, label %29
5: ; preds = %3, %5
%6 = phi i16 [ %8, %5 ], [ 0, %3 ]
%7 = phi double [ %9, %5 ], [ %0, %3 ]
%8 = add i16 %6, 1
%9 = fadd double %7, 1.000000e+00
%10 = fcmp olt double %9, -1.000000e+00
br i1 %10, label %5, label %27
11: ; preds = %1
%12 = fcmp ogt double %0, 0.000000e+00
br i1 %12, label %13, label %29
13: ; preds = %11
%14 = fcmp ogt double %0, 1.000000e+00
br i1 %14, label %15, label %21
15: ; preds = %13, %15
%16 = phi i16 [ %18, %15 ], [ 0, %13 ]
%17 = phi double [ %19, %15 ], [ %0, %13 ]
%18 = add i16 %16, 1
%19 = fadd double %17, -1.000000e+00
%20 = fcmp ogt double %19, 1.000000e+00
br i1 %20, label %15, label %21
21: ; preds = %15, %13
%22 = phi double [ %0, %13 ], [ %19, %15 ]
%23 = phi i16 [ 0, %13 ], [ %18, %15 ]
%24 = fcmp ogt double %22, 0.000000e+00
br i1 %24, label %25, label %29
25: ; preds = %21
%26 = add i16 %23, 1
br label %29
27: ; preds = %5
%28 = xor i16 %6, -1
br label %29
29: ; preds = %3, %27, %11, %21, %25
%30 = phi i16 [ 0, %11 ], [ %23, %21 ], [ %26, %25 ], [ 0, %3 ], [ %28, %27 ]
ret i16 %30
}