void hunt(float xx[], int n, float 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)
movss  %xmm0,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0x4(%rax),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
jle    1150 <hunt+0x50>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
cmp    -0xc(%rbp),%eax
jle    1168 <hunt+0x68>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12ba <hunt+0x1ba>
movl   $0x1,-0x24(%rbp)
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq (%rcx),%rcx
ucomiss (%rax,%rcx,4),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x28(%rbp),%eax
jne    1218 <hunt+0x118>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
cmp    -0xc(%rbp),%eax
jne    11a8 <hunt+0xa8>
jmp    131b <hunt+0x21b>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x28(%rbp),%eax
jne    1213 <hunt+0x113>
mov    -0x20(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jle    120e <hunt+0x10e>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1213 <hunt+0x113>
jmp    11b4 <hunt+0xb4>
jmp    12b5 <hunt+0x1b5>
mov    -0x18(%rbp),%rax
cmpl   $0x1,(%rax)
jne    1234 <hunt+0x134>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    131b <hunt+0x21b>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
sub    $0x1,%ecx
mov    %ecx,(%rax)
movss  -0x10(%rbp),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq (%rcx),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x28(%rbp),%eax
jne    12b0 <hunt+0x1b0>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%ecx
sub    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
cmpl   $0x1,(%rax)
jge    12ab <hunt+0x1ab>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    12b0 <hunt+0x1b0>
jmp    1248 <hunt+0x148>
jmp    12b5 <hunt+0x1b5>
jmp    12ba <hunt+0x1ba>
jmp    12bf <hunt+0x1bf>
mov    -0x20(%rbp),%eax
mov    -0x18(%rbp),%rcx
sub    (%rcx),%eax
cmp    $0x1,%eax
je     131b <hunt+0x21b>
mov    -0x20(%rbp),%eax
mov    -0x18(%rbp),%rcx
add    (%rcx),%eax
sar    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movss  -0x10(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
cmp    -0x28(%rbp),%eax
jne    1310 <hunt+0x210>
mov    -0x1c(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    1316 <hunt+0x216>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    12bf <hunt+0x1bf>
pop    %rbp
ret

x86 assembly (clang, -O2):
<hunt>:
movslq %esi,%rax
movss  (%rdi,%rax,4),%xmm1
movss  0x4(%rdi),%xmm2
movslq (%rdx),%r8
test   %r8,%r8
jle    118e <hunt+0x8e>
cmp    %esi,%r8d
jg     118e <hunt+0x8e>
ucomiss %xmm2,%xmm1
seta   %al
mov    %r8d,%ecx
ucomiss (%rdi,%rcx,4),%xmm0
setb   %cl
cmp    %cl,%al
je     11df <hunt+0xdf>
cmp    %esi,%r8d
je     11a8 <hunt+0xa8>
ucomiss %xmm2,%xmm1
seta   %r9b
ucomiss 0x4(%rdi,%r8,4),%xmm0
lea    0x1(%r8),%r10
setb   %al
cmp    %al,%r9b
je     123c <hunt+0x13c>
mov    $0x1,%r8d
nopw   0x0(%rax,%rax,1)
mov    %r10d,%r11d
lea    (%r11,%r8,2),%r10d
cmp    %esi,%r10d
jg     124c <hunt+0x14c>
add    %r8d,%r8d
ucomiss %xmm2,%xmm1
seta   %r9b
movslq %r10d,%rcx
ucomiss (%rdi,%rcx,4),%xmm0
setb   %cl
cmp    %cl,%r9b
jne    1160 <hunt+0x60>
jmp    1234 <hunt+0x134>
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)
mov    %esi,(%rdx)
mov    %esi,%r11d
mov    %r10d,%eax
sub    %r11d,%eax
cmp    $0x1,%eax
je     11a8 <hunt+0xa8>
ucomiss %xmm2,%xmm1
seta   %cl
lea    (%r11,%r10,1),%esi
sar    %esi
movslq %esi,%rax
ucomiss (%rdi,%rax,4),%xmm0
setbe  %al
cmp    %al,%cl
jne    11b0 <hunt+0xb0>
mov    %esi,%r10d
jmp    11b5 <hunt+0xb5>
cmp    $0x1,%r8d
jne    11ec <hunt+0xec>
movl   $0x0,(%rdx)
ret
ucomiss %xmm2,%xmm1
seta   %sil
lea    -0x1(%r8),%r11d
mov    %r11d,(%rdx)
movss  (%rdi,%r11,4),%xmm3
ucomiss %xmm0,%xmm3
setbe  %cl
cmp    %cl,%sil
je     1244 <hunt+0x144>
mov    $0x1,%esi
mov    %r11d,%r10d
add    %esi,%esi
sub    %esi,%r11d
jle    1257 <hunt+0x157>
ucomiss %xmm2,%xmm1
seta   %r8b
mov    %r11d,%ecx
movss  (%rdi,%rcx,4),%xmm3
ucomiss %xmm0,%xmm3
setbe  %cl
cmp    %cl,%r8b
jne    1210 <hunt+0x110>
mov    %r11d,(%rdx)
jmp    119d <hunt+0x9d>
mov    %r8d,%r11d
jmp    119d <hunt+0x9d>
mov    %r8d,%r10d
jmp    119d <hunt+0x9d>
mov    %r11d,(%rdx)
add    $0x1,%esi
jmp    119a <hunt+0x9a>
movl   $0x0,(%rdx)
xor    %r11d,%r11d
jmp    119d <hunt+0x9d>

LLVM IR (-O0):
define void @hunt(float* %0, i32 %1, float %2, i32* %3) {
%5 = alloca float*
%6 = alloca i32
%7 = alloca float
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store float* %0, float** %5
store i32 %1, i32* %6
store float %2, float* %7
store i32* %3, i32** %8
%13 = load float*, float** %5
%14 = load i32, i32* %6
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds float, float* %13, i64 %15
%17 = load float, float* %16
%18 = load float*, float** %5
%19 = getelementptr inbounds float, float* %18, i64 1
%20 = load float, float* %19
%21 = fcmp ogt float %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 float, float* %7
%37 = load float*, float** %5
%38 = load i32*, i32** %8
%39 = load i32, i32* %38
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds float, float* %37, i64 %40
%42 = load float, float* %41
%43 = fcmp oge float %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 float, float* %7
%59 = load float*, float** %5
%60 = load i32, i32* %10
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds float, float* %59, i64 %61
%63 = load float, float* %62
%64 = fcmp oge float %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 float, float* %7
%100 = load float*, float** %5
%101 = load i32*, i32** %8
%102 = load i32, i32* %101
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds float, float* %100, i64 %103
%105 = load float, float* %104
%106 = fcmp olt float %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 float, float* %7
%142 = load float*, float** %5
%143 = load i32, i32* %9
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds float, float* %142, i64 %144
%146 = load float, float* %145
%147 = fcmp ogt float %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(float* nocapture %0, i32 %1, float %2, i32* nocapture %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds float, float* %0, i64 %5
%7 = load float, float* %6
%8 = getelementptr inbounds float, float* %0, i64 1
%9 = load float, float* %8
%10 = fcmp ogt float %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 float, float* %0, i64 %18
%20 = load float, float* %19
%21 = fcmp ugt float %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 float, float* %0, i64 %27
%29 = load float, float* %28
%30 = fcmp ugt float %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 float, float* %0, i64 %33
%35 = load float, float* %34
%36 = fcmp ugt float %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 float, float* %0, i64 %51
%53 = load float, float* %52
%54 = fcmp ule float %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 float, float* %0, i64 %57
%59 = load float, float* %58
%60 = fcmp ule float %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 float, float* %0, i64 %81
%83 = load float, float* %82
%84 = fcmp uge float %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
}