long Search_GTI(double evtTime, long nGTI, double *start, double *stop,
                int ordered) {
  long gti, step;
  if (ordered && nGTI > 15) {
    if (evtTime >= start[0] && evtTime <= stop[nGTI - 1]) {
      gti = step = (nGTI >> 1);
      while (1) {
        if (step > 1L)
          step >>= 1;
        if (evtTime > stop[gti]) {
          if (evtTime >= start[gti + 1])
            gti += step;
          else {
            gti = -1L;
            break;
          }
        } else if (evtTime < start[gti]) {
          if (evtTime <= stop[gti - 1])
            gti -= step;
          else {
            gti = -1L;
            break;
          }
        } else {
          break;
        }
      }
    } else
      gti = -1L;
  } else {
    gti = nGTI;
    while (gti--)
      if (evtTime >= start[gti] && evtTime <= stop[gti])
        break;
  }
  return (gti);
}


x86 assembly (clang, -O0):
<Search_GTI>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
je     125e <Search_GTI+0x15e>
cmpq   $0xf,-0x10(%rbp)
jle    125e <Search_GTI+0x15e>
movsd  -0x8(%rbp),%xmm0
mov    -0x18(%rbp),%rax
ucomisd (%rax),%xmm0
jb     1251 <Search_GTI+0x151>
movsd  -0x8(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jb     1251 <Search_GTI+0x151>
mov    -0x10(%rbp),%rax
sar    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    %rax,-0x30(%rbp)
cmpq   $0x1,-0x38(%rbp)
jle    1187 <Search_GTI+0x87>
mov    -0x38(%rbp),%rax
sar    $0x1,%rax
mov    %rax,-0x38(%rbp)
movsd  -0x8(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    11db <Search_GTI+0xdb>
movsd  -0x8(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
ucomisd 0x8(%rax,%rcx,8),%xmm0
jb     11c9 <Search_GTI+0xc9>
mov    -0x38(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    11d6 <Search_GTI+0xd6>
movq   $0xffffffffffffffff,-0x30(%rbp)
ff
jmp    124c <Search_GTI+0x14c>
jmp    1247 <Search_GTI+0x147>
movsd  -0x8(%rbp),%xmm1
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    123d <Search_GTI+0x13d>
movsd  -0x8(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jb     122b <Search_GTI+0x12b>
mov    -0x38(%rbp),%rcx
mov    -0x30(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    1238 <Search_GTI+0x138>
movq   $0xffffffffffffffff,-0x30(%rbp)
ff
jmp    124c <Search_GTI+0x14c>
jmp    1242 <Search_GTI+0x142>
jmp    124c <Search_GTI+0x14c>
jmp    1247 <Search_GTI+0x147>
jmp    1170 <Search_GTI+0x70>
jmp    1259 <Search_GTI+0x159>
movq   $0xffffffffffffffff,-0x30(%rbp)
ff
jmp    12c2 <Search_GTI+0x1c2>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x30(%rbp)
cmp    $0x0,%rax
je     12bd <Search_GTI+0x1bd>
movsd  -0x8(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jb     12b8 <Search_GTI+0x1b8>
movsd  -0x8(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jb     12b8 <Search_GTI+0x1b8>
jmp    12bd <Search_GTI+0x1bd>
jmp    1266 <Search_GTI+0x166>
jmp    12c2 <Search_GTI+0x1c2>
mov    -0x30(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Search_GTI>:
cmp    $0x10,%rdi
jl     116c <Search_GTI+0x6c>
test   %ecx,%ecx
je     116c <Search_GTI+0x6c>
mov    $0xffffffffffffffff,%rax
ucomisd (%rsi),%xmm0
jb     119b <Search_GTI+0x9b>
movsd  -0x8(%rdx,%rdi,8),%xmm1
ucomisd %xmm0,%xmm1
jb     119b <Search_GTI+0x9b>
shr    %rdi
mov    %rdi,%r8
nopl   (%rax)
cmp    $0x2,%r8
setae  %cl
shr    %cl,%r8
ucomisd (%rdx,%rdi,8),%xmm0
jbe    1150 <Search_GTI+0x50>
ucomisd 0x8(%rsi,%rdi,8),%xmm0
jb     119b <Search_GTI+0x9b>
add    %r8,%rdi
jmp    1130 <Search_GTI+0x30>
xchg   %ax,%ax
movsd  (%rsi,%rdi,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    1198 <Search_GTI+0x98>
movsd  -0x8(%rdx,%rdi,8),%xmm1
ucomisd %xmm0,%xmm1
jb     119b <Search_GTI+0x9b>
sub    %r8,%rdi
jmp    1130 <Search_GTI+0x30>
mov    $0xffffffffffffffff,%rax
test   %rdi,%rdi
je     119b <Search_GTI+0x9b>
add    $0xffffffffffffffff,%rdi
jmp    1186 <Search_GTI+0x86>
xchg   %ax,%ax
add    $0xffffffffffffffff,%rdi
jae    119b <Search_GTI+0x9b>
ucomisd (%rsi,%rdi,8),%xmm0
jb     1180 <Search_GTI+0x80>
movsd  (%rdx,%rdi,8),%xmm1
ucomisd %xmm0,%xmm1
jb     1180 <Search_GTI+0x80>
mov    %rdi,%rax
ret

LLVM IR (-O0):
define i64 @Search_GTI(double %0, i64 %1, double* %2, double* %3, i32 %4) {
%6 = alloca double
%7 = alloca i64
%8 = alloca double*
%9 = alloca double*
%10 = alloca i32
%11 = alloca i64
%12 = alloca i64
store double %0, double* %6
store i64 %1, i64* %7
store double* %2, double** %8
store double* %3, double** %9
store i32 %4, i32* %10
%13 = load i32, i32* %10
%14 = icmp ne i32 %13, 0
br i1 %14, label %15, label %89
15: ; preds = %5
%16 = load i64, i64* %7
%17 = icmp sgt i64 %16, 15
br i1 %17, label %18, label %89
18: ; preds = %15
%19 = load double, double* %6
%20 = load double*, double** %8
%21 = getelementptr inbounds double, double* %20, i64 0
%22 = load double, double* %21
%23 = fcmp oge double %19, %22
br i1 %23, label %24, label %87
24: ; preds = %18
%25 = load double, double* %6
%26 = load double*, double** %9
%27 = load i64, i64* %7
%28 = sub nsw i64 %27, 1
%29 = getelementptr inbounds double, double* %26, i64 %28
%30 = load double, double* %29
%31 = fcmp ole double %25, %30
br i1 %31, label %32, label %87
32: ; preds = %24
%33 = load i64, i64* %7
%34 = ashr i64 %33, 1
store i64 %34, i64* %12
store i64 %34, i64* %11
br label %35
35: ; preds = %32, %85
%36 = load i64, i64* %12
%37 = icmp sgt i64 %36, 1
br i1 %37, label %38, label %41
38: ; preds = %35
%39 = load i64, i64* %12
%40 = ashr i64 %39, 1
store i64 %40, i64* %12
br label %41
41: ; preds = %38, %35
%42 = load double, double* %6
%43 = load double*, double** %9
%44 = load i64, i64* %11
%45 = getelementptr inbounds double, double* %43, i64 %44
%46 = load double, double* %45
%47 = fcmp ogt double %42, %46
br i1 %47, label %48, label %62
48: ; preds = %41
%49 = load double, double* %6
%50 = load double*, double** %8
%51 = load i64, i64* %11
%52 = add nsw i64 %51, 1
%53 = getelementptr inbounds double, double* %50, i64 %52
%54 = load double, double* %53
%55 = fcmp oge double %49, %54
br i1 %55, label %56, label %60
56: ; preds = %48
%57 = load i64, i64* %12
%58 = load i64, i64* %11
%59 = add nsw i64 %58, %57
store i64 %59, i64* %11
br label %61
60: ; preds = %48
store i64 -1, i64* %11
br label %86
61: ; preds = %56
br label %85
62: ; preds = %41
%63 = load double, double* %6
%64 = load double*, double** %8
%65 = load i64, i64* %11
%66 = getelementptr inbounds double, double* %64, i64 %65
%67 = load double, double* %66
%68 = fcmp olt double %63, %67
br i1 %68, label %69, label %83
69: ; preds = %62
%70 = load double, double* %6
%71 = load double*, double** %9
%72 = load i64, i64* %11
%73 = sub nsw i64 %72, 1
%74 = getelementptr inbounds double, double* %71, i64 %73
%75 = load double, double* %74
%76 = fcmp ole double %70, %75
br i1 %76, label %77, label %81
77: ; preds = %69
%78 = load i64, i64* %12
%79 = load i64, i64* %11
%80 = sub nsw i64 %79, %78
store i64 %80, i64* %11
br label %82
81: ; preds = %69
store i64 -1, i64* %11
br label %86
82: ; preds = %77
br label %84
83: ; preds = %62
br label %86
84: ; preds = %82
br label %85
85: ; preds = %84, %61
br label %35
86: ; preds = %83, %81, %60
br label %88
87: ; preds = %24, %18
store i64 -1, i64* %11
br label %88
88: ; preds = %87, %86
br label %112
89: ; preds = %15, %5
%90 = load i64, i64* %7
store i64 %90, i64* %11
br label %91
91: ; preds = %110, %89
%92 = load i64, i64* %11
%93 = add nsw i64 %92, -1
store i64 %93, i64* %11
%94 = icmp ne i64 %92, 0
br i1 %94, label %95, label %111
95: ; preds = %91
%96 = load double, double* %6
%97 = load double*, double** %8
%98 = load i64, i64* %11
%99 = getelementptr inbounds double, double* %97, i64 %98
%100 = load double, double* %99
%101 = fcmp oge double %96, %100
br i1 %101, label %102, label %110
102: ; preds = %95
%103 = load double, double* %6
%104 = load double*, double** %9
%105 = load i64, i64* %11
%106 = getelementptr inbounds double, double* %104, i64 %105
%107 = load double, double* %106
%108 = fcmp ole double %103, %107
br i1 %108, label %109, label %110
109: ; preds = %102
br label %111
110: ; preds = %102, %95
br label %91
111: ; preds = %109, %91
br label %112
112: ; preds = %111, %88
%113 = load i64, i64* %11
ret i64 %113
}

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