double biCubicValue(double c[16], double x, double y) {
  double x2, x3, y2, y3, z;
  x2 = x * x;
  x3 = x2 * x;
  y2 = y * y;
  y3 = y2 * y;
  z = c[0] + y * c[1] + y2 * c[2] + y3 * c[3] + x * c[4] + x * y * c[5] +
      x * y2 * c[6] + x * y3 * c[7] + x2 * c[8] + x2 * y * c[9] +
      x2 * y2 * c[10] + x2 * y3 * c[11] + x3 * c[12] + x3 * y * c[13] +
      x3 * y2 * c[14] + x3 * y3 * c[15];
  return (z);
}


x86 assembly (clang, -O0):
<biCubicValue>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x8(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x10(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x18(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x20(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x10(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x28(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x30(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x10(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x38(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x40(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x48(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x20(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x50(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x58(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x60(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x68(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movsd  0x70(%rax),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  0x78(%rax),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<biCubicValue>:
movapd %xmm0,%xmm8
unpcklpd %xmm1,%xmm8
movapd %xmm8,%xmm5
mulpd  %xmm8,%xmm5
mulpd  %xmm5,%xmm8
movsd  0x8(%rdi),%xmm4
mulsd  %xmm1,%xmm4
addsd  (%rdi),%xmm4
movapd %xmm5,%xmm3
unpckhpd %xmm5,%xmm3
movsd  0x10(%rdi),%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm4,%xmm6
movapd %xmm8,%xmm4
unpckhpd %xmm8,%xmm4
movsd  0x18(%rdi),%xmm7
mulsd  %xmm4,%xmm7
addsd  %xmm6,%xmm7
movsd  0x20(%rdi),%xmm6
mulsd  %xmm0,%xmm6
movapd %xmm0,%xmm2
mulsd  %xmm1,%xmm2
mulsd  0x28(%rdi),%xmm2
addsd  %xmm7,%xmm6
movapd %xmm3,%xmm7
mulsd  %xmm0,%xmm7
mulsd  0x30(%rdi),%xmm7
addsd  %xmm6,%xmm2
mulsd  %xmm4,%xmm0
mulsd  0x38(%rdi),%xmm0
addsd  %xmm2,%xmm7
addsd  %xmm7,%xmm0
movsd  0x40(%rdi),%xmm2
mulsd  %xmm5,%xmm2
addsd  %xmm2,%xmm0
movapd %xmm5,%xmm2
mulsd  %xmm1,%xmm2
mulsd  0x48(%rdi),%xmm2
addsd  %xmm2,%xmm0
movapd %xmm5,%xmm2
mulsd  %xmm3,%xmm2
mulsd  0x50(%rdi),%xmm2
addsd  %xmm2,%xmm0
mulsd  %xmm4,%xmm5
mulsd  0x58(%rdi),%xmm5
addsd  %xmm5,%xmm0
movsd  0x60(%rdi),%xmm2
mulsd  %xmm8,%xmm2
addsd  %xmm2,%xmm0
mulsd  %xmm8,%xmm1
mulsd  0x68(%rdi),%xmm1
addsd  %xmm1,%xmm0
mulsd  %xmm8,%xmm3
mulsd  0x70(%rdi),%xmm3
addsd  %xmm3,%xmm0
mulsd  %xmm8,%xmm4
mulsd  0x78(%rdi),%xmm4
addsd  %xmm4,%xmm0
ret

LLVM IR (-O0):
define double @biCubicValue(double* %0, double %1, double %2) {
%4 = alloca double*
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
store double* %0, double** %4
store double %1, double* %5
store double %2, double* %6
%12 = load double, double* %5
%13 = load double, double* %5
%14 = fmul double %12, %13
store double %14, double* %7
%15 = load double, double* %7
%16 = load double, double* %5
%17 = fmul double %15, %16
store double %17, double* %8
%18 = load double, double* %6
%19 = load double, double* %6
%20 = fmul double %18, %19
store double %20, double* %9
%21 = load double, double* %9
%22 = load double, double* %6
%23 = fmul double %21, %22
store double %23, double* %10
%24 = load double*, double** %4
%25 = getelementptr inbounds double, double* %24, i64 0
%26 = load double, double* %25
%27 = load double, double* %6
%28 = load double*, double** %4
%29 = getelementptr inbounds double, double* %28, i64 1
%30 = load double, double* %29
%31 = call double @llvm.fmuladd.f64(double %27, double %30, double %26)
%32 = load double, double* %9
%33 = load double*, double** %4
%34 = getelementptr inbounds double, double* %33, i64 2
%35 = load double, double* %34
%36 = call double @llvm.fmuladd.f64(double %32, double %35, double %31)
%37 = load double, double* %10
%38 = load double*, double** %4
%39 = getelementptr inbounds double, double* %38, i64 3
%40 = load double, double* %39
%41 = call double @llvm.fmuladd.f64(double %37, double %40, double %36)
%42 = load double, double* %5
%43 = load double*, double** %4
%44 = getelementptr inbounds double, double* %43, i64 4
%45 = load double, double* %44
%46 = call double @llvm.fmuladd.f64(double %42, double %45, double %41)
%47 = load double, double* %5
%48 = load double, double* %6
%49 = fmul double %47, %48
%50 = load double*, double** %4
%51 = getelementptr inbounds double, double* %50, i64 5
%52 = load double, double* %51
%53 = call double @llvm.fmuladd.f64(double %49, double %52, double %46)
%54 = load double, double* %5
%55 = load double, double* %9
%56 = fmul double %54, %55
%57 = load double*, double** %4
%58 = getelementptr inbounds double, double* %57, i64 6
%59 = load double, double* %58
%60 = call double @llvm.fmuladd.f64(double %56, double %59, double %53)
%61 = load double, double* %5
%62 = load double, double* %10
%63 = fmul double %61, %62
%64 = load double*, double** %4
%65 = getelementptr inbounds double, double* %64, i64 7
%66 = load double, double* %65
%67 = call double @llvm.fmuladd.f64(double %63, double %66, double %60)
%68 = load double, double* %7
%69 = load double*, double** %4
%70 = getelementptr inbounds double, double* %69, i64 8
%71 = load double, double* %70
%72 = call double @llvm.fmuladd.f64(double %68, double %71, double %67)
%73 = load double, double* %7
%74 = load double, double* %6
%75 = fmul double %73, %74
%76 = load double*, double** %4
%77 = getelementptr inbounds double, double* %76, i64 9
%78 = load double, double* %77
%79 = call double @llvm.fmuladd.f64(double %75, double %78, double %72)
%80 = load double, double* %7
%81 = load double, double* %9
%82 = fmul double %80, %81
%83 = load double*, double** %4
%84 = getelementptr inbounds double, double* %83, i64 10
%85 = load double, double* %84
%86 = call double @llvm.fmuladd.f64(double %82, double %85, double %79)
%87 = load double, double* %7
%88 = load double, double* %10
%89 = fmul double %87, %88
%90 = load double*, double** %4
%91 = getelementptr inbounds double, double* %90, i64 11
%92 = load double, double* %91
%93 = call double @llvm.fmuladd.f64(double %89, double %92, double %86)
%94 = load double, double* %8
%95 = load double*, double** %4
%96 = getelementptr inbounds double, double* %95, i64 12
%97 = load double, double* %96
%98 = call double @llvm.fmuladd.f64(double %94, double %97, double %93)
%99 = load double, double* %8
%100 = load double, double* %6
%101 = fmul double %99, %100
%102 = load double*, double** %4
%103 = getelementptr inbounds double, double* %102, i64 13
%104 = load double, double* %103
%105 = call double @llvm.fmuladd.f64(double %101, double %104, double %98)
%106 = load double, double* %8
%107 = load double, double* %9
%108 = fmul double %106, %107
%109 = load double*, double** %4
%110 = getelementptr inbounds double, double* %109, i64 14
%111 = load double, double* %110
%112 = call double @llvm.fmuladd.f64(double %108, double %111, double %105)
%113 = load double, double* %8
%114 = load double, double* %10
%115 = fmul double %113, %114
%116 = load double*, double** %4
%117 = getelementptr inbounds double, double* %116, i64 15
%118 = load double, double* %117
%119 = call double @llvm.fmuladd.f64(double %115, double %118, double %112)
store double %119, double* %11
%120 = load double, double* %11
ret double %120
}

LLVM IR (-O2):
define double @biCubicValue(double* nocapture %0, double %1, double %2) {
%4 = insertelement <2 x double> poison, double %1, i64 0
%5 = insertelement <2 x double> %4, double %2, i64 1
%6 = fmul <2 x double> %5, %5
%7 = fmul <2 x double> %6, %5
%8 = load double, double* %0
%9 = getelementptr inbounds double, double* %0, i64 1
%10 = load double, double* %9
%11 = tail call double @llvm.fmuladd.f64(double %2, double %10, double %8)
%12 = getelementptr inbounds double, double* %0, i64 2
%13 = load double, double* %12
%14 = extractelement <2 x double> %6, i64 1
%15 = tail call double @llvm.fmuladd.f64(double %14, double %13, double %11)
%16 = getelementptr inbounds double, double* %0, i64 3
%17 = load double, double* %16
%18 = extractelement <2 x double> %7, i64 1
%19 = tail call double @llvm.fmuladd.f64(double %18, double %17, double %15)
%20 = getelementptr inbounds double, double* %0, i64 4
%21 = load double, double* %20
%22 = tail call double @llvm.fmuladd.f64(double %1, double %21, double %19)
%23 = fmul double %1, %2
%24 = getelementptr inbounds double, double* %0, i64 5
%25 = load double, double* %24
%26 = tail call double @llvm.fmuladd.f64(double %23, double %25, double %22)
%27 = fmul double %14, %1
%28 = getelementptr inbounds double, double* %0, i64 6
%29 = load double, double* %28
%30 = tail call double @llvm.fmuladd.f64(double %27, double %29, double %26)
%31 = fmul double %18, %1
%32 = getelementptr inbounds double, double* %0, i64 7
%33 = load double, double* %32
%34 = tail call double @llvm.fmuladd.f64(double %31, double %33, double %30)
%35 = getelementptr inbounds double, double* %0, i64 8
%36 = load double, double* %35
%37 = extractelement <2 x double> %6, i64 0
%38 = tail call double @llvm.fmuladd.f64(double %37, double %36, double %34)
%39 = fmul double %37, %2
%40 = getelementptr inbounds double, double* %0, i64 9
%41 = load double, double* %40
%42 = tail call double @llvm.fmuladd.f64(double %39, double %41, double %38)
%43 = fmul double %37, %14
%44 = getelementptr inbounds double, double* %0, i64 10
%45 = load double, double* %44
%46 = tail call double @llvm.fmuladd.f64(double %43, double %45, double %42)
%47 = fmul double %37, %18
%48 = getelementptr inbounds double, double* %0, i64 11
%49 = load double, double* %48
%50 = tail call double @llvm.fmuladd.f64(double %47, double %49, double %46)
%51 = getelementptr inbounds double, double* %0, i64 12
%52 = load double, double* %51
%53 = extractelement <2 x double> %7, i64 0
%54 = tail call double @llvm.fmuladd.f64(double %53, double %52, double %50)
%55 = fmul double %53, %2
%56 = getelementptr inbounds double, double* %0, i64 13
%57 = load double, double* %56
%58 = tail call double @llvm.fmuladd.f64(double %55, double %57, double %54)
%59 = fmul double %53, %14
%60 = getelementptr inbounds double, double* %0, i64 14
%61 = load double, double* %60
%62 = tail call double @llvm.fmuladd.f64(double %59, double %61, double %58)
%63 = fmul double %53, %18
%64 = getelementptr inbounds double, double* %0, i64 15
%65 = load double, double* %64
%66 = tail call double @llvm.fmuladd.f64(double %63, double %65, double %62)
ret double %66
}