CS153/hw6/llprograms/sp24_hw3/binary_search.ll
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

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
}