long double new_position(long double currentPosition,
                         long double expectedDisplacement, long double radius) {
  if ((currentPosition + expectedDisplacement) >= 1) {
    return 1 - radius;
  } else if ((currentPosition + expectedDisplacement) <= -1) {
    return -1 + radius;
  } else {
    return expectedDisplacement;
  }
}


x86 assembly (clang, -O0):
<new_position>:
push   %rbp
mov    %rsp,%rbp
fldt   0x30(%rbp)
fldt   0x20(%rbp)
fldt   0x10(%rbp)
fstpt  -0x20(%rbp)
fstpt  -0x30(%rbp)
fstpt  -0x40(%rbp)
fldt   -0x20(%rbp)
fldt   -0x30(%rbp)
faddp  %st,%st(1)
fld1
fxch   %st(1)
fucomip %st(1),%st
fstp   %st(0)
jb     1140 <new_position+0x40>
jmp    1131 <new_position+0x31>
fldt   -0x40(%rbp)
fld1
fsubp  %st,%st(1)
fstpt  -0x10(%rbp)
jmp    1172 <new_position+0x72>
fldt   -0x20(%rbp)
fldt   -0x30(%rbp)
faddp  %st,%st(1)
fld1
fchs
fucomip %st(1),%st
fstp   %st(0)
jb     116c <new_position+0x6c>
jmp    115b <new_position+0x5b>
fldt   -0x40(%rbp)
fld1
fchs
faddp  %st,%st(1)
fstpt  -0x10(%rbp)
jmp    1172 <new_position+0x72>
fldt   -0x30(%rbp)
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
pop    %rbp
ret

x86 assembly (clang, -O2):
<new_position>:
fldt   0x28(%rsp)
fldt   0x18(%rsp)
fldt   0x8(%rsp)
fadd   %st(1),%st
fld1
fxch   %st(1)
fucomi %st(1),%st
jae    1126 <new_position+0x26>
fxch   %st(1)
fchs
fucomi %st(1),%st
fstp   %st(1)
jb     1136 <new_position+0x36>
fstp   %st(1)
faddp  %st,%st(1)
jmp    112c <new_position+0x2c>
fstp   %st(2)
fstp   %st(1)
fsubp  %st,%st(1)
fldz
fldz
fxch   %st(1)
fxch   %st(2)
fxch   %st(1)
fstp   %st(2)
fstp   %st(1)
ret

LLVM IR (-O0):
define x86_fp80 @new_position(x86_fp80 %0, x86_fp80 %1, x86_fp80 %2) {
%4 = alloca x86_fp80
%5 = alloca x86_fp80
%6 = alloca x86_fp80
%7 = alloca x86_fp80
store x86_fp80 %0, x86_fp80* %5
store x86_fp80 %1, x86_fp80* %6
store x86_fp80 %2, x86_fp80* %7
%8 = load x86_fp80, x86_fp80* %5
%9 = load x86_fp80, x86_fp80* %6
%10 = fadd x86_fp80 %8, %9
%11 = fcmp oge x86_fp80 %10, 0xK3FFF8000000000000000
br i1 %11, label %12, label %15
12: ; preds = %3
%13 = load x86_fp80, x86_fp80* %7
%14 = fsub x86_fp80 0xK3FFF8000000000000000, %13
store x86_fp80 %14, x86_fp80* %4
br label %25
15: ; preds = %3
%16 = load x86_fp80, x86_fp80* %5
%17 = load x86_fp80, x86_fp80* %6
%18 = fadd x86_fp80 %16, %17
%19 = fcmp ole x86_fp80 %18, 0xKBFFF8000000000000000
br i1 %19, label %20, label %23
20: ; preds = %15
%21 = load x86_fp80, x86_fp80* %7
%22 = fadd x86_fp80 0xKBFFF8000000000000000, %21
store x86_fp80 %22, x86_fp80* %4
br label %25
23: ; preds = %15
%24 = load x86_fp80, x86_fp80* %6
store x86_fp80 %24, x86_fp80* %4
br label %25
25: ; preds = %23, %20, %12
%26 = load x86_fp80, x86_fp80* %4
ret x86_fp80 %26
}

LLVM IR (-O2):
define x86_fp80 @new_position(x86_fp80 %0, x86_fp80 %1, x86_fp80 %2) {
%4 = fadd x86_fp80 %0, %1
%5 = fcmp ult x86_fp80 %4, 0xK3FFF8000000000000000
br i1 %5, label %8, label %6
6: ; preds = %3
%7 = fsub x86_fp80 0xK3FFF8000000000000000, %2
br label %12
8: ; preds = %3
%9 = fcmp ugt x86_fp80 %4, 0xKBFFF8000000000000000
br i1 %9, label %12, label %10
10: ; preds = %8
%11 = fadd x86_fp80 %2, 0xKBFFF8000000000000000
br label %12
12: ; preds = %8, %10, %6
%13 = phi x86_fp80 [ %7, %6 ], [ %11, %10 ], [ %1, %8 ]
ret x86_fp80 %13
}