double lev2gr(double *vals, double lev) {
  int i, num;
  double gr;
  num = (int)(*vals + 0.1);
  for (i = 1; i < num; i++) {
    if ((lev >= *(vals + i) && lev <= *(vals + i + 1)) ||
        (lev <= *(vals + i) && lev >= *(vals + i + 1))) {
      gr = (double)i + (lev - *(vals + i)) / (*(vals + i + 1) - *(vals + i));
      return (gr);
    }
  }
  if (*(vals + 1) < *(vals + num)) {
    if (lev < *(vals + 1)) {
      gr = 1.0 + ((lev - *(vals + 1)) / (*(vals + 2) - *(vals + 1)));
      return (gr);
    }
    gr = (double)i + ((lev - *(vals + i)) / (*(vals + i) - *(vals + i - 1)));
    return (gr);
  } else {
    if (lev > *(vals + 1)) {
      gr = 1.0 + ((lev - *(vals + 1)) / (*(vals + 2) - *(vals + 1)));
      return (gr);
    }
    gr = (double)i + ((lev - *(vals + i)) / (*(vals + i) - *(vals + i - 1)));
    return (gr);
  }
}


x86 assembly (clang, -O0):
<lev2gr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsd  0xee7(%rip),%xmm0
addsd  (%rax),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1202 <lev2gr+0x102>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     116c <lev2gr+0x6c>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jae    11a1 <lev2gr+0xa1>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jb     11ef <lev2gr+0xef>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomisd 0x8(%rax,%rcx,8),%xmm0
jb     11ef <lev2gr+0xef>
cvtsi2sdl -0x1c(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  0x8(%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    136d <lev2gr+0x26d>
jmp    11f4 <lev2gr+0xf4>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112b <lev2gr+0x2b>
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    12cc <lev2gr+0x1cc>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    127e <lev2gr+0x17e>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
subsd  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x8(%rax),%xmm0
divsd  %xmm0,%xmm1
movsd  0xda2(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    136d <lev2gr+0x26d>
cvtsi2sdl -0x1c(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  -0x8(%rax,%rcx,8),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    136d <lev2gr+0x26d>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
ucomisd 0x8(%rax),%xmm0
jbe    1324 <lev2gr+0x224>
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
subsd  0x8(%rax),%xmm1
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x8(%rax),%xmm0
divsd  %xmm0,%xmm1
movsd  0xcfc(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    136d <lev2gr+0x26d>
cvtsi2sdl -0x1c(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
subsd  -0x8(%rax,%rcx,8),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<lev2gr>:
movsd  (%rdi),%xmm1
addsd  0xef4(%rip),%xmm1
cvttsd2si %xmm1,%eax
mov    $0x1,%ecx
cmp    $0x2,%eax
jl     1179 <lev2gr+0x79>
mov    %eax,%edx
mov    $0x1,%ecx
jmp    1139 <lev2gr+0x39>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rcx
cmp    %rcx,%rdx
je     1177 <lev2gr+0x77>
movsd  (%rdi,%rcx,8),%xmm1
ucomisd %xmm1,%xmm0
jb     1150 <lev2gr+0x50>
movsd  0x8(%rdi,%rcx,8),%xmm2
ucomisd %xmm0,%xmm2
jae    1162 <lev2gr+0x62>
ucomisd %xmm0,%xmm1
jb     1130 <lev2gr+0x30>
movsd  0x8(%rdi,%rcx,8),%xmm2
ucomisd %xmm2,%xmm0
jb     1130 <lev2gr+0x30>
cvtsi2sd %ecx,%xmm3
subsd  %xmm1,%xmm0
subsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm3,%xmm0
ret
mov    %eax,%ecx
movsd  0x8(%rdi),%xmm1
cltq
movsd  (%rdi,%rax,8),%xmm2
ucomisd %xmm1,%xmm2
jbe    11ab <lev2gr+0xab>
ucomisd %xmm0,%xmm1
jbe    11b1 <lev2gr+0xb1>
subsd  %xmm1,%xmm0
movsd  0x10(%rdi),%xmm2
subsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
addsd  0xe5e(%rip),%xmm0
ret
ucomisd %xmm1,%xmm0
ja     1191 <lev2gr+0x91>
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
mov    %ecx,%eax
movsd  (%rdi,%rax,8),%xmm2
subsd  %xmm2,%xmm0
subsd  -0x8(%rdi,%rax,8),%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @lev2gr(double* %0, double %1) {
%3 = alloca double
%4 = alloca double*
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
store double* %0, double** %4
store double %1, double* %5
%9 = load double*, double** %4
%10 = load double, double* %9
%11 = fadd double %10, 1.000000e-01
%12 = fptosi double %11 to i32
store i32 %12, i32* %7
store i32 1, i32* %6
br label %13
13: ; preds = %77, %2
%14 = load i32, i32* %6
%15 = load i32, i32* %7
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %80
17: ; preds = %13
%18 = load double, double* %5
%19 = load double*, double** %4
%20 = load i32, i32* %6
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds double, double* %19, i64 %21
%23 = load double, double* %22
%24 = fcmp oge double %18, %23
br i1 %24, label %25, label %34
25: ; preds = %17
%26 = load double, double* %5
%27 = load double*, double** %4
%28 = load i32, i32* %6
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds double, double* %27, i64 %29
%31 = getelementptr inbounds double, double* %30, i64 1
%32 = load double, double* %31
%33 = fcmp ole double %26, %32
br i1 %33, label %51, label %34
34: ; preds = %25, %17
%35 = load double, double* %5
%36 = load double*, double** %4
%37 = load i32, i32* %6
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double, double* %36, i64 %38
%40 = load double, double* %39
%41 = fcmp ole double %35, %40
br i1 %41, label %42, label %76
42: ; preds = %34
%43 = load double, double* %5
%44 = load double*, double** %4
%45 = load i32, i32* %6
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %44, i64 %46
%48 = getelementptr inbounds double, double* %47, i64 1
%49 = load double, double* %48
%50 = fcmp oge double %43, %49
br i1 %50, label %51, label %76
51: ; preds = %42, %25
%52 = load i32, i32* %6
%53 = sitofp i32 %52 to double
%54 = load double, double* %5
%55 = load double*, double** %4
%56 = load i32, i32* %6
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %55, i64 %57
%59 = load double, double* %58
%60 = fsub double %54, %59
%61 = load double*, double** %4
%62 = load i32, i32* %6
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds double, double* %61, i64 %63
%65 = getelementptr inbounds double, double* %64, i64 1
%66 = load double, double* %65
%67 = load double*, double** %4
%68 = load i32, i32* %6
%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 = fdiv double %60, %72
%74 = fadd double %53, %73
store double %74, double* %8
%75 = load double, double* %8
store double %75, double* %3
br label %184
76: ; preds = %42, %34
br label %77
77: ; preds = %76
%78 = load i32, i32* %6
%79 = add nsw i32 %78, 1
store i32 %79, i32* %6
br label %13
80: ; preds = %13
%81 = load double*, double** %4
%82 = getelementptr inbounds double, double* %81, i64 1
%83 = load double, double* %82
%84 = load double*, double** %4
%85 = load i32, i32* %7
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds double, double* %84, i64 %86
%88 = load double, double* %87
%89 = fcmp olt double %83, %88
br i1 %89, label %90, label %137
90: ; preds = %80
%91 = load double, double* %5
%92 = load double*, double** %4
%93 = getelementptr inbounds double, double* %92, i64 1
%94 = load double, double* %93
%95 = fcmp olt double %91, %94
br i1 %95, label %96, label %112
96: ; preds = %90
%97 = load double, double* %5
%98 = load double*, double** %4
%99 = getelementptr inbounds double, double* %98, i64 1
%100 = load double, double* %99
%101 = fsub double %97, %100
%102 = load double*, double** %4
%103 = getelementptr inbounds double, double* %102, i64 2
%104 = load double, double* %103
%105 = load double*, double** %4
%106 = getelementptr inbounds double, double* %105, i64 1
%107 = load double, double* %106
%108 = fsub double %104, %107
%109 = fdiv double %101, %108
%110 = fadd double 1.000000e+00, %109
store double %110, double* %8
%111 = load double, double* %8
store double %111, double* %3
br label %184
112: ; preds = %90
%113 = load i32, i32* %6
%114 = sitofp i32 %113 to double
%115 = load double, double* %5
%116 = load double*, double** %4
%117 = load i32, i32* %6
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds double, double* %116, i64 %118
%120 = load double, double* %119
%121 = fsub double %115, %120
%122 = load double*, double** %4
%123 = load i32, i32* %6
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds double, double* %122, i64 %124
%126 = load double, double* %125
%127 = load double*, double** %4
%128 = load i32, i32* %6
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %127, i64 %129
%131 = getelementptr inbounds double, double* %130, i64 -1
%132 = load double, double* %131
%133 = fsub double %126, %132
%134 = fdiv double %121, %133
%135 = fadd double %114, %134
store double %135, double* %8
%136 = load double, double* %8
store double %136, double* %3
br label %184
137: ; preds = %80
%138 = load double, double* %5
%139 = load double*, double** %4
%140 = getelementptr inbounds double, double* %139, i64 1
%141 = load double, double* %140
%142 = fcmp ogt double %138, %141
br i1 %142, label %143, label %159
143: ; preds = %137
%144 = load double, double* %5
%145 = load double*, double** %4
%146 = getelementptr inbounds double, double* %145, i64 1
%147 = load double, double* %146
%148 = fsub double %144, %147
%149 = load double*, double** %4
%150 = getelementptr inbounds double, double* %149, i64 2
%151 = load double, double* %150
%152 = load double*, double** %4
%153 = getelementptr inbounds double, double* %152, i64 1
%154 = load double, double* %153
%155 = fsub double %151, %154
%156 = fdiv double %148, %155
%157 = fadd double 1.000000e+00, %156
store double %157, double* %8
%158 = load double, double* %8
store double %158, double* %3
br label %184
159: ; preds = %137
%160 = load i32, i32* %6
%161 = sitofp i32 %160 to double
%162 = load double, double* %5
%163 = load double*, double** %4
%164 = load i32, i32* %6
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds double, double* %163, i64 %165
%167 = load double, double* %166
%168 = fsub double %162, %167
%169 = load double*, double** %4
%170 = load i32, i32* %6
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds double, double* %169, i64 %171
%173 = load double, double* %172
%174 = load double*, double** %4
%175 = load i32, i32* %6
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds double, double* %174, i64 %176
%178 = getelementptr inbounds double, double* %177, i64 -1
%179 = load double, double* %178
%180 = fsub double %173, %179
%181 = fdiv double %168, %180
%182 = fadd double %161, %181
store double %182, double* %8
%183 = load double, double* %8
store double %183, double* %3
br label %184
184: ; preds = %159, %143, %112, %96, %51
%185 = load double, double* %3
ret double %185
}

LLVM IR (-O2):
define double @lev2gr(double* nocapture %0, double %1) {
%3 = load double, double* %0
%4 = fadd double %3, 1.000000e-01
%5 = fptosi double %4 to i32
%6 = icmp sgt i32 %5, 1
br i1 %6, label %7, label %35
7: ; preds = %2
%8 = zext i32 %5 to i64
br label %9
9: ; preds = %7, %32
%10 = phi i64 [ 1, %7 ], [ %33, %32 ]
%11 = getelementptr inbounds double, double* %0, i64 %10
%12 = load double, double* %11
%13 = fcmp ugt double %12, %1
br i1 %13, label %18, label %14
14: ; preds = %9
%15 = getelementptr inbounds double, double* %11, i64 1
%16 = load double, double* %15
%17 = fcmp ult double %16, %1
br i1 %17, label %18, label %24
18: ; preds = %14, %9
%19 = fcmp ult double %12, %1
br i1 %19, label %32, label %20
20: ; preds = %18
%21 = getelementptr inbounds double, double* %11, i64 1
%22 = load double, double* %21
%23 = fcmp ugt double %22, %1
br i1 %23, label %32, label %24
24: ; preds = %20, %14
%25 = phi double [ %22, %20 ], [ %16, %14 ]
%26 = trunc i64 %10 to i32
%27 = sitofp i32 %26 to double
%28 = fsub double %1, %12
%29 = fsub double %25, %12
%30 = fdiv double %28, %29
%31 = fadd double %30, %27
br label %83
32: ; preds = %18, %20
%33 = add nuw nsw i64 %10, 1
%34 = icmp eq i64 %33, %8
br i1 %34, label %35, label %9
35: ; preds = %32, %2
%36 = phi i32 [ 1, %2 ], [ %5, %32 ]
%37 = getelementptr inbounds double, double* %0, i64 1
%38 = load double, double* %37
%39 = sext i32 %5 to i64
%40 = getelementptr inbounds double, double* %0, i64 %39
%41 = load double, double* %40
%42 = fcmp olt double %38, %41
br i1 %42, label %43, label %63
43: ; preds = %35
%44 = fcmp ogt double %38, %1
br i1 %44, label %45, label %52
45: ; preds = %43
%46 = fsub double %1, %38
%47 = getelementptr inbounds double, double* %0, i64 2
%48 = load double, double* %47
%49 = fsub double %48, %38
%50 = fdiv double %46, %49
%51 = fadd double %50, 1.000000e+00
br label %83
52: ; preds = %43
%53 = sitofp i32 %36 to double
%54 = zext i32 %36 to i64
%55 = getelementptr inbounds double, double* %0, i64 %54
%56 = load double, double* %55
%57 = fsub double %1, %56
%58 = getelementptr inbounds double, double* %55, i64 -1
%59 = load double, double* %58
%60 = fsub double %56, %59
%61 = fdiv double %57, %60
%62 = fadd double %61, %53
br label %83
63: ; preds = %35
%64 = fcmp olt double %38, %1
br i1 %64, label %65, label %72
65: ; preds = %63
%66 = fsub double %1, %38
%67 = getelementptr inbounds double, double* %0, i64 2
%68 = load double, double* %67
%69 = fsub double %68, %38
%70 = fdiv double %66, %69
%71 = fadd double %70, 1.000000e+00
br label %83
72: ; preds = %63
%73 = sitofp i32 %36 to double
%74 = zext i32 %36 to i64
%75 = getelementptr inbounds double, double* %0, i64 %74
%76 = load double, double* %75
%77 = fsub double %1, %76
%78 = getelementptr inbounds double, double* %75, i64 -1
%79 = load double, double* %78
%80 = fsub double %76, %79
%81 = fdiv double %77, %80
%82 = fadd double %81, %73
br label %83
83: ; preds = %72, %65, %52, %45, %24
%84 = phi double [ %31, %24 ], [ %51, %45 ], [ %62, %52 ], [ %71, %65 ], [ %82, %72 ]
ret double %84
}