int BinarySearchRecursion(float arry[], float value, int start, int end) {
  if (start > end) {
    return -1;
  }
  if (value < 1.367 || value > 21.782) {
    return -1;
  }
  int mid = start + (end - start) / 2;
  if (value >= arry[mid] && value <= arry[mid + 1])
    return mid;
  else if (value < arry[mid]) {
    end = mid;
    return BinarySearchRecursion(arry, value, start, end);
  } else {
    start = mid + 1;
    return BinarySearchRecursion(arry, value, start, end);
  }
}


x86 assembly (clang, -O0):
<BinarySearchRecursion>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jle    113f <BinarySearchRecursion+0x2f>
movl   $0xffffffff,-0x4(%rbp)
jmp    123e <BinarySearchRecursion+0x12e>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xeb0(%rip),%xmm0
ucomisd %xmm1,%xmm0
ja     1175 <BinarySearchRecursion+0x65>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9d(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1181 <BinarySearchRecursion+0x71>
movl   $0xffffffff,-0x4(%rbp)
jmp    123e <BinarySearchRecursion+0x12e>
mov    -0x18(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x24(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x20(%rbp)
movss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
ucomiss (%rax,%rcx,4),%xmm0
jb     11e1 <BinarySearchRecursion+0xd1>
movss  -0x14(%rbp),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jb     11e1 <BinarySearchRecursion+0xd1>
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    123e <BinarySearchRecursion+0x12e>
movss  -0x14(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jbe    121e <BinarySearchRecursion+0x10e>
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
movss  -0x14(%rbp),%xmm0
mov    -0x18(%rbp),%esi
mov    -0x1c(%rbp),%edx
call   1030 <BinarySearchRecursion@plt>
mov    %eax,-0x4(%rbp)
jmp    123e <BinarySearchRecursion+0x12e>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
movss  -0x14(%rbp),%xmm0
mov    -0x18(%rbp),%esi
mov    -0x1c(%rbp),%edx
call   1030 <BinarySearchRecursion@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<BinarySearchRecursion>:
cvtss2sd %xmm0,%xmm1
movsd  0xef4(%rip),%xmm2
ucomisd %xmm1,%xmm2
seta   %al
ucomisd 0xeed(%rip),%xmm1
seta   %r8b
or     %al,%r8b
mov    %edx,%eax
jmp    1135 <BinarySearchRecursion+0x35>
cs nopw 0x0(%rax,%rax,1)
ucomiss %xmm0,%xmm1
jbe    1170 <BinarySearchRecursion+0x70>
mov    %eax,%edx
mov    %eax,%ecx
sub    %esi,%ecx
setl   %al
or     %r8b,%al
jne    1177 <BinarySearchRecursion+0x77>
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
add    %esi,%eax
movslq %eax,%rcx
movss  (%rdi,%rcx,4),%xmm1
ucomiss %xmm1,%xmm0
jb     1130 <BinarySearchRecursion+0x30>
movss  0x4(%rdi,%rcx,4),%xmm2
ucomiss %xmm0,%xmm2
jb     1130 <BinarySearchRecursion+0x30>
jmp    117c <BinarySearchRecursion+0x7c>
nopl   0x0(%rax,%rax,1)
add    $0x1,%eax
mov    %eax,%esi
jmp    1122 <BinarySearchRecursion+0x22>
mov    $0xffffffff,%eax
ret

LLVM IR (-O0):
define i32 @BinarySearchRecursion(float* %0, float %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca float*
%7 = alloca float
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store float* %0, float** %6
store float %1, float* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%11 = load i32, i32* %8
%12 = load i32, i32* %9
%13 = icmp sgt i32 %11, %12
br i1 %13, label %14, label %15
14: ; preds = %4
store i32 -1, i32* %5
br label %72
15: ; preds = %4
%16 = load float, float* %7
%17 = fpext float %16 to double
%18 = fcmp olt double %17, 1.367000e+00
br i1 %18, label %23, label %19
19: ; preds = %15
%20 = load float, float* %7
%21 = fpext float %20 to double
%22 = fcmp ogt double %21, 2.178200e+01
br i1 %22, label %23, label %24
23: ; preds = %19, %15
store i32 -1, i32* %5
br label %72
24: ; preds = %19
%25 = load i32, i32* %8
%26 = load i32, i32* %9
%27 = load i32, i32* %8
%28 = sub nsw i32 %26, %27
%29 = sdiv i32 %28, 2
%30 = add nsw i32 %25, %29
store i32 %30, i32* %10
%31 = load float, float* %7
%32 = load float*, float** %6
%33 = load i32, i32* %10
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds float, float* %32, i64 %34
%36 = load float, float* %35
%37 = fcmp oge float %31, %36
br i1 %37, label %38, label %49
38: ; preds = %24
%39 = load float, float* %7
%40 = load float*, float** %6
%41 = load i32, i32* %10
%42 = add nsw i32 %41, 1
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds float, float* %40, i64 %43
%45 = load float, float* %44
%46 = fcmp ole float %39, %45
br i1 %46, label %47, label %49
47: ; preds = %38
%48 = load i32, i32* %10
store i32 %48, i32* %5
br label %72
49: ; preds = %38, %24
%50 = load float, float* %7
%51 = load float*, float** %6
%52 = load i32, i32* %10
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds float, float* %51, i64 %53
%55 = load float, float* %54
%56 = fcmp olt float %50, %55
br i1 %56, label %57, label %64
57: ; preds = %49
%58 = load i32, i32* %10
store i32 %58, i32* %9
%59 = load float*, float** %6
%60 = load float, float* %7
%61 = load i32, i32* %8
%62 = load i32, i32* %9
%63 = call i32 @BinarySearchRecursion(float* %59, float %60, i32 %61, i32 %62)
store i32 %63, i32* %5
br label %72
64: ; preds = %49
%65 = load i32, i32* %10
%66 = add nsw i32 %65, 1
store i32 %66, i32* %8
%67 = load float*, float** %6
%68 = load float, float* %7
%69 = load i32, i32* %8
%70 = load i32, i32* %9
%71 = call i32 @BinarySearchRecursion(float* %67, float %68, i32 %69, i32 %70)
store i32 %71, i32* %5
br label %72
72: ; preds = %64, %57, %47, %23, %14
%73 = load i32, i32* %5
ret i32 %73
}

LLVM IR (-O2):
define i32 @BinarySearchRecursion(float* %0, float %1, i32 %2, i32 %3) {
%5 = fpext float %1 to double
%6 = fcmp olt double %5, 1.367000e+00
%7 = fcmp ogt double %5, 2.178200e+01
%8 = or i1 %6, %7
br label %9
9: ; preds = %32, %4
%10 = phi i32 [ %33, %32 ], [ %2, %4 ]
%11 = phi i32 [ %13, %32 ], [ %3, %4 ]
br label %12
12: ; preds = %9, %30
%13 = phi i32 [ %19, %30 ], [ %11, %9 ]
%14 = icmp slt i32 %13, %10
%15 = or i1 %14, %8
br i1 %15, label %34, label %16
16: ; preds = %12
%17 = sub nsw i32 %13, %10
%18 = sdiv i32 %17, 2
%19 = add nsw i32 %18, %10
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds float, float* %0, i64 %20
%22 = load float, float* %21
%23 = fcmp ugt float %22, %1
br i1 %23, label %30, label %24
24: ; preds = %16
%25 = add nsw i32 %19, 1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds float, float* %0, i64 %26
%28 = load float, float* %27
%29 = fcmp ult float %28, %1
br i1 %29, label %30, label %34
30: ; preds = %24, %16
%31 = fcmp ogt float %22, %1
br i1 %31, label %12, label %32
32: ; preds = %30
%33 = add nsw i32 %19, 1
br label %9
34: ; preds = %12, %24
%35 = phi i32 [ -1, %12 ], [ %19, %24 ]
ret i32 %35
}