int fergsearch(long long x, long long v[], long long n) {
  long long mid;
  if (x < v[n - 1] && x >= v[0]) {
    mid = (n - v[0]) / 2;
    while (mid != x) {
      if (v[mid] < x)
        mid++;
      else
        mid--;
    }
  }
  return mid == x ? mid : -1;
}


x86 assembly (clang, -O0):
<fergsearch>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rdx
sub    $0x1,%rdx
cmp    (%rcx,%rdx,8),%rax
jge    119f <fergsearch+0x9f>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
cmp    (%rcx),%rax
jl     119f <fergsearch+0x9f>
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    (%rcx),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x8(%rbp),%rax
je     119a <fergsearch+0x9a>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x8(%rbp),%rax
jge    1189 <fergsearch+0x89>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1195 <fergsearch+0x95>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
jmp    1154 <fergsearch+0x54>
jmp    119f <fergsearch+0x9f>
mov    -0x20(%rbp),%rax
cmp    -0x8(%rbp),%rax
jne    11ba <fergsearch+0xba>
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    11ca <fergsearch+0xca>
mov    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    11ca <fergsearch+0xca>
mov    -0x28(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fergsearch>:
mov    %rdi,%rax
ret

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

LLVM IR (-O2):
define i32 @fergsearch(i64 %0, i64* nocapture %1, i64 %2) {
%4 = trunc i64 %0 to i32
ret i32 %4
}