CS153/hw6/llprograms/sp22_hw3/select_sort.ll
jmug 0c04936ccf Updated hw6 to a newer version
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 21:23:08 -08:00

62 lines
No EOL
2 KiB
LLVM

@arr = global [5 x i64] [ i64 4, i64 2, i64 3, i64 10, i64 6 ]
define void @swap(i64 * %p1, i64 * %p2) {
%temp1 = load i64, i64* %p1
%temp2 = load i64,i64* %p2
store i64 %temp2, i64* %p1
store i64 %temp1, i64* %p2
ret void
}
define i64 @getminidx(i64 %curr, i64 %indvar, i64 %arrsize){
%1 = icmp eq i64 %indvar, %arrsize
br i1 %1, label %fin, label %calc
fin:
ret i64 0
calc:
%curr_val_ptr = getelementptr [5 x i64], [5 x i64]* @arr, i64 0, i64 %curr
%curr_val = load i64, i64* %curr_val_ptr
%cmp_val_ptr = getelementptr [5 x i64], [5 x i64]* @arr, i64 0, i64 %indvar
%cmp_val = load i64, i64* %cmp_val_ptr
%cmp_bool = icmp sgt i64 %curr_val, %cmp_val
br i1 %cmp_bool, label %returnval, label %nextloop
returnval:
ret i64 %indvar
nextloop:
%nextindvar = add i64 %indvar, 1
%res = call i64 @getminidx(i64 %curr, i64 %nextindvar, i64 %arrsize)
ret i64 %res
}
define i64 @selectsort(i64 %curridx, i64 %acc, i64 %arrsize) {
%1 = icmp eq i64 %curridx, %arrsize
br i1 %1, label %donesorting, label %nextsort
donesorting:
ret i64 %acc
nextsort:
%indvar = add i64 %curridx, 1
%minidx = call i64 @getminidx(i64 %curridx, i64 %indvar, i64 %arrsize)
%idxcmp = icmp sgt i64 %minidx, 0
br i1 %idxcmp, label %swappos, label %donothing
donothing:
%currvalptr = getelementptr [5 x i64], [5 x i64]* @arr, i64 0, i64 %curridx
%currval = load i64, i64* %currvalptr
%newacc = add i64 %acc, %currval
%nextidx = add i64 %curridx, 1
%res = call i64 @selectsort(i64 %nextidx, i64 %newacc, i64 %arrsize)
ret i64 %res
swappos:
%currvalptr = getelementptr [5 x i64], [5 x i64]* @arr, i64 0, i64 %curridx
%swapvalptr = getelementptr [5 x i64], [5 x i64]* @arr, i64 0, i64 %minidx
%newval = load i64, i64* %swapvalptr
%newacc = add i64 %acc, %newval
call void @swap(i64 * %currvalptr, i64 * %swapvalptr)
%nextidx1 = add i64 %curridx, 1
%res1 = call i64 @selectsort(i64 %nextidx1, i64 %newacc, i64 %arrsize)
ret i64 %res1
}
define i64 @main(i64 %argc, i8** %arcv) {
%1 = call i64 @selectsort(i64 0, i64 0, i64 5)
ret i64 %1
}