int bsplineGet(float *xa, float *ya, float *y2a, int n, float x, float *y) {
  int klo, khi, k;
  float h, b, a;
  klo = 1;
  khi = n;
  while (khi - klo > 1) {
    k = (khi + klo) >> 1;
    if (xa[k] > x)
      khi = k;
    else
      klo = k;
  }
  h = xa[khi] - xa[klo];
  if (h == 0.0)
    return -1;
  a = (xa[khi] - x) / h;
  b = (x - xa[klo]) / h;
  (*y) =
      a * ya[klo] + b * ya[khi] +
      ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0;
  return 0;
}


x86 assembly (clang, -O0):
<bsplineGet>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movss  %xmm0,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
sub    -0x34(%rbp),%eax
cmp    $0x1,%eax
jle    1171 <bsplineGet+0x71>
mov    -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x28(%rbp),%xmm0
jbe    1166 <bsplineGet+0x66>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    116c <bsplineGet+0x6c>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1129 <bsplineGet+0x29>
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x40(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11b8 <bsplineGet+0xb8>
jp     11b8 <bsplineGet+0xb8>
movl   $0xffffffff,-0x4(%rbp)
jmp    12c9 <bsplineGet+0x1c9>
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x28(%rbp),%xmm0
divss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
subss  (%rax,%rcx,4),%xmm0
divss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x48(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
movss  -0x44(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x48(%rbp),%xmm1
mulss  -0x48(%rbp),%xmm1
movss  -0x48(%rbp),%xmm3
movss  -0x48(%rbp),%xmm2
movd   %xmm2,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm3
movss  -0x44(%rbp),%xmm2
mulss  -0x44(%rbp),%xmm2
movss  -0x44(%rbp),%xmm5
movss  -0x44(%rbp),%xmm4
movd   %xmm4,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm4
mulss  %xmm5,%xmm2
addss  %xmm4,%xmm2
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
movss  -0x40(%rbp),%xmm2
mulss  -0x40(%rbp),%xmm2
mulss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd52(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bsplineGet>:
mov    $0x1,%r9d
cmp    $0x3,%ecx
jl     1149 <bsplineGet+0x49>
mov    $0x1,%r9d
jmp    112d <bsplineGet+0x2d>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r10d,%r9d
mov    %ecx,%eax
sub    %r9d,%eax
cmp    $0x1,%eax
jle    1146 <bsplineGet+0x46>
lea    (%r9,%rcx,1),%r10d
sar    %r10d
movslq %r10d,%rax
movss  (%rdi,%rax,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    1120 <bsplineGet+0x20>
mov    %r10d,%ecx
jmp    1123 <bsplineGet+0x23>
movslq %r9d,%r9
movslq %ecx,%rcx
movss  (%rdi,%rcx,4),%xmm2
movss  (%rdi,%r9,4),%xmm3
movaps %xmm2,%xmm1
subss  %xmm3,%xmm1
mov    $0xffffffff,%eax
xorps  %xmm4,%xmm4
ucomiss %xmm4,%xmm1
jne    116e <bsplineGet+0x6e>
jp     116e <bsplineGet+0x6e>
ret
subss  %xmm0,%xmm2
divss  %xmm1,%xmm2
subss  %xmm3,%xmm0
divss  %xmm1,%xmm0
movss  (%rsi,%rcx,4),%xmm3
mulss  %xmm0,%xmm3
movss  (%rsi,%r9,4),%xmm4
mulss  %xmm2,%xmm4
addss  %xmm3,%xmm4
movaps %xmm2,%xmm3
mulss  %xmm2,%xmm3
mulss  %xmm2,%xmm3
subss  %xmm2,%xmm3
movaps %xmm0,%xmm2
mulss  %xmm0,%xmm2
mulss  %xmm0,%xmm2
subss  %xmm0,%xmm2
mulss  (%rdx,%rcx,4),%xmm2
mulss  (%rdx,%r9,4),%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm4,%xmm0
addss  %xmm2,%xmm3
mulss  %xmm1,%xmm1
mulss  %xmm3,%xmm1
cvtss2sd %xmm1,%xmm1
divsd  0xe23(%rip),%xmm1
addsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
movss  %xmm0,(%r8)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @bsplineGet(float* %0, float* %1, float* %2, i32 %3, float %4, float* %5) {
%7 = alloca i32
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca i32
%12 = alloca float
%13 = alloca float*
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca float
%18 = alloca float
%19 = alloca float
store float* %0, float** %8
store float* %1, float** %9
store float* %2, float** %10
store i32 %3, i32* %11
store float %4, float* %12
store float* %5, float** %13
store i32 1, i32* %14
%20 = load i32, i32* %11
store i32 %20, i32* %15
br label %21
21: ; preds = %42, %6
%22 = load i32, i32* %15
%23 = load i32, i32* %14
%24 = sub nsw i32 %22, %23
%25 = icmp sgt i32 %24, 1
br i1 %25, label %26, label %43
26: ; preds = %21
%27 = load i32, i32* %15
%28 = load i32, i32* %14
%29 = add nsw i32 %27, %28
%30 = ashr i32 %29, 1
store i32 %30, i32* %16
%31 = load float*, float** %8
%32 = load i32, i32* %16
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds float, float* %31, i64 %33
%35 = load float, float* %34
%36 = load float, float* %12
%37 = fcmp ogt float %35, %36
br i1 %37, label %38, label %40
38: ; preds = %26
%39 = load i32, i32* %16
store i32 %39, i32* %15
br label %42
40: ; preds = %26
%41 = load i32, i32* %16
store i32 %41, i32* %14
br label %42
42: ; preds = %40, %38
br label %21
43: ; preds = %21
%44 = load float*, float** %8
%45 = load i32, i32* %15
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float, float* %44, i64 %46
%48 = load float, float* %47
%49 = load float*, float** %8
%50 = load i32, i32* %14
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds float, float* %49, i64 %51
%53 = load float, float* %52
%54 = fsub float %48, %53
store float %54, float* %17
%55 = load float, float* %17
%56 = fpext float %55 to double
%57 = fcmp oeq double %56, 0.000000e+00
br i1 %57, label %58, label %59
58: ; preds = %43
store i32 -1, i32* %7
br label %128
59: ; preds = %43
%60 = load float*, float** %8
%61 = load i32, i32* %15
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds float, float* %60, i64 %62
%64 = load float, float* %63
%65 = load float, float* %12
%66 = fsub float %64, %65
%67 = load float, float* %17
%68 = fdiv float %66, %67
store float %68, float* %19
%69 = load float, float* %12
%70 = load float*, float** %8
%71 = load i32, i32* %14
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds float, float* %70, i64 %72
%74 = load float, float* %73
%75 = fsub float %69, %74
%76 = load float, float* %17
%77 = fdiv float %75, %76
store float %77, float* %18
%78 = load float, float* %19
%79 = load float*, float** %9
%80 = load i32, i32* %14
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds float, float* %79, i64 %81
%83 = load float, float* %82
%84 = load float, float* %18
%85 = load float*, float** %9
%86 = load i32, i32* %15
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds float, float* %85, i64 %87
%89 = load float, float* %88
%90 = fmul float %84, %89
%91 = call float @llvm.fmuladd.f32(float %78, float %83, float %90)
%92 = fpext float %91 to double
%93 = load float, float* %19
%94 = load float, float* %19
%95 = fmul float %93, %94
%96 = load float, float* %19
%97 = load float, float* %19
%98 = fneg float %97
%99 = call float @llvm.fmuladd.f32(float %95, float %96, float %98)
%100 = load float*, float** %10
%101 = load i32, i32* %14
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds float, float* %100, i64 %102
%104 = load float, float* %103
%105 = load float, float* %18
%106 = load float, float* %18
%107 = fmul float %105, %106
%108 = load float, float* %18
%109 = load float, float* %18
%110 = fneg float %109
%111 = call float @llvm.fmuladd.f32(float %107, float %108, float %110)
%112 = load float*, float** %10
%113 = load i32, i32* %15
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds float, float* %112, i64 %114
%116 = load float, float* %115
%117 = fmul float %111, %116
%118 = call float @llvm.fmuladd.f32(float %99, float %104, float %117)
%119 = load float, float* %17
%120 = load float, float* %17
%121 = fmul float %119, %120
%122 = fmul float %118, %121
%123 = fpext float %122 to double
%124 = fdiv double %123, 6.000000e+00
%125 = fadd double %92, %124
%126 = fptrunc double %125 to float
%127 = load float*, float** %13
store float %126, float* %127
store i32 0, i32* %7
br label %128
128: ; preds = %59, %58
%129 = load i32, i32* %7
ret i32 %129
}

LLVM IR (-O2):
define i32 @bsplineGet(float* nocapture %0, float* nocapture %1, float* nocapture %2, i32 %3, float %4, float* nocapture writeonly %5) {
%7 = icmp sgt i32 %3, 2
br i1 %7, label %8, label %23
8: ; preds = %6, %8
%9 = phi i32 [ %18, %8 ], [ 1, %6 ]
%10 = phi i32 [ %17, %8 ], [ %3, %6 ]
%11 = add nsw i32 %9, %10
%12 = ashr i32 %11, 1
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds float, float* %0, i64 %13
%15 = load float, float* %14
%16 = fcmp ogt float %15, %4
%17 = select i1 %16, i32 %12, i32 %10
%18 = select i1 %16, i32 %9, i32 %12
%19 = sub nsw i32 %17, %18
%20 = icmp sgt i32 %19, 1
br i1 %20, label %8, label %21
21: ; preds = %8
%22 = sext i32 %18 to i64
br label %23
23: ; preds = %21, %6
%24 = phi i32 [ %3, %6 ], [ %17, %21 ]
%25 = phi i64 [ 1, %6 ], [ %22, %21 ]
%26 = sext i32 %24 to i64
%27 = getelementptr inbounds float, float* %0, i64 %26
%28 = load float, float* %27
%29 = getelementptr inbounds float, float* %0, i64 %25
%30 = load float, float* %29
%31 = fsub float %28, %30
%32 = fcmp oeq float %31, 0.000000e+00
br i1 %32, label %63, label %33
33: ; preds = %23
%34 = fsub float %28, %4
%35 = fdiv float %34, %31
%36 = fsub float %4, %30
%37 = fdiv float %36, %31
%38 = getelementptr inbounds float, float* %1, i64 %25
%39 = load float, float* %38
%40 = getelementptr inbounds float, float* %1, i64 %26
%41 = load float, float* %40
%42 = fmul float %37, %41
%43 = tail call float @llvm.fmuladd.f32(float %35, float %39, float %42)
%44 = fpext float %43 to double
%45 = fmul float %35, %35
%46 = fneg float %35
%47 = tail call float @llvm.fmuladd.f32(float %45, float %35, float %46)
%48 = getelementptr inbounds float, float* %2, i64 %25
%49 = load float, float* %48
%50 = fmul float %37, %37
%51 = fneg float %37
%52 = tail call float @llvm.fmuladd.f32(float %50, float %37, float %51)
%53 = getelementptr inbounds float, float* %2, i64 %26
%54 = load float, float* %53
%55 = fmul float %52, %54
%56 = tail call float @llvm.fmuladd.f32(float %47, float %49, float %55)
%57 = fmul float %31, %31
%58 = fmul float %57, %56
%59 = fpext float %58 to double
%60 = fdiv double %59, 6.000000e+00
%61 = fadd double %60, %44
%62 = fptrunc double %61 to float
store float %62, float* %5
br label %63
63: ; preds = %23, %33
%64 = phi i32 [ 0, %33 ], [ -1, %23 ]
ret i32 %64
}