void interpol1D(double *xn, double *yn, double *x, double *y, int nn, int n) {
  double slope;
  int i, k = 0;
  for (i = 0; i < n; ++i) {
    if (x[i] <= xn[0])
      y[i] = yn[0];
    else if (x[i] >= xn[nn - 1])
      y[i] = yn[nn - 1];
    else {
      while (k < nn - 1 && xn[k + 1] < x[i])
        ++k;
      slope = (yn[k + 1] - yn[k]) / (xn[k + 1] - xn[k]);
      y[i] = slope * (x[i] - xn[k]) + yn[k];
    }
  }
}


x86 assembly (clang, -O0):
<interpol1D>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    12ba <interpol1D+0x1ba>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jb     116f <interpol1D+0x6f>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12a7 <interpol1D+0x1a7>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     11b8 <interpol1D+0xb8>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12a2 <interpol1D+0x1a2>
jmp    11bd <interpol1D+0xbd>
mov    -0x38(%rbp),%ecx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x39(%rbp)
jge    11fc <interpol1D+0xfc>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    120c <interpol1D+0x10c>
jmp    121a <interpol1D+0x11a>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11bd <interpol1D+0xbd>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12a7 <interpol1D+0x1a7>
jmp    12ac <interpol1D+0x1ac>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    112a <interpol1D+0x2a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<interpol1D>:
push   %rbp
push   %rbx
test   %r9d,%r9d
jle    11c0 <interpol1D+0xc0>
add    $0xffffffff,%r8d
movslq %r8d,%r10
mov    %r9d,%r9d
xor    %r11d,%r11d
xor    %eax,%eax
jmp    1137 <interpol1D+0x37>
nopl   0x0(%rax)
movsd  (%rsi),%xmm0
movsd  %xmm0,(%rcx,%r11,8)
add    $0x1,%r11
cmp    %r9,%r11
je     11c0 <interpol1D+0xc0>
movsd  (%rdx,%r11,8),%xmm0
movsd  (%rdi),%xmm1
ucomisd %xmm0,%xmm1
jae    1120 <interpol1D+0x20>
ucomisd (%rdi,%r10,8),%xmm0
jae    1180 <interpol1D+0x80>
movslq %eax,%rbx
cmp    %r8d,%ebx
mov    %r8d,%ebp
cmovg  %ebx,%ebp
lea    -0x1(%rbx),%eax
xchg   %ax,%ax
cmp    %r10,%rbx
jge    1188 <interpol1D+0x88>
add    $0x1,%eax
ucomisd 0x8(%rdi,%rbx,8),%xmm0
lea    0x1(%rbx),%rbx
ja     1160 <interpol1D+0x60>
jmp    118a <interpol1D+0x8a>
cs nopw 0x0(%rax,%rax,1)
movsd  (%rsi,%r10,8),%xmm0
jmp    1124 <interpol1D+0x24>
mov    %ebp,%eax
movslq %eax,%rbx
movsd  (%rsi,%rbx,8),%xmm1
movsd  0x8(%rsi,%rbx,8),%xmm2
subsd  %xmm1,%xmm2
movsd  (%rdi,%rbx,8),%xmm3
movsd  0x8(%rdi,%rbx,8),%xmm4
subsd  %xmm3,%xmm4
divsd  %xmm4,%xmm2
subsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
jmp    1124 <interpol1D+0x24>
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define void @interpol1D(double* nocapture %0, double* nocapture %1, double* nocapture %2, double* nocapture writeonly %3, i32 %4, i32 %5) {
%7 = icmp sgt i32 %5, 0
br i1 %7, label %8, label %65
8: ; preds = %6
%9 = add i32 %4, -1
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds double, double* %0, i64 %10
%12 = getelementptr inbounds double, double* %1, i64 %10
%13 = zext i32 %5 to i64
br label %14
14: ; preds = %8, %59
%15 = phi i64 [ 0, %8 ], [ %63, %59 ]
%16 = phi i32 [ 0, %8 ], [ %61, %59 ]
%17 = getelementptr inbounds double, double* %2, i64 %15
%18 = load double, double* %17
%19 = load double, double* %0
%20 = fcmp ugt double %18, %19
br i1 %20, label %23, label %21
21: ; preds = %14
%22 = load double, double* %1
br label %59
23: ; preds = %14
%24 = load double, double* %11
%25 = fcmp ult double %18, %24
br i1 %25, label %26, label %29
26: ; preds = %23
%27 = sext i32 %16 to i64
%28 = call i32 @llvm.smax.i32(i32 %16, i32 %9)
br label %31
29: ; preds = %23
%30 = load double, double* %12
br label %59
31: ; preds = %26, %34
%32 = phi i64 [ %27, %26 ], [ %35, %34 ]
%33 = icmp slt i64 %32, %10
br i1 %33, label %34, label %41
34: ; preds = %31
%35 = add nsw i64 %32, 1
%36 = getelementptr inbounds double, double* %0, i64 %35
%37 = load double, double* %36
%38 = fcmp olt double %37, %18
br i1 %38, label %31, label %39
39: ; preds = %34
%40 = trunc i64 %32 to i32
br label %41
41: ; preds = %31, %39
%42 = phi i32 [ %40, %39 ], [ %28, %31 ]
%43 = add nsw i32 %42, 1
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds double, double* %1, i64 %44
%46 = load double, double* %45
%47 = sext i32 %42 to i64
%48 = getelementptr inbounds double, double* %1, i64 %47
%49 = load double, double* %48
%50 = fsub double %46, %49
%51 = getelementptr inbounds double, double* %0, i64 %44
%52 = load double, double* %51
%53 = getelementptr inbounds double, double* %0, i64 %47
%54 = load double, double* %53
%55 = fsub double %52, %54
%56 = fdiv double %50, %55
%57 = fsub double %18, %54
%58 = tail call double @llvm.fmuladd.f64(double %56, double %57, double %49)
br label %59
59: ; preds = %21, %41, %29
%60 = phi double [ %22, %21 ], [ %58, %41 ], [ %30, %29 ]
%61 = phi i32 [ %16, %21 ], [ %42, %41 ], [ %16, %29 ]
%62 = getelementptr inbounds double, double* %3, i64 %15
store double %60, double* %62
%63 = add nuw nsw i64 %15, 1
%64 = icmp eq i64 %63, %13
br i1 %64, label %65, label %14
65: ; preds = %59, %6
ret void
}