CS153/hw6/llprograms/sp24_hw3/xuselina_artemisl.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

155 lines
No EOL
3.6 KiB
LLVM

%array_ty = type [7 x i64]
@array = global %array_ty [i64 23, i64 10, i64 20, i64 11, i64 12, i64 6, i64 7]
@sorted_array = global %array_ty [i64 6, i64 7, i64 10, i64 11, i64 12, i64 20, i64 23]
define void @flip(%array_ty* %array, i64 %len) {
%start = alloca i64
%end = alloca i64
%temp = alloca i64
store i64 0, i64* %start
store i64 %len, i64* %end
br label %setup_flip
setup_flip:
%1 = load i64, i64* %start
%2 = load i64, i64* %end
%cmp1 = icmp slt i64 %1, %2
br i1 %cmp1, label %flip_op, label %end_flip
flip_op:
%3 = load i64, i64* %start
%s_val_ptr = getelementptr %array_ty, %array_ty* %array, i32 0, i64 %3
%s_val = load i64, i64* %s_val_ptr
store i64 %s_val, i64* %temp
%4 = load i64, i64* %end
%e_val_ptr = getelementptr %array_ty, %array_ty* %array, i32 0, i64 %4
%e_val = load i64, i64* %e_val_ptr
store i64 %e_val, i64* %s_val_ptr
%5 = load i64, i64* %temp
store i64 %5, i64* %e_val_ptr
%6 = load i64, i64* %start
%7 = add i64 %6, 1
store i64 %7, i64* %start
%8 = load i64, i64* %end
%9 = sub i64 %8, 1
store i64 %9, i64* %end
br label %setup_flip
end_flip:
ret void
}
define i64 @findMax(%array_ty* %array, i64 %len) {
%index = alloca i64
%max = alloca i64
%temp = alloca i64
store i64 0, i64* %index
br label %setup_cmp
setup_cmp:
%1 = load i64, i64* %index
%cmp2 = icmp slt i64 %1, %len
br i1 %cmp2, label %compare, label %end
compare:
%2 = load i64, i64* %index
%ptr = getelementptr %array_ty, %array_ty* %array, i32 0, i64 %2
%val = load i64, i64* %ptr
%3 = load i64, i64* %max
%cmp3 = icmp slt i64 %val, %3
br i1 %cmp3, label %end, label %update_max
update_max:
%4 = load i64, i64* %temp
store i64 %4, i64* %ptr
%5 = load i64, i64* %max
store i64 %5, i64* %temp
%6 = load i64, i64* %index
%7 = add i64 %6, 1
store i64 %7, i64* %index
br label %setup_cmp
end:
%8 = load i64, i64* %max
ret i64 %8
}
define void @pancakeSort(%array_ty %array, i64 %len) {
%index = alloca i64
store i64 %len, i64* %index
br label %start_pancake
start_pancake:
%1 = load i64, i64* %index
%cmp3 = icmp sgt i64 %1, 1
br i1 %cmp3, label %pancake_op, label %end_pancake
pancake_op:
%max = call i64 @findMax(%array_ty* @array, i64 %len)
%in = load i64, i64* %index
%index_m_1 = sub i64 %in, 1
%cmp4 = icmp ne i64 %max, %index_m_1
br i1 %cmp4, label %flip, label %end_flip
flip:
call void @flip(%array_ty* @array, i64 %max)
call void @flip(%array_ty* @array, i64 %index_m_1)
br label %end_flip
end_flip:
%2 = load i64, i64* %index
%3 = sub i64 %2, 1
store i64 %2, i64* %index
br label %start_pancake
end_pancake:
ret void
}
define i64 @isEqual(%array_ty* %array, %array_ty* %sorted_array) {
%index = alloca i64
store i64 0, i64* %index
br label %iterate
iterate:
%1 = load i64, i64* %index
%cmp5 = icmp slt i64 %1, 7
br i1 %cmp5, label %check, label %equal
check:
%2 = load i64, i64* %index
%ptr = getelementptr %array_ty, %array_ty* %array, i32 0, i64 %2
%val = load i64, i64* %ptr
%3 = load i64, i64* %index
%ptr2 = getelementptr %array_ty, %array_ty* %sorted_array, i32 0, i64 %3
%val2 = load i64, i64* %ptr2
%cmp6 = icmp eq i64 %val, %val2
br i1 %cmp6, label %move_pointer, label %not_equal
move_pointer:
%4 = load i64, i64* %index
%5 = add i64 %4, 1
store i64 %5, i64* %index
br label %iterate
equal:
ret i64 0
not_equal:
ret i64 1
}
define i64 @main(i64 %argc, i8** %arcv) {
;call void @pancakeSort(%array_ty* @array, i64 7)
;%result = call i64 @isEqual(%array_ty* @array, %array_ty* @sorted_array)
;ret i64 %result
ret i64 0
}