double rq_interpolate_splint(double x, double xa[], double ya[], double y2a[],
                             int n) {
  int klo, khi, k;
  double 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 0.0;
  }
  a = (xa[khi] - x) / h;
  b = (x - xa[klo]) / h;
  return a * ya[klo] + b * ya[khi] +
         ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) /
             6.0;
}


x86 assembly (clang, -O0):
<rq_interpolate_splint>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
sub    -0x30(%rbp),%eax
cmp    $0x1,%eax
jle    116e <rq_interpolate_splint+0x6e>
mov    -0x34(%rbp),%eax
add    -0x30(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1163 <rq_interpolate_splint+0x63>
mov    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1169 <rq_interpolate_splint+0x69>
mov    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1125 <rq_interpolate_splint+0x25>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11b2 <rq_interpolate_splint+0xb2>
jp     11b2 <rq_interpolate_splint+0xb2>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12c1 <rq_interpolate_splint+0x1c1>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0x10(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
divsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x48(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x50(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm3
movsd  -0x50(%rbp),%xmm2
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
mov    -0x28(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm3
movsd  -0x48(%rbp),%xmm2
mulsd  -0x48(%rbp),%xmm2
movsd  -0x48(%rbp),%xmm5
movsd  -0x48(%rbp),%xmm4
movq   %xmm4,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm4
mulsd  %xmm5,%xmm2
addsd  %xmm4,%xmm2
mov    -0x28(%rbp),%rax
movslq -0x34(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x40(%rbp),%xmm2
mulsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xd4c(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<rq_interpolate_splint>:
mov    $0x1,%eax
cmp    $0x3,%ecx
jl     114a <rq_interpolate_splint+0x4a>
mov    $0x1,%r8d
jmp    112d <rq_interpolate_splint+0x2d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r9d,%r8d
mov    %ecx,%eax
sub    %r8d,%eax
cmp    $0x1,%eax
jle    1147 <rq_interpolate_splint+0x47>
lea    (%r8,%rcx,1),%r9d
sar    %r9d
movslq %r9d,%rax
movsd  (%rdi,%rax,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    1120 <rq_interpolate_splint+0x20>
mov    %r9d,%ecx
jmp    1123 <rq_interpolate_splint+0x23>
movslq %r8d,%rax
movslq %ecx,%rcx
movsd  (%rdi,%rcx,8),%xmm3
movsd  (%rdi,%rax,8),%xmm4
movapd %xmm3,%xmm2
subsd  %xmm4,%xmm2
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm2
jne    1170 <rq_interpolate_splint+0x70>
jp     1170 <rq_interpolate_splint+0x70>
movapd %xmm1,%xmm0
ret
subsd  %xmm0,%xmm3
divsd  %xmm2,%xmm3
subsd  %xmm4,%xmm0
divsd  %xmm2,%xmm0
movsd  (%rsi,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  (%rsi,%rax,8),%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm1,%xmm4
movapd %xmm3,%xmm1
mulsd  %xmm3,%xmm1
mulsd  %xmm3,%xmm1
subsd  %xmm3,%xmm1
movapd %xmm0,%xmm3
mulsd  %xmm0,%xmm3
mulsd  %xmm0,%xmm3
subsd  %xmm0,%xmm3
mulsd  (%rdx,%rcx,8),%xmm3
mulsd  (%rdx,%rax,8),%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm2
mulsd  %xmm1,%xmm2
divsd  0xe2c(%rip),%xmm2
addsd  %xmm4,%xmm2
movapd %xmm2,%xmm1
movapd %xmm1,%xmm0
ret

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

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