short bicub_kernel(float t, short a0, short a1, short a2, short a3) {
  return (2 * a1 + t * ((-a0 + a2) + t * ((2 * a0 - 5 * a1 + 4 * a2 - a3) +
                                          t * (-a0 + 3 * a1 - 3 * a2 + a3)))) /
         2;
}


x86 assembly (clang, -O0):
<bicub_kernel>:
push   %rbp
mov    %rsp,%rbp
mov    %cx,%ax
mov    %dx,%cx
mov    %si,%dx
mov    %di,%si
movss  %xmm0,-0x4(%rbp)
mov    %si,-0x6(%rbp)
mov    %dx,-0x8(%rbp)
mov    %cx,-0xa(%rbp)
mov    %ax,-0xc(%rbp)
movswl -0x8(%rbp),%edx
mov    %edx,%eax
add    %eax,%eax
cvtsi2ss %eax,%xmm1
movss  -0x4(%rbp),%xmm0
movswl -0x6(%rbp),%esi
movswl -0xa(%rbp),%ecx
mov    %ecx,%eax
sub    %esi,%eax
cvtsi2ss %eax,%xmm3
mov    %esi,%edi
add    %edi,%edi
mov    %edx,%eax
lea    (%rax,%rax,4),%edx
sub    %edx,%edi
mov    %ecx,%edx
mov    %edi,%ecx
lea    (%rcx,%rdx,4),%edi
movswl -0xc(%rbp),%ecx
sub    %ecx,%edi
cvtsi2ss %edi,%xmm2
lea    (%rax,%rax,2),%eax
sub    %esi,%eax
lea    (%rdx,%rdx,2),%edx
sub    %edx,%eax
add    %ecx,%eax
cvtsi2ss %eax,%xmm5
movaps %xmm0,%xmm4
mulss  %xmm5,%xmm4
addss  %xmm2,%xmm4
movaps %xmm0,%xmm2
mulss  %xmm4,%xmm2
addss  %xmm3,%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xe68(%rip),%xmm1
divss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
cwtl
pop    %rbp
ret

x86 assembly (clang, -O2):
<bicub_kernel>:
lea    (%rsi,%rsi,1),%eax
cvtsi2ss %eax,%xmm1
lea    (%rdi,%rdi,1),%r8d
lea    (%rsi,%rsi,4),%eax
sub    %eax,%r8d
lea    (%r8,%rdx,4),%r8d
mov    %edx,%eax
sub    %edi,%eax
cvtsi2ss %eax,%xmm2
sub    %ecx,%r8d
cvtsi2ss %r8d,%xmm3
sub    %edx,%esi
lea    (%rsi,%rsi,2),%eax
sub    %edi,%ecx
add    %eax,%ecx
cvtsi2ss %ecx,%xmm4
mulss  %xmm0,%xmm4
addss  %xmm3,%xmm4
mulss  %xmm0,%xmm4
addss  %xmm2,%xmm4
mulss  %xmm0,%xmm4
addss  %xmm1,%xmm4
mulss  0xeae(%rip),%xmm4
cvttss2si %xmm4,%eax
ret

LLVM IR (-O0):
define signext i16 @bicub_kernel(float %0, i16 signext %1, i16 signext %2, i16 signext %3, i16 signext %4) {
%6 = alloca float
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
store float %0, float* %6
store i16 %1, i16* %7
store i16 %2, i16* %8
store i16 %3, i16* %9
store i16 %4, i16* %10
%11 = load i16, i16* %8
%12 = sext i16 %11 to i32
%13 = mul nsw i32 2, %12
%14 = sitofp i32 %13 to float
%15 = load float, float* %6
%16 = load i16, i16* %7
%17 = sext i16 %16 to i32
%18 = sub nsw i32 0, %17
%19 = load i16, i16* %9
%20 = sext i16 %19 to i32
%21 = add nsw i32 %18, %20
%22 = sitofp i32 %21 to float
%23 = load float, float* %6
%24 = load i16, i16* %7
%25 = sext i16 %24 to i32
%26 = mul nsw i32 2, %25
%27 = load i16, i16* %8
%28 = sext i16 %27 to i32
%29 = mul nsw i32 5, %28
%30 = sub nsw i32 %26, %29
%31 = load i16, i16* %9
%32 = sext i16 %31 to i32
%33 = mul nsw i32 4, %32
%34 = add nsw i32 %30, %33
%35 = load i16, i16* %10
%36 = sext i16 %35 to i32
%37 = sub nsw i32 %34, %36
%38 = sitofp i32 %37 to float
%39 = load float, float* %6
%40 = load i16, i16* %7
%41 = sext i16 %40 to i32
%42 = sub nsw i32 0, %41
%43 = load i16, i16* %8
%44 = sext i16 %43 to i32
%45 = mul nsw i32 3, %44
%46 = add nsw i32 %42, %45
%47 = load i16, i16* %9
%48 = sext i16 %47 to i32
%49 = mul nsw i32 3, %48
%50 = sub nsw i32 %46, %49
%51 = load i16, i16* %10
%52 = sext i16 %51 to i32
%53 = add nsw i32 %50, %52
%54 = sitofp i32 %53 to float
%55 = call float @llvm.fmuladd.f32(float %39, float %54, float %38)
%56 = call float @llvm.fmuladd.f32(float %23, float %55, float %22)
%57 = call float @llvm.fmuladd.f32(float %15, float %56, float %14)
%58 = fdiv float %57, 2.000000e+00
%59 = fptosi float %58 to i16
ret i16 %59
}

LLVM IR (-O2):
define signext i16 @bicub_kernel(float %0, i16 signext %1, i16 signext %2, i16 signext %3, i16 signext %4) {
%6 = sext i16 %2 to i32
%7 = shl nsw i32 %6, 1
%8 = sitofp i32 %7 to float
%9 = sext i16 %1 to i32
%10 = sext i16 %3 to i32
%11 = sub nsw i32 %10, %9
%12 = sitofp i32 %11 to float
%13 = shl nsw i32 %9, 1
%14 = mul nsw i32 %6, -5
%15 = add nsw i32 %14, %13
%16 = shl nsw i32 %10, 2
%17 = add nsw i32 %15, %16
%18 = sext i16 %4 to i32
%19 = sub nsw i32 %17, %18
%20 = sitofp i32 %19 to float
%21 = sub nsw i32 %6, %10
%22 = mul nsw i32 %21, 3
%23 = sub nsw i32 %18, %9
%24 = add nsw i32 %23, %22
%25 = sitofp i32 %24 to float
%26 = tail call float @llvm.fmuladd.f32(float %0, float %25, float %20)
%27 = tail call float @llvm.fmuladd.f32(float %0, float %26, float %12)
%28 = tail call float @llvm.fmuladd.f32(float %0, float %27, float %8)
%29 = fmul float %28, 5.000000e-01
%30 = fptosi float %29 to i16
ret i16 %30
}