float FpUcurveSc_f(const float inpVal, const float hard, const float scale) {
  return (float)(inpVal >= 0.f
                     ? (inpVal * (hard + inpVal) /
                        (scale + (hard * inpVal) + (inpVal * inpVal)))
                     : (inpVal * (hard - inpVal) /
                        (scale - (hard * inpVal) + (inpVal * inpVal))));
}


x86 assembly (clang, -O0):
<FpUcurveSc_f>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jb     116e <FpUcurveSc_f+0x6e>
movss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
addss  -0x4(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  -0xc(%rbp),%xmm1
movss  -0x8(%rbp),%xmm2
movss  -0x4(%rbp),%xmm3
mulss  %xmm3,%xmm2
addss  %xmm1,%xmm2
movss  -0x4(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
jmp    11c0 <FpUcurveSc_f+0xc0>
movss  -0x4(%rbp),%xmm0
movss  -0x8(%rbp),%xmm1
subss  -0x4(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  -0xc(%rbp),%xmm1
movss  -0x8(%rbp),%xmm2
movss  -0x4(%rbp),%xmm3
movd   %xmm2,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm2
mulss  %xmm3,%xmm2
addss  %xmm1,%xmm2
movss  -0x4(%rbp),%xmm1
movss  -0x4(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<FpUcurveSc_f>:
movaps %xmm0,%xmm3
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm3
movaps 0xef0(%rip),%xmm5
movaps %xmm1,%xmm4
jae    1118 <FpUcurveSc_f+0x18>
xorps  %xmm5,%xmm4
xorps  %xmm3,%xmm5
cmpnless %xmm3,%xmm0
andps  %xmm0,%xmm5
andnps %xmm3,%xmm0
orps   %xmm5,%xmm0
addss  %xmm1,%xmm0
mulss  %xmm3,%xmm0
mulss  %xmm3,%xmm4
addss  %xmm2,%xmm4
mulss  %xmm3,%xmm3
addss  %xmm4,%xmm3
divss  %xmm3,%xmm0
ret

LLVM IR (-O0):
define float @FpUcurveSc_f(float %0, float %1, float %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca float
store float %0, float* %4
store float %1, float* %5
store float %2, float* %6
%7 = load float, float* %4
%8 = fcmp oge float %7, 0.000000e+00
br i1 %8, label %9, label %23
9: ; preds = %3
%10 = load float, float* %4
%11 = load float, float* %5
%12 = load float, float* %4
%13 = fadd float %11, %12
%14 = fmul float %10, %13
%15 = load float, float* %6
%16 = load float, float* %5
%17 = load float, float* %4
%18 = call float @llvm.fmuladd.f32(float %16, float %17, float %15)
%19 = load float, float* %4
%20 = load float, float* %4
%21 = call float @llvm.fmuladd.f32(float %19, float %20, float %18)
%22 = fdiv float %14, %21
br label %38
23: ; preds = %3
%24 = load float, float* %4
%25 = load float, float* %5
%26 = load float, float* %4
%27 = fsub float %25, %26
%28 = fmul float %24, %27
%29 = load float, float* %6
%30 = load float, float* %5
%31 = load float, float* %4
%32 = fneg float %30
%33 = call float @llvm.fmuladd.f32(float %32, float %31, float %29)
%34 = load float, float* %4
%35 = load float, float* %4
%36 = call float @llvm.fmuladd.f32(float %34, float %35, float %33)
%37 = fdiv float %28, %36
br label %38
38: ; preds = %23, %9
%39 = phi float [ %22, %9 ], [ %37, %23 ]
ret float %39
}

LLVM IR (-O2):
define float @FpUcurveSc_f(float %0, float %1, float %2) {
%4 = fcmp ult float %0, 0.000000e+00
%5 = fneg float %1
%6 = select i1 %4, float %5, float %1
%7 = fneg float %0
%8 = select i1 %4, float %7, float %0
%9 = fadd float %8, %1
%10 = fmul float %9, %0
%11 = tail call float @llvm.fmuladd.f32(float %6, float %0, float %2)
%12 = tail call float @llvm.fmuladd.f32(float %0, float %0, float %11)
%13 = fdiv float %10, %12
ret float %13
}