double BGBMID_SplinePolateLoop(short *samp, int len, double t) {
  double f, g, u, v;
  double a, b, c, d;
  double p;
  int i;
  i = t;
  f = t - i;
  g = 1.0 - f;
  if (i <= 0) {
    i += len * ((len - i) / len);
  } else
    i = i % len;
  if ((i + 2) >= len) {
    a = samp[(i - 1) % len];
    b = samp[(i + 0) % len];
    c = samp[(i + 1) % len];
    d = samp[(i + 2) % len];
    u = b + f * (b - a);
    v = c + g * (c - d);
    p = (u * g) + (v * f);
    return (p);
  }
  a = samp[i - 1];
  b = samp[i + 0];
  c = samp[i + 1];
  d = samp[i + 2];
  u = b + f * (b - a);
  v = c + g * (c - d);
  p = (u * g) + (v * f);
  return (p);
}


x86 assembly (clang, -O0):
<BGBMID_SplinePolateLoop>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
cvttsd2si -0x20(%rbp),%eax
mov    %eax,-0x6c(%rbp)
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x6c(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xec9(%rip),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
cmpl   $0x0,-0x6c(%rbp)
jg     116e <BGBMID_SplinePolateLoop+0x6e>
mov    -0x14(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    -0x14(%rbp),%eax
sub    -0x6c(%rbp),%eax
cltd
idivl  -0x14(%rbp)
mov    %eax,%ecx
mov    -0x70(%rbp),%eax
imul   %ecx,%eax
add    -0x6c(%rbp),%eax
mov    %eax,-0x6c(%rbp)
jmp    1178 <BGBMID_SplinePolateLoop+0x78>
mov    -0x6c(%rbp),%eax
cltd
idivl  -0x14(%rbp)
mov    %edx,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x2,%eax
cmp    -0x14(%rbp),%eax
jl     12a2 <BGBMID_SplinePolateLoop+0x1a2>
mov    -0x10(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x6c(%rbp),%eax
add    $0xffffffff,%eax
mov    -0x14(%rbp),%ecx
cltd
idiv   %ecx
mov    -0x90(%rbp),%rax
movslq %edx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x6c(%rbp),%eax
mov    -0x14(%rbp),%ecx
cltd
idiv   %ecx
mov    -0x88(%rbp),%rax
movslq %edx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x80(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    -0x14(%rbp),%ecx
cltd
idiv   %ecx
mov    -0x80(%rbp),%rax
movslq %edx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x2,%eax
mov    -0x14(%rbp),%ecx
cltd
idiv   %ecx
mov    -0x78(%rbp),%rax
movslq %edx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
subsd  -0x48(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
subsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    136a <BGBMID_SplinePolateLoop+0x26a>
mov    -0x10(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0xffffffff,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movswl 0x2(%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movswl 0x4(%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
subsd  -0x48(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x58(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
subsd  -0x60(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x30(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  -0x28(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<BGBMID_SplinePolateLoop>:
cvttsd2si %xmm0,%eax
cvttpd2dq %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
subsd  %xmm1,%xmm0
movsd  0xee8(%rip),%xmm2
test   %eax,%eax
jle    1123 <BGBMID_SplinePolateLoop+0x23>
cltd
idiv   %esi
mov    %edx,%ecx
jmp    1130 <BGBMID_SplinePolateLoop+0x30>
mov    %esi,%ecx
sub    %eax,%ecx
mov    %ecx,%eax
cltd
idiv   %esi
mov    %esi,%ecx
sub    %edx,%ecx
subsd  %xmm0,%xmm2
lea    0x2(%rcx),%r8d
lea    -0x1(%rcx),%eax
cmp    %esi,%r8d
jge    1174 <BGBMID_SplinePolateLoop+0x74>
cltq
movslq %ecx,%rcx
xorpd  %xmm1,%xmm1
pxor   %xmm3,%xmm3
pinsrw $0x1,0x2(%rdi,%rcx,2),%xmm3
pinsrw $0x3,(%rdi,%rcx,2),%xmm3
psrad  $0x10,%xmm3
cvtdq2pd %xmm3,%xmm3
movslq %r8d,%rcx
pinsrw $0x1,(%rdi,%rcx,2),%xmm1
pinsrw $0x3,(%rdi,%rax,2),%xmm1
jmp    11c3 <BGBMID_SplinePolateLoop+0xc3>
cltd
idiv   %esi
mov    %edx,%r9d
mov    %ecx,%eax
cltd
idiv   %esi
movslq %edx,%r10
add    $0x1,%ecx
mov    %ecx,%eax
cltd
idiv   %esi
movslq %edx,%rax
xorpd  %xmm1,%xmm1
pinsrw $0x1,(%rdi,%rax,2),%xmm1
pinsrw $0x3,(%rdi,%r10,2),%xmm1
movslq %r9d,%rcx
psrad  $0x10,%xmm1
cvtdq2pd %xmm1,%xmm3
pxor   %xmm1,%xmm1
mov    %r8d,%eax
cltd
idiv   %esi
movslq %edx,%rax
pinsrw $0x1,(%rdi,%rax,2),%xmm1
pinsrw $0x3,(%rdi,%rcx,2),%xmm1
psrad  $0x10,%xmm1
cvtdq2pd %xmm1,%xmm1
movapd %xmm3,%xmm4
subpd  %xmm1,%xmm4
movapd %xmm2,%xmm1
unpcklpd %xmm0,%xmm1
mulpd  %xmm4,%xmm1
addpd  %xmm3,%xmm1
mulsd  %xmm1,%xmm0
unpckhpd %xmm1,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @BGBMID_SplinePolateLoop(i16* %0, i32 %1, double %2) {
%4 = alloca double
%5 = alloca i16*
%6 = alloca i32
%7 = alloca double
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca i32
store i16* %0, i16** %5
store i32 %1, i32* %6
store double %2, double* %7
%18 = load double, double* %7
%19 = fptosi double %18 to i32
store i32 %19, i32* %17
%20 = load double, double* %7
%21 = load i32, i32* %17
%22 = sitofp i32 %21 to double
%23 = fsub double %20, %22
store double %23, double* %8
%24 = load double, double* %8
%25 = fsub double 1.000000e+00, %24
store double %25, double* %9
%26 = load i32, i32* %17
%27 = icmp sle i32 %26, 0
br i1 %27, label %28, label %38
28: ; preds = %3
%29 = load i32, i32* %6
%30 = load i32, i32* %6
%31 = load i32, i32* %17
%32 = sub nsw i32 %30, %31
%33 = load i32, i32* %6
%34 = sdiv i32 %32, %33
%35 = mul nsw i32 %29, %34
%36 = load i32, i32* %17
%37 = add nsw i32 %36, %35
store i32 %37, i32* %17
br label %42
38: ; preds = %3
%39 = load i32, i32* %17
%40 = load i32, i32* %6
%41 = srem i32 %39, %40
store i32 %41, i32* %17
br label %42
42: ; preds = %38, %28
%43 = load i32, i32* %17
%44 = add nsw i32 %43, 2
%45 = load i32, i32* %6
%46 = icmp sge i32 %44, %45
br i1 %46, label %47, label %103
47: ; preds = %42
%48 = load i16*, i16** %5
%49 = load i32, i32* %17
%50 = sub nsw i32 %49, 1
%51 = load i32, i32* %6
%52 = srem i32 %50, %51
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i16, i16* %48, i64 %53
%55 = load i16, i16* %54
%56 = sitofp i16 %55 to double
store double %56, double* %12
%57 = load i16*, i16** %5
%58 = load i32, i32* %17
%59 = add nsw i32 %58, 0
%60 = load i32, i32* %6
%61 = srem i32 %59, %60
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i16, i16* %57, i64 %62
%64 = load i16, i16* %63
%65 = sitofp i16 %64 to double
store double %65, double* %13
%66 = load i16*, i16** %5
%67 = load i32, i32* %17
%68 = add nsw i32 %67, 1
%69 = load i32, i32* %6
%70 = srem i32 %68, %69
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i16, i16* %66, i64 %71
%73 = load i16, i16* %72
%74 = sitofp i16 %73 to double
store double %74, double* %14
%75 = load i16*, i16** %5
%76 = load i32, i32* %17
%77 = add nsw i32 %76, 2
%78 = load i32, i32* %6
%79 = srem i32 %77, %78
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds i16, i16* %75, i64 %80
%82 = load i16, i16* %81
%83 = sitofp i16 %82 to double
store double %83, double* %15
%84 = load double, double* %13
%85 = load double, double* %8
%86 = load double, double* %13
%87 = load double, double* %12
%88 = fsub double %86, %87
%89 = call double @llvm.fmuladd.f64(double %85, double %88, double %84)
store double %89, double* %10
%90 = load double, double* %14
%91 = load double, double* %9
%92 = load double, double* %14
%93 = load double, double* %15
%94 = fsub double %92, %93
%95 = call double @llvm.fmuladd.f64(double %91, double %94, double %90)
store double %95, double* %11
%96 = load double, double* %10
%97 = load double, double* %9
%98 = load double, double* %11
%99 = load double, double* %8
%100 = fmul double %98, %99
%101 = call double @llvm.fmuladd.f64(double %96, double %97, double %100)
store double %101, double* %16
%102 = load double, double* %16
store double %102, double* %4
br label %151
103: ; preds = %42
%104 = load i16*, i16** %5
%105 = load i32, i32* %17
%106 = sub nsw i32 %105, 1
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds i16, i16* %104, i64 %107
%109 = load i16, i16* %108
%110 = sitofp i16 %109 to double
store double %110, double* %12
%111 = load i16*, i16** %5
%112 = load i32, i32* %17
%113 = add nsw i32 %112, 0
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i16, i16* %111, i64 %114
%116 = load i16, i16* %115
%117 = sitofp i16 %116 to double
store double %117, double* %13
%118 = load i16*, i16** %5
%119 = load i32, i32* %17
%120 = add nsw i32 %119, 1
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i16, i16* %118, i64 %121
%123 = load i16, i16* %122
%124 = sitofp i16 %123 to double
store double %124, double* %14
%125 = load i16*, i16** %5
%126 = load i32, i32* %17
%127 = add nsw i32 %126, 2
%128 = sext i32 %127 to i64
%129 = getelementptr inbounds i16, i16* %125, i64 %128
%130 = load i16, i16* %129
%131 = sitofp i16 %130 to double
store double %131, double* %15
%132 = load double, double* %13
%133 = load double, double* %8
%134 = load double, double* %13
%135 = load double, double* %12
%136 = fsub double %134, %135
%137 = call double @llvm.fmuladd.f64(double %133, double %136, double %132)
store double %137, double* %10
%138 = load double, double* %14
%139 = load double, double* %9
%140 = load double, double* %14
%141 = load double, double* %15
%142 = fsub double %140, %141
%143 = call double @llvm.fmuladd.f64(double %139, double %142, double %138)
store double %143, double* %11
%144 = load double, double* %10
%145 = load double, double* %9
%146 = load double, double* %11
%147 = load double, double* %8
%148 = fmul double %146, %147
%149 = call double @llvm.fmuladd.f64(double %144, double %145, double %148)
store double %149, double* %16
%150 = load double, double* %16
store double %150, double* %4
br label %151
151: ; preds = %103, %47
%152 = load double, double* %4
ret double %152
}

LLVM IR (-O2):
define double @BGBMID_SplinePolateLoop(i16* nocapture %0, i32 %1, double %2) {
%4 = fptosi double %2 to i32
%5 = sitofp i32 %4 to double
%6 = fsub double %2, %5
%7 = fsub double 1.000000e+00, %6
%8 = icmp slt i32 %4, 1
br i1 %8, label %9, label %13
9: ; preds = %3
%10 = sub nsw i32 %1, %4
%11 = srem i32 %10, %1
%12 = sub i32 %1, %11
br label %15
13: ; preds = %3
%14 = srem i32 %4, %1
br label %15
15: ; preds = %13, %9
%16 = phi i32 [ %12, %9 ], [ %14, %13 ]
%17 = add nsw i32 %16, 2
%18 = icmp slt i32 %17, %1
%19 = add nsw i32 %16, -1
br i1 %18, label %48, label %20
20: ; preds = %15
%21 = srem i32 %19, %1
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i16, i16* %0, i64 %22
%24 = load i16, i16* %23
%25 = srem i32 %16, %1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i16, i16* %0, i64 %26
%28 = load i16, i16* %27
%29 = add nsw i32 %16, 1
%30 = srem i32 %29, %1
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i16, i16* %0, i64 %31
%33 = load i16, i16* %32
%34 = insertelement <2 x i16> poison, i16 %33, i64 0
%35 = insertelement <2 x i16> %34, i16 %28, i64 1
%36 = sitofp <2 x i16> %35 to <2 x double>
%37 = srem i32 %17, %1
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i16, i16* %0, i64 %38
%40 = load i16, i16* %39
%41 = insertelement <2 x i16> poison, i16 %40, i64 0
%42 = insertelement <2 x i16> %41, i16 %24, i64 1
%43 = sitofp <2 x i16> %42 to <2 x double>
%44 = fsub <2 x double> %36, %43
%45 = insertelement <2 x double> poison, double %7, i64 0
%46 = insertelement <2 x double> %45, double %6, i64 1
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %46, <2 x double> %44, <2 x double> %36)
br label %72
48: ; preds = %15
%49 = sext i32 %19 to i64
%50 = getelementptr inbounds i16, i16* %0, i64 %49
%51 = load i16, i16* %50
%52 = sext i32 %16 to i64
%53 = getelementptr inbounds i16, i16* %0, i64 %52
%54 = load i16, i16* %53
%55 = add nsw i32 %16, 1
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i16, i16* %0, i64 %56
%58 = load i16, i16* %57
%59 = insertelement <2 x i16> poison, i16 %58, i64 0
%60 = insertelement <2 x i16> %59, i16 %54, i64 1
%61 = sitofp <2 x i16> %60 to <2 x double>
%62 = sext i32 %17 to i64
%63 = getelementptr inbounds i16, i16* %0, i64 %62
%64 = load i16, i16* %63
%65 = insertelement <2 x i16> poison, i16 %64, i64 0
%66 = insertelement <2 x i16> %65, i16 %51, i64 1
%67 = sitofp <2 x i16> %66 to <2 x double>
%68 = fsub <2 x double> %61, %67
%69 = insertelement <2 x double> poison, double %7, i64 0
%70 = insertelement <2 x double> %69, double %6, i64 1
%71 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %70, <2 x double> %68, <2 x double> %61)
br label %72
72: ; preds = %48, %20
%73 = phi <2 x double> [ %71, %48 ], [ %47, %20 ]
%74 = extractelement <2 x double> %73, i64 0
%75 = fmul double %6, %74
%76 = extractelement <2 x double> %73, i64 1
%77 = tail call double @llvm.fmuladd.f64(double %76, double %7, double %75)
ret double %77
}