void hunt(double xx[], int n, double x, int *jlo) {
  int jm, jhi, inc, ascnd;
  ascnd = (xx[n] > xx[1]);
  if (*jlo <= 0 || *jlo > n) {
    *jlo = 0;
    jhi = n + 1;
  } else {
    inc = 1;
    if (x >= xx[*jlo] == ascnd) {
      if (*jlo == n)
        return;
      jhi = (*jlo) + 1;
      while (x >= xx[jhi] == ascnd) {
        *jlo = jhi;
        inc += inc;
        jhi = (*jlo) + inc;
        if (jhi > n) {
          jhi = n + 1;
          break;
        }
      }
    } else {
      if (*jlo == 1) {
        *jlo = 0;
        return;
      }
      jhi = (*jlo);
      *jlo -= 1;
      while (x < xx[*jlo] == ascnd) {
        jhi = (*jlo);
        inc += inc;
        *jlo = jhi - inc;
        if (*jlo < 1) {
          *jlo = 0;
          break;
        }
      }
    }
  }
  while (jhi - (*jlo) != 1) {
    jm = (jhi + (*jlo)) >> 1;
    if (x > xx[jm] == ascnd)
      *jlo = jm;
    else
      jhi = jm;
  }
}


x86 assembly (clang, -O0):
<hunt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
ucomisd 0x8(%rax),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
cmpl   $0x0,(%rax)
jle    1151 <hunt+0x51>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0xc(%rbp),%eax
jle    1169 <hunt+0x69>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    12be <hunt+0x1be>
movl   $0x1,-0x2c(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq (%rcx),%rcx
ucomisd (%rax,%rcx,8),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x30(%rbp),%eax
jne    121b <hunt+0x11b>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
cmp    -0xc(%rbp),%eax
jne    11aa <hunt+0xaa>
jmp    1320 <hunt+0x220>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x30(%rbp),%eax
jne    1216 <hunt+0x116>
mov    -0x28(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x2c(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    1211 <hunt+0x111>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1216 <hunt+0x116>
jmp    11b6 <hunt+0xb6>
jmp    12b9 <hunt+0x1b9>
mov    -0x20(%rbp),%rax
cmpl   $0x1,(%rax)
jne    1237 <hunt+0x137>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
jmp    1320 <hunt+0x220>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
sub    $0x1,%ecx
mov    %ecx,(%rax)
movsd  -0x18(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
movslq (%rcx),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x30(%rbp),%eax
jne    12b4 <hunt+0x1b4>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%ecx
sub    -0x2c(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
cmpl   $0x1,(%rax)
jge    12af <hunt+0x1af>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
jmp    12b4 <hunt+0x1b4>
jmp    124b <hunt+0x14b>
jmp    12b9 <hunt+0x1b9>
jmp    12be <hunt+0x1be>
jmp    12c3 <hunt+0x1c3>
mov    -0x28(%rbp),%eax
mov    -0x20(%rbp),%rcx
sub    (%rcx),%eax
cmp    $0x1,%eax
je     1320 <hunt+0x220>
mov    -0x28(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    (%rcx),%eax
sar    $0x1,%eax
mov    %eax,-0x24(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x30(%rbp),%eax
jne    1315 <hunt+0x215>
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
jmp    131b <hunt+0x21b>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    12c3 <hunt+0x1c3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<hunt>:
movslq %esi,%rax
movsd  (%rdi,%rax,8),%xmm1
movsd  0x8(%rdi),%xmm2
movslq (%rdx),%r8
test   %r8,%r8
jle    1190 <hunt+0x90>
cmp    %esi,%r8d
jg     1190 <hunt+0x90>
ucomisd %xmm2,%xmm1
seta   %al
mov    %r8d,%ecx
ucomisd (%rdi,%rcx,8),%xmm0
setb   %cl
cmp    %cl,%al
je     11e1 <hunt+0xe1>
cmp    %esi,%r8d
je     11aa <hunt+0xaa>
ucomisd %xmm2,%xmm1
seta   %r9b
ucomisd 0x8(%rdi,%r8,8),%xmm0
lea    0x1(%r8),%r10
setb   %al
cmp    %al,%r9b
je     124e <hunt+0x14e>
mov    $0x1,%r8d
xchg   %ax,%ax
mov    %r10d,%r11d
lea    (%r11,%r8,2),%r10d
cmp    %esi,%r10d
jg     125e <hunt+0x15e>
add    %r8d,%r8d
ucomisd %xmm2,%xmm1
seta   %r9b
movslq %r10d,%rcx
ucomisd (%rdi,%rcx,8),%xmm0
setb   %cl
cmp    %cl,%r9b
jne    1160 <hunt+0x60>
jmp    1246 <hunt+0x146>
movl   $0x0,(%rdx)
add    $0x1,%esi
xor    %r11d,%r11d
mov    %esi,%r10d
mov    %r10d,%ecx
sub    %r11d,%ecx
cmp    $0x1,%ecx
jne    11c0 <hunt+0xc0>
ret
nopl   0x0(%rax,%rax,1)
mov    %esi,(%rdx)
mov    %esi,%r11d
mov    %r10d,%eax
sub    %r11d,%eax
cmp    $0x1,%eax
je     11aa <hunt+0xaa>
ucomisd %xmm2,%xmm1
seta   %cl
lea    (%r11,%r10,1),%esi
sar    %esi
movslq %esi,%rax
ucomisd (%rdi,%rax,8),%xmm0
setbe  %al
cmp    %al,%cl
jne    11b0 <hunt+0xb0>
mov    %esi,%r10d
jmp    11b5 <hunt+0xb5>
cmp    $0x1,%r8d
jne    11ee <hunt+0xee>
movl   $0x0,(%rdx)
ret
ucomisd %xmm2,%xmm1
seta   %sil
lea    -0x1(%r8),%r11d
mov    %r11d,(%rdx)
movsd  (%rdi,%r11,8),%xmm3
ucomisd %xmm0,%xmm3
setbe  %cl
cmp    %cl,%sil
je     1256 <hunt+0x156>
mov    $0x1,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r11d,%r10d
add    %esi,%esi
sub    %esi,%r11d
jle    1269 <hunt+0x169>
ucomisd %xmm2,%xmm1
seta   %r8b
mov    %r11d,%ecx
movsd  (%rdi,%rcx,8),%xmm3
ucomisd %xmm0,%xmm3
setbe  %cl
cmp    %cl,%r8b
jne    1220 <hunt+0x120>
mov    %r11d,(%rdx)
jmp    119f <hunt+0x9f>
mov    %r8d,%r11d
jmp    119f <hunt+0x9f>
mov    %r8d,%r10d
jmp    119f <hunt+0x9f>
mov    %r11d,(%rdx)
add    $0x1,%esi
jmp    119c <hunt+0x9c>
movl   $0x0,(%rdx)
xor    %r11d,%r11d
jmp    119f <hunt+0x9f>

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

LLVM IR (-O2):
define void @hunt(double* nocapture %0, i32 %1, double %2, i32* nocapture %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds double, double* %0, i64 %5
%7 = load double, double* %6
%8 = getelementptr inbounds double, double* %0, i64 1
%9 = load double, double* %8
%10 = fcmp ogt double %7, %9
%11 = load i32, i32* %3
%12 = icmp slt i32 %11, 1
%13 = icmp sgt i32 %11, %1
%14 = or i1 %12, %13
br i1 %14, label %15, label %17
15: ; preds = %4
store i32 0, i32* %3
%16 = add nsw i32 %1, 1
br label %71
17: ; preds = %4
%18 = zext i32 %11 to i64
%19 = getelementptr inbounds double, double* %0, i64 %18
%20 = load double, double* %19
%21 = fcmp ugt double %20, %2
%22 = xor i1 %10, %21
br i1 %22, label %23, label %46
23: ; preds = %17
%24 = icmp eq i32 %11, %1
br i1 %24, label %92, label %25
25: ; preds = %23
%26 = add nuw nsw i32 %11, 1
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds double, double* %0, i64 %27
%29 = load double, double* %28
%30 = fcmp ugt double %29, %2
%31 = xor i1 %10, %30
br i1 %31, label %38, label %71
32: ; preds = %38
%33 = sext i32 %42 to i64
%34 = getelementptr inbounds double, double* %0, i64 %33
%35 = load double, double* %34
%36 = fcmp ugt double %35, %2
%37 = xor i1 %10, %36
br i1 %37, label %38, label %70
38: ; preds = %25, %32
%39 = phi i32 [ %42, %32 ], [ %26, %25 ]
%40 = phi i32 [ %41, %32 ], [ 1, %25 ]
%41 = shl nsw i32 %40, 1
%42 = add nsw i32 %39, %41
%43 = icmp sgt i32 %42, %1
br i1 %43, label %44, label %32
44: ; preds = %38
store i32 %39, i32* %3
%45 = add nsw i32 %1, 1
br label %71
46: ; preds = %17
%47 = icmp eq i32 %11, 1
br i1 %47, label %48, label %49
48: ; preds = %46
store i32 0, i32* %3
br label %92
49: ; preds = %46
%50 = add nsw i32 %11, -1
store i32 %50, i32* %3
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds double, double* %0, i64 %51
%53 = load double, double* %52
%54 = fcmp ule double %53, %2
%55 = xor i1 %10, %54
br i1 %55, label %62, label %71
56: ; preds = %62
%57 = zext i32 %66 to i64
%58 = getelementptr inbounds double, double* %0, i64 %57
%59 = load double, double* %58
%60 = fcmp ule double %59, %2
%61 = xor i1 %10, %60
br i1 %61, label %62, label %69
62: ; preds = %49, %56
%63 = phi i32 [ %65, %56 ], [ 1, %49 ]
%64 = phi i32 [ %66, %56 ], [ %50, %49 ]
%65 = shl nsw i32 %63, 1
%66 = sub nsw i32 %64, %65
%67 = icmp slt i32 %66, 1
br i1 %67, label %68, label %56
68: ; preds = %62
store i32 0, i32* %3
br label %71
69: ; preds = %56
store i32 %66, i32* %3
br label %71
70: ; preds = %32
store i32 %39, i32* %3
br label %71
71: ; preds = %70, %25, %49, %69, %44, %68, %15
%72 = phi i32 [ 0, %15 ], [ %39, %44 ], [ 0, %68 ], [ %66, %69 ], [ %50, %49 ], [ %11, %25 ], [ %39, %70 ]
%73 = phi i32 [ %16, %15 ], [ %45, %44 ], [ %64, %68 ], [ %64, %69 ], [ %11, %49 ], [ %26, %25 ], [ %42, %70 ]
%74 = sub nsw i32 %73, %72
%75 = icmp eq i32 %74, 1
br i1 %75, label %92, label %76
76: ; preds = %71, %87
%77 = phi i32 [ %89, %87 ], [ %73, %71 ]
%78 = phi i32 [ %88, %87 ], [ %72, %71 ]
%79 = add nsw i32 %78, %77
%80 = ashr i32 %79, 1
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds double, double* %0, i64 %81
%83 = load double, double* %82
%84 = fcmp uge double %83, %2
%85 = xor i1 %10, %84
br i1 %85, label %86, label %87
86: ; preds = %76
store i32 %80, i32* %3
br label %87
87: ; preds = %76, %86
%88 = phi i32 [ %80, %86 ], [ %78, %76 ]
%89 = phi i32 [ %77, %86 ], [ %80, %76 ]
%90 = sub nsw i32 %89, %88
%91 = icmp eq i32 %90, 1
br i1 %91, label %92, label %76
92: ; preds = %87, %71, %23, %48
ret void
}