long long int __llround(double x) {
  double xrf;
  long long int xr;
  xr = (long long int)x;
  xrf = (double)xr;
  if (x >= 0.0)
    if (x - xrf >= 0.5 && x - xrf < 1.0 && x + 1 > 0)
      return x + 1;
    else
      return x;
  else if (xrf - x >= 0.5 && xrf - x < 1.0 && x - 1 < 0)
    return x - 1;
  else
    return x;
}


x86 assembly (clang, -O0):
<__llround>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
cvttsd2si -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
cvtsi2sdq -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     11ac <__llround+0xac>
movsd  -0x10(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  0xebe(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     119d <__llround+0x9d>
movsd  -0x10(%rbp),%xmm1
subsd  -0x18(%rbp),%xmm1
movsd  0xeaa(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    119d <__llround+0x9d>
movsd  0xe98(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    119d <__llround+0x9d>
movsd  0xe7e(%rip),%xmm0
addsd  -0x10(%rbp),%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x8(%rbp)
jmp    122b <__llround+0x12b>
cvttsd2si -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    122b <__llround+0x12b>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  0xe42(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1221 <__llround+0x121>
movsd  -0x18(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
movsd  0xe2e(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1221 <__llround+0x121>
movsd  -0x10(%rbp),%xmm1
movsd  0xe17(%rip),%xmm0
subsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1221 <__llround+0x121>
movsd  -0x10(%rbp),%xmm0
movsd  0xdf9(%rip),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rax
mov    %rax,-0x8(%rbp)
jmp    122b <__llround+0x12b>
cvttsd2si -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<__llround>:
cvttsd2si %xmm0,%rax
cvtsi2sd %rax,%xmm1
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm0
jae    1143 <__llround+0x43>
subsd  %xmm0,%xmm1
ucomisd 0xee0(%rip),%xmm1
jb     1142 <__llround+0x42>
movsd  0xede(%rip),%xmm2
ucomisd %xmm1,%xmm2
jbe    1142 <__llround+0x42>
addsd  0xed8(%rip),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
ja     1175 <__llround+0x75>
ret
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
ucomisd 0xead(%rip),%xmm2
jb     1142 <__llround+0x42>
movsd  0xeab(%rip),%xmm1
ucomisd %xmm2,%xmm1
jbe    1142 <__llround+0x42>
addsd  0xe9d(%rip),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1142 <__llround+0x42>
cvttsd2si %xmm0,%rax
ret

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

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