double vlerp(double x0, double y0, double x1, double y1, double x) {
  double t;
  if (x <= x0)
    return y0;
  if (x >= x1)
    return y1;
  t = (x - x0) / (x1 - x0);
  return y0 + t * (y1 - y0);
}


x86 assembly (clang, -O0):
<vlerp>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
movsd  %xmm4,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     1140 <vlerp+0x40>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    119d <vlerp+0x9d>
movsd  -0x30(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jb     115f <vlerp+0x5f>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    119d <vlerp+0x9d>
movsd  -0x30(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm2
subsd  -0x18(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<vlerp>:
ucomisd %xmm4,%xmm0
jae    112c <vlerp+0x2c>
ucomisd %xmm2,%xmm4
jae    1129 <vlerp+0x29>
subsd  %xmm0,%xmm4
subsd  %xmm0,%xmm2
divsd  %xmm2,%xmm4
subsd  %xmm1,%xmm3
mulsd  %xmm4,%xmm3
addsd  %xmm1,%xmm3
movapd %xmm3,%xmm0
ret
movaps %xmm3,%xmm1
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @vlerp(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
store double %0, double* %7
store double %1, double* %8
store double %2, double* %9
store double %3, double* %10
store double %4, double* %11
%13 = load double, double* %11
%14 = load double, double* %7
%15 = fcmp ole double %13, %14
br i1 %15, label %16, label %18
16: ; preds = %5
%17 = load double, double* %8
store double %17, double* %6
br label %38
18: ; preds = %5
%19 = load double, double* %11
%20 = load double, double* %9
%21 = fcmp oge double %19, %20
br i1 %21, label %22, label %24
22: ; preds = %18
%23 = load double, double* %10
store double %23, double* %6
br label %38
24: ; preds = %18
%25 = load double, double* %11
%26 = load double, double* %7
%27 = fsub double %25, %26
%28 = load double, double* %9
%29 = load double, double* %7
%30 = fsub double %28, %29
%31 = fdiv double %27, %30
store double %31, double* %12
%32 = load double, double* %8
%33 = load double, double* %12
%34 = load double, double* %10
%35 = load double, double* %8
%36 = fsub double %34, %35
%37 = call double @llvm.fmuladd.f64(double %33, double %36, double %32)
store double %37, double* %6
br label %38
38: ; preds = %24, %22, %16
%39 = load double, double* %6
ret double %39
}

LLVM IR (-O2):
define double @vlerp(double %0, double %1, double %2, double %3, double %4) {
%6 = fcmp ugt double %4, %0
br i1 %6, label %7, label %15
7: ; preds = %5
%8 = fcmp ult double %4, %2
br i1 %8, label %9, label %15
9: ; preds = %7
%10 = fsub double %4, %0
%11 = fsub double %2, %0
%12 = fdiv double %10, %11
%13 = fsub double %3, %1
%14 = tail call double @llvm.fmuladd.f64(double %12, double %13, double %1)
br label %15
15: ; preds = %7, %5, %9
%16 = phi double [ %14, %9 ], [ %1, %5 ], [ %3, %7 ]
ret double %16
}