49 lines
1.2 KiB
LLVM
49 lines
1.2 KiB
LLVM
; binary search of an array
|
|
%arr = type [10 x i64]
|
|
@input_arr = global %arr [ i64 -13, i64 3, i64 5, i64 15, i64 17, i64 27, i64 28, i64 37, i64 45, i64 54]
|
|
|
|
|
|
define i64 @main(i64 %argc, i8** %argv) {
|
|
%1 = getelementptr %arr, %arr* @input_arr, i64 0, i64 0
|
|
%2 = call i64 @binary_search(i64* %1, i64 45, i64 0, i64 9)
|
|
ret i64 %2
|
|
}
|
|
|
|
define i64 @binary_search(i64* %a, i64 %x, i64 %lo, i64 %hi) {
|
|
; return if hi < lo
|
|
%1 = icmp slt i64 %hi, %lo
|
|
br i1 %1, label %ret_base, label %loop
|
|
|
|
loop:
|
|
; find midpoint index in the array
|
|
%2 = add i64 %lo, %hi
|
|
%m = ashr i64 %2, 1
|
|
|
|
; find midpoint element
|
|
%3 = getelementptr i64, i64* %a, i64 %m
|
|
%e = load i64, i64* %3
|
|
|
|
; see if midpoint element is equal to x
|
|
%4 = icmp eq i64 %e, %x
|
|
br i1 %4, label %ret_found, label %divide
|
|
|
|
divide:
|
|
; see if x is less than midpoint elt
|
|
%5 = icmp slt i64 %x, %e
|
|
br i1 %5, label %is_less, label %is_greater
|
|
|
|
is_less: ; if x < arr[mid]
|
|
%6 = sub i64 %m, 1
|
|
%7 = call i64 @binary_search(i64* %a, i64 %x, i64 %lo, i64 %6)
|
|
ret i64 %7
|
|
is_greater: ; if x > arr[mid]
|
|
%8 = add i64 %m, 1
|
|
%9 = call i64 @binary_search(i64* %a, i64 %x, i64 %8, i64 %hi)
|
|
ret i64 %9
|
|
|
|
ret_base:
|
|
ret i64 -1
|
|
|
|
ret_found:
|
|
ret i64 %m
|
|
}
|