double dpoly_step(double x, double a, double b, double ya, double yb) {
  double dy;
  if (x <= a)
    dy = 0.0;
  else if (x >= b)
    dy = 0.0;
  else {
    double X = (2 * x - (a + b)) / (b - a);
    double dX = 2.0 / (b - a);
    double dY = 15.0 / 8.0 * (1.0 - 2.0 * X * X + X * X * X * X) * dX;
    dy = 0.5 * (yb - ya) * dY;
  }
  return dy;
}


x86 assembly (clang, -O0):
<dpoly_step>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  %xmm4,-0x28(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     113e <dpoly_step+0x3e>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1247 <dpoly_step+0x147>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     115b <dpoly_step+0x5b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1242 <dpoly_step+0x142>
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
addsd  -0x18(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x18(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
movsd  0xe6a(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe59(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm1,%xmm0
movsd  0xe24(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
mulsd  -0x38(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xdf4(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x28(%rbp),%xmm1
subsd  -0x20(%rbp),%xmm1
movsd  0xdcc(%rip),%xmm0
mulsd  %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1247 <dpoly_step+0x147>
movsd  -0x30(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<dpoly_step>:
ucomisd %xmm0,%xmm1
xorpd  %xmm5,%xmm5
jae    1180 <dpoly_step+0x80>
ucomisd %xmm2,%xmm0
jae    1180 <dpoly_step+0x80>
movapd %xmm1,%xmm5
addsd  %xmm2,%xmm5
addsd  %xmm0,%xmm0
subsd  %xmm5,%xmm0
subsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
movsd  0xed0(%rip),%xmm1
movsd  0xed0(%rip),%xmm5
mulsd  %xmm0,%xmm5
mulsd  %xmm0,%xmm5
addsd  0xec8(%rip),%xmm5
divsd  %xmm2,%xmm1
movapd %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm5,%xmm2
mulsd  0xeb0(%rip),%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm3,%xmm4
mulsd  0xea8(%rip),%xmm4
mulsd  %xmm2,%xmm4
movapd %xmm4,%xmm5
movapd %xmm5,%xmm0
ret

LLVM IR (-O0):
define double @dpoly_step(double %0, double %1, double %2, double %3, double %4) {
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store double %0, double* %6
store double %1, double* %7
store double %2, double* %8
store double %3, double* %9
store double %4, double* %10
%15 = load double, double* %6
%16 = load double, double* %7
%17 = fcmp ole double %15, %16
br i1 %17, label %18, label %19
18: ; preds = %5
store double 0.000000e+00, double* %11
br label %61
19: ; preds = %5
%20 = load double, double* %6
%21 = load double, double* %8
%22 = fcmp oge double %20, %21
br i1 %22, label %23, label %24
23: ; preds = %19
store double 0.000000e+00, double* %11
br label %60
24: ; preds = %19
%25 = load double, double* %6
%26 = load double, double* %7
%27 = load double, double* %8
%28 = fadd double %26, %27
%29 = fneg double %28
%30 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %25, double %29)
%31 = load double, double* %8
%32 = load double, double* %7
%33 = fsub double %31, %32
%34 = fdiv double %30, %33
store double %34, double* %12
%35 = load double, double* %8
%36 = load double, double* %7
%37 = fsub double %35, %36
%38 = fdiv double 2.000000e+00, %37
store double %38, double* %13
%39 = load double, double* %12
%40 = fmul double 2.000000e+00, %39
%41 = load double, double* %12
%42 = fneg double %40
%43 = call double @llvm.fmuladd.f64(double %42, double %41, double 1.000000e+00)
%44 = load double, double* %12
%45 = load double, double* %12
%46 = fmul double %44, %45
%47 = load double, double* %12
%48 = fmul double %46, %47
%49 = load double, double* %12
%50 = call double @llvm.fmuladd.f64(double %48, double %49, double %43)
%51 = fmul double 1.875000e+00, %50
%52 = load double, double* %13
%53 = fmul double %51, %52
store double %53, double* %14
%54 = load double, double* %10
%55 = load double, double* %9
%56 = fsub double %54, %55
%57 = fmul double 5.000000e-01, %56
%58 = load double, double* %14
%59 = fmul double %57, %58
store double %59, double* %11
br label %60
60: ; preds = %24, %23
br label %61
61: ; preds = %60, %18
%62 = load double, double* %11
ret double %62
}

LLVM IR (-O2):
define double @dpoly_step(double %0, double %1, double %2, double %3, double %4) {
%6 = fcmp ugt double %0, %1
%7 = fcmp ult double %0, %2
%8 = and i1 %6, %7
br i1 %8, label %9, label %26
9: ; preds = %5
%10 = fadd double %1, %2
%11 = fneg double %10
%12 = tail call double @llvm.fmuladd.f64(double %0, double 2.000000e+00, double %11)
%13 = fsub double %2, %1
%14 = fdiv double %12, %13
%15 = fdiv double 2.000000e+00, %13
%16 = fmul double %14, -2.000000e+00
%17 = tail call double @llvm.fmuladd.f64(double %16, double %14, double 1.000000e+00)
%18 = fmul double %14, %14
%19 = fmul double %14, %18
%20 = tail call double @llvm.fmuladd.f64(double %19, double %14, double %17)
%21 = fmul double %20, 1.875000e+00
%22 = fmul double %15, %21
%23 = fsub double %4, %3
%24 = fmul double %23, 5.000000e-01
%25 = fmul double %24, %22
br label %26
26: ; preds = %5, %9
%27 = phi double [ %25, %9 ], [ 0.000000e+00, %5 ]
ret double %27
}