float evalCubicHermite1D(float t, float p0, float p1, float m0, float m1) {
  const float t2 = t * t;
  const float t3 = t2 * t;
  return (1 + t3 + t3 - t2 - t2 - t2) * p0 + (t3 - t2 - t2 + t) * m0 +
         (t2 + t2 + t2 - t3 - t3) * p1 + (t3 - t2) * m1;
}


x86 assembly (clang, -O0):
<evalCubicHermite1D>:
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  -0x4(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  0xebd(%rip),%xmm0
addss  -0x1c(%rbp),%xmm0
addss  -0x1c(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movss  -0x1c(%rbp),%xmm1
subss  -0x18(%rbp),%xmm1
subss  -0x18(%rbp),%xmm1
addss  -0x4(%rbp),%xmm1
mulss  -0x10(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  -0x18(%rbp),%xmm1
addss  -0x18(%rbp),%xmm1
addss  -0x18(%rbp),%xmm1
subss  -0x1c(%rbp),%xmm1
subss  -0x1c(%rbp),%xmm1
movss  -0xc(%rbp),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x1c(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  -0x14(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
pop    %rbp
ret

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

LLVM IR (-O0):
define float @evalCubicHermite1D(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
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
%13 = load float, float* %6
%14 = load float, float* %6
%15 = fmul float %13, %14
store float %15, float* %11
%16 = load float, float* %11
%17 = load float, float* %6
%18 = fmul float %16, %17
store float %18, float* %12
%19 = load float, float* %12
%20 = fadd float 1.000000e+00, %19
%21 = load float, float* %12
%22 = fadd float %20, %21
%23 = load float, float* %11
%24 = fsub float %22, %23
%25 = load float, float* %11
%26 = fsub float %24, %25
%27 = load float, float* %11
%28 = fsub float %26, %27
%29 = load float, float* %7
%30 = load float, float* %12
%31 = load float, float* %11
%32 = fsub float %30, %31
%33 = load float, float* %11
%34 = fsub float %32, %33
%35 = load float, float* %6
%36 = fadd float %34, %35
%37 = load float, float* %9
%38 = fmul float %36, %37
%39 = call float @llvm.fmuladd.f32(float %28, float %29, float %38)
%40 = load float, float* %11
%41 = load float, float* %11
%42 = fadd float %40, %41
%43 = load float, float* %11
%44 = fadd float %42, %43
%45 = load float, float* %12
%46 = fsub float %44, %45
%47 = load float, float* %12
%48 = fsub float %46, %47
%49 = load float, float* %8
%50 = call float @llvm.fmuladd.f32(float %48, float %49, float %39)
%51 = load float, float* %12
%52 = load float, float* %11
%53 = fsub float %51, %52
%54 = load float, float* %10
%55 = call float @llvm.fmuladd.f32(float %53, float %54, float %50)
ret float %55
}

LLVM IR (-O2):
define float @evalCubicHermite1D(float %0, float %1, float %2, float %3, float %4) {
%6 = fmul float %0, %0
%7 = fmul float %6, %0
%8 = fadd float %7, 1.000000e+00
%9 = fadd float %7, %8
%10 = fsub float %9, %6
%11 = fsub float %10, %6
%12 = fsub float %11, %6
%13 = fsub float %7, %6
%14 = fsub float %13, %6
%15 = fadd float %14, %0
%16 = fmul float %15, %3
%17 = tail call float @llvm.fmuladd.f32(float %12, float %1, float %16)
%18 = fadd float %6, %6
%19 = fadd float %6, %18
%20 = fsub float %19, %7
%21 = fsub float %20, %7
%22 = tail call float @llvm.fmuladd.f32(float %21, float %2, float %17)
%23 = tail call float @llvm.fmuladd.f32(float %13, float %4, float %22)
ret float %23
}