float cubicinterp(float x, float y0, float y1, float y2, float y3) {
  float c0 = y1;
  float c1 = 0.5f * (y2 - y0);
  float c2 = y0 - 2.5f * y1 + 2.f * y2 - 0.5f * y3;
  float c3 = 0.5f * (y3 - y0) + 1.5f * (y1 - y2);
  return ((c3 * x + c2) * x + c1) * x + c0;
}


x86 assembly (clang, -O0):
<cubicinterp>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
movss  %xmm4,-0x14(%rbp)
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x10(%rbp),%xmm1
subss  -0x8(%rbp),%xmm1
movss  0xec7(%rip),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x8(%rbp),%xmm1
movss  -0xc(%rbp),%xmm0
movss  0xeb8(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x10(%rbp),%xmm1
addss  %xmm1,%xmm1
addss  %xmm0,%xmm1
movss  -0x14(%rbp),%xmm0
movss  0xe92(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x14(%rbp),%xmm0
subss  -0x8(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
subss  -0x10(%rbp),%xmm2
movss  0xe65(%rip),%xmm1
mulss  %xmm2,%xmm1
movss  0xe55(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
movss  -0x4(%rbp),%xmm2
movss  -0x20(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x4(%rbp),%xmm2
movss  -0x1c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x4(%rbp),%xmm2
movss  -0x18(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<cubicinterp>:
movaps %xmm3,%xmm8
subss  %xmm1,%xmm8
movss  0xeef(%rip),%xmm6
mulss  %xmm6,%xmm8
movss  0xee6(%rip),%xmm7
mulss  %xmm2,%xmm7
addss  %xmm1,%xmm7
movaps %xmm2,%xmm5
subss  %xmm3,%xmm5
addss  %xmm3,%xmm3
addss  %xmm3,%xmm7
movss  0xecb(%rip),%xmm3
mulss  %xmm4,%xmm3
addss  %xmm7,%xmm3
subss  %xmm1,%xmm4
mulss  0xebb(%rip),%xmm5
mulss  %xmm4,%xmm6
addss  %xmm5,%xmm6
mulss  %xmm0,%xmm6
addss  %xmm3,%xmm6
mulss  %xmm0,%xmm6
addss  %xmm8,%xmm6
mulss  %xmm6,%xmm0
addss  %xmm2,%xmm0
ret

LLVM IR (-O0):
define float @cubicinterp(float %0, float %1, float %2, float %3, float %4) {
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
store float %0, float* %6
store float %1, float* %7
store float %2, float* %8
store float %3, float* %9
store float %4, float* %10
%15 = load float, float* %8
store float %15, float* %11
%16 = load float, float* %9
%17 = load float, float* %7
%18 = fsub float %16, %17
%19 = fmul float 5.000000e-01, %18
store float %19, float* %12
%20 = load float, float* %7
%21 = load float, float* %8
%22 = call float @llvm.fmuladd.f32(float -2.500000e+00, float %21, float %20)
%23 = load float, float* %9
%24 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %23, float %22)
%25 = load float, float* %10
%26 = call float @llvm.fmuladd.f32(float -5.000000e-01, float %25, float %24)
store float %26, float* %13
%27 = load float, float* %10
%28 = load float, float* %7
%29 = fsub float %27, %28
%30 = load float, float* %8
%31 = load float, float* %9
%32 = fsub float %30, %31
%33 = fmul float 1.500000e+00, %32
%34 = call float @llvm.fmuladd.f32(float 5.000000e-01, float %29, float %33)
store float %34, float* %14
%35 = load float, float* %14
%36 = load float, float* %6
%37 = load float, float* %13
%38 = call float @llvm.fmuladd.f32(float %35, float %36, float %37)
%39 = load float, float* %6
%40 = load float, float* %12
%41 = call float @llvm.fmuladd.f32(float %38, float %39, float %40)
%42 = load float, float* %6
%43 = load float, float* %11
%44 = call float @llvm.fmuladd.f32(float %41, float %42, float %43)
ret float %44
}

LLVM IR (-O2):
define float @cubicinterp(float %0, float %1, float %2, float %3, float %4) {
%6 = fsub float %3, %1
%7 = fmul float %6, 5.000000e-01
%8 = tail call float @llvm.fmuladd.f32(float %2, float -2.500000e+00, float %1)
%9 = tail call float @llvm.fmuladd.f32(float %3, float 2.000000e+00, float %8)
%10 = tail call float @llvm.fmuladd.f32(float %4, float -5.000000e-01, float %9)
%11 = fsub float %4, %1
%12 = fsub float %2, %3
%13 = fmul float %12, 1.500000e+00
%14 = tail call float @llvm.fmuladd.f32(float %11, float 5.000000e-01, float %13)
%15 = tail call float @llvm.fmuladd.f32(float %14, float %0, float %10)
%16 = tail call float @llvm.fmuladd.f32(float %15, float %0, float %7)
%17 = tail call float @llvm.fmuladd.f32(float %16, float %0, float %2)
ret float %17
}