void hl_index(int *kmax, int *kmin, double pmax, double pmin, long nhlevs,
              double *pph) {
  long k;
  long MaxLev, MinLev;
  for (k = 0; k < nhlevs; k++)
    if (pph[k] > pmax)
      break;
  MaxLev = k - 1;
  for (k = nhlevs - 1; k >= 0; k--)
    if (pph[k] < pmin)
      break;
  MinLev = k;
  *kmax = MaxLev;
  *kmin = MinLev;
}


x86 assembly (clang, -O0):
<hl_index>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x28(%rbp),%rax
jge    1167 <hl_index+0x67>
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1151 <hl_index+0x51>
jmp    1167 <hl_index+0x67>
jmp    1156 <hl_index+0x56>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1126 <hl_index+0x26>
mov    -0x38(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jl     11c1 <hl_index+0xc1>
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11ab <hl_index+0xab>
jmp    11c1 <hl_index+0xc1>
jmp    11b0 <hl_index+0xb0>
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    117f <hl_index+0x7f>
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x40(%rbp),%rax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x48(%rbp),%rax
mov    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<hl_index>:
xor    %r9d,%r9d
test   %rdx,%rdx
jle    1128 <hl_index+0x28>
nopl   0x0(%rax,%rax,1)
movsd  (%rcx,%r9,8),%xmm2
ucomisd %xmm0,%xmm2
ja     1128 <hl_index+0x28>
add    $0x1,%r9
cmp    %r9,%rdx
jne    1110 <hl_index+0x10>
mov    %rdx,%r9
xor    %r8d,%r8d
test   %rdx,%rdx
cmovs  %rdx,%r8
add    $0xffffffffffffffff,%r8
cs nopw 0x0(%rax,%rax,1)
test   %rdx,%rdx
jle    1156 <hl_index+0x56>
lea    -0x1(%rdx),%rax
ucomisd -0x8(%rcx,%rdx,8),%xmm1
mov    %rax,%rdx
jbe    1140 <hl_index+0x40>
jmp    1159 <hl_index+0x59>
mov    %r8,%rax
add    $0xffffffff,%r9d
mov    %r9d,(%rdi)
mov    %eax,(%rsi)
ret

LLVM IR (-O0):
define void @hl_index(i32* %0, i32* %1, double %2, double %3, i64 %4, double* %5) {
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca double
%10 = alloca double
%11 = alloca i64
%12 = alloca double*
%13 = alloca i64
%14 = alloca i64
%15 = alloca i64
store i32* %0, i32** %7
store i32* %1, i32** %8
store double %2, double* %9
store double %3, double* %10
store i64 %4, i64* %11
store double* %5, double** %12
store i64 0, i64* %13
br label %16
16: ; preds = %29, %6
%17 = load i64, i64* %13
%18 = load i64, i64* %11
%19 = icmp slt i64 %17, %18
br i1 %19, label %20, label %32
20: ; preds = %16
%21 = load double*, double** %12
%22 = load i64, i64* %13
%23 = getelementptr inbounds double, double* %21, i64 %22
%24 = load double, double* %23
%25 = load double, double* %9
%26 = fcmp ogt double %24, %25
br i1 %26, label %27, label %28
27: ; preds = %20
br label %32
28: ; preds = %20
br label %29
29: ; preds = %28
%30 = load i64, i64* %13
%31 = add nsw i64 %30, 1
store i64 %31, i64* %13
br label %16
32: ; preds = %27, %16
%33 = load i64, i64* %13
%34 = sub nsw i64 %33, 1
store i64 %34, i64* %14
%35 = load i64, i64* %11
%36 = sub nsw i64 %35, 1
store i64 %36, i64* %13
br label %37
37: ; preds = %49, %32
%38 = load i64, i64* %13
%39 = icmp sge i64 %38, 0
br i1 %39, label %40, label %52
40: ; preds = %37
%41 = load double*, double** %12
%42 = load i64, i64* %13
%43 = getelementptr inbounds double, double* %41, i64 %42
%44 = load double, double* %43
%45 = load double, double* %10
%46 = fcmp olt double %44, %45
br i1 %46, label %47, label %48
47: ; preds = %40
br label %52
48: ; preds = %40
br label %49
49: ; preds = %48
%50 = load i64, i64* %13
%51 = add nsw i64 %50, -1
store i64 %51, i64* %13
br label %37
52: ; preds = %47, %37
%53 = load i64, i64* %13
store i64 %53, i64* %15
%54 = load i64, i64* %14
%55 = trunc i64 %54 to i32
%56 = load i32*, i32** %7
store i32 %55, i32* %56
%57 = load i64, i64* %15
%58 = trunc i64 %57 to i32
%59 = load i32*, i32** %8
store i32 %58, i32* %59
ret void
}

LLVM IR (-O2):
define void @hl_index(i32* nocapture writeonly %0, i32* nocapture writeonly %1, double %2, double %3, i64 %4, double* nocapture %5) {
%7 = icmp sgt i64 %4, 0
br i1 %7, label %8, label %16
8: ; preds = %6, %13
%9 = phi i64 [ %14, %13 ], [ 0, %6 ]
%10 = getelementptr inbounds double, double* %5, i64 %9
%11 = load double, double* %10
%12 = fcmp ogt double %11, %2
br i1 %12, label %16, label %13
13: ; preds = %8
%14 = add nuw nsw i64 %9, 1
%15 = icmp eq i64 %14, %4
br i1 %15, label %16, label %8
16: ; preds = %13, %8, %6
%17 = phi i64 [ 0, %6 ], [ %9, %8 ], [ %4, %13 ]
%18 = call i64 @llvm.smin.i64(i64 %4, i64 0)
%19 = add i64 %18, -1
br label %20
20: ; preds = %24, %16
%21 = phi i64 [ %4, %16 ], [ %22, %24 ]
%22 = add nsw i64 %21, -1
%23 = icmp sgt i64 %21, 0
br i1 %23, label %24, label %28
24: ; preds = %20
%25 = getelementptr inbounds double, double* %5, i64 %22
%26 = load double, double* %25
%27 = fcmp olt double %26, %3
br i1 %27, label %28, label %20
28: ; preds = %24, %20
%29 = phi i64 [ %22, %24 ], [ %19, %20 ]
%30 = trunc i64 %17 to i32
%31 = add i32 %30, -1
store i32 %31, i32* %0
%32 = trunc i64 %29 to i32
store i32 %32, i32* %1
ret void
}