float interp_cubic(float a, float b, float c, float d, float t) {
  float x, y, z, w;
  float tsq = t * t;
  x = -a + 3.0 * b - 3.0 * c + d;
  y = 2.0 * a - 5.0 * b + 4.0 * c - d;
  z = c - a;
  w = 2.0 * b;
  return 0.5 * (x * tsq * t + y * tsq + z * t + w);
}


x86 assembly (clang, -O0):
<interp_cubic>:
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  -0x14(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xed5(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeb4(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  -0x10(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm2
movsd  0xe74(%rip),%xmm0
mulsd  %xmm2,%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
addsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe38(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  -0x10(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0xc(%rbp),%xmm0
subss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdf2(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x18(%rbp),%xmm1
mulss  -0x28(%rbp),%xmm1
movss  -0x14(%rbp),%xmm2
movss  -0x1c(%rbp),%xmm0
mulss  -0x28(%rbp),%xmm0
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x20(%rbp),%xmm0
movss  -0x14(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
addss  -0x24(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd99(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<interp_cubic>:
movaps %xmm4,%xmm8
cvtss2sd %xmm1,%xmm9
movsd  0xeef(%rip),%xmm7
mulsd  %xmm9,%xmm7
cvtss2sd %xmm0,%xmm10
subsd  %xmm10,%xmm7
cvtss2sd %xmm2,%xmm6
movsd  0xedc(%rip),%xmm5
mulsd  %xmm6,%xmm5
addsd  %xmm7,%xmm5
xorps  %xmm7,%xmm7
cvtss2sd %xmm3,%xmm7
addsd  %xmm7,%xmm5
xorps  %xmm3,%xmm3
cvtsd2ss %xmm5,%xmm3
mulsd  0xec1(%rip),%xmm9
addsd  %xmm10,%xmm10
addsd  %xmm9,%xmm10
mulsd  0xeb7(%rip),%xmm6
addsd  %xmm10,%xmm6
subsd  %xmm7,%xmm6
xorps  %xmm5,%xmm5
cvtsd2ss %xmm6,%xmm5
mulss  %xmm4,%xmm8
subss  %xmm0,%xmm2
addss  %xmm1,%xmm1
mulss  %xmm8,%xmm3
mulss  %xmm8,%xmm5
mulss  %xmm4,%xmm3
addss  %xmm5,%xmm3
mulss  %xmm4,%xmm2
addss  %xmm2,%xmm3
addss  %xmm1,%xmm3
mulss  0xe7c(%rip),%xmm3
movaps %xmm3,%xmm0
ret

LLVM IR (-O0):
define float @interp_cubic(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
%15 = 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
%16 = load float, float* %10
%17 = load float, float* %10
%18 = fmul float %16, %17
store float %18, float* %15
%19 = load float, float* %6
%20 = fneg float %19
%21 = fpext float %20 to double
%22 = load float, float* %7
%23 = fpext float %22 to double
%24 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %23, double %21)
%25 = load float, float* %8
%26 = fpext float %25 to double
%27 = call double @llvm.fmuladd.f64(double -3.000000e+00, double %26, double %24)
%28 = load float, float* %9
%29 = fpext float %28 to double
%30 = fadd double %27, %29
%31 = fptrunc double %30 to float
store float %31, float* %11
%32 = load float, float* %6
%33 = fpext float %32 to double
%34 = load float, float* %7
%35 = fpext float %34 to double
%36 = fmul double 5.000000e+00, %35
%37 = fneg double %36
%38 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %33, double %37)
%39 = load float, float* %8
%40 = fpext float %39 to double
%41 = call double @llvm.fmuladd.f64(double 4.000000e+00, double %40, double %38)
%42 = load float, float* %9
%43 = fpext float %42 to double
%44 = fsub double %41, %43
%45 = fptrunc double %44 to float
store float %45, float* %12
%46 = load float, float* %8
%47 = load float, float* %6
%48 = fsub float %46, %47
store float %48, float* %13
%49 = load float, float* %7
%50 = fpext float %49 to double
%51 = fmul double 2.000000e+00, %50
%52 = fptrunc double %51 to float
store float %52, float* %14
%53 = load float, float* %11
%54 = load float, float* %15
%55 = fmul float %53, %54
%56 = load float, float* %10
%57 = load float, float* %12
%58 = load float, float* %15
%59 = fmul float %57, %58
%60 = call float @llvm.fmuladd.f32(float %55, float %56, float %59)
%61 = load float, float* %13
%62 = load float, float* %10
%63 = call float @llvm.fmuladd.f32(float %61, float %62, float %60)
%64 = load float, float* %14
%65 = fadd float %63, %64
%66 = fpext float %65 to double
%67 = fmul double 5.000000e-01, %66
%68 = fptrunc double %67 to float
ret float %68
}

LLVM IR (-O2):
define float @interp_cubic(float %0, float %1, float %2, float %3, float %4) {
%6 = fmul float %4, %4
%7 = fneg float %0
%8 = fpext float %7 to double
%9 = fpext float %1 to double
%10 = tail call double @llvm.fmuladd.f64(double %9, double 3.000000e+00, double %8)
%11 = fpext float %2 to double
%12 = tail call double @llvm.fmuladd.f64(double %11, double -3.000000e+00, double %10)
%13 = fpext float %3 to double
%14 = fadd double %12, %13
%15 = fptrunc double %14 to float
%16 = fpext float %0 to double
%17 = fmul double %9, -5.000000e+00
%18 = tail call double @llvm.fmuladd.f64(double %16, double 2.000000e+00, double %17)
%19 = tail call double @llvm.fmuladd.f64(double %11, double 4.000000e+00, double %18)
%20 = fsub double %19, %13
%21 = fptrunc double %20 to float
%22 = fsub float %2, %0
%23 = fmul float %1, 2.000000e+00
%24 = fmul float %6, %15
%25 = fmul float %6, %21
%26 = tail call float @llvm.fmuladd.f32(float %24, float %4, float %25)
%27 = tail call float @llvm.fmuladd.f32(float %22, float %4, float %26)
%28 = fadd float %23, %27
%29 = fmul float %28, 5.000000e-01
ret float %29
}