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

73 lines
1.7 KiB
LLVM

; judtin, jasyan
; two sum: given a list nums and int target, return the sum of the two indices whose values add up to target
%array = type [10 x i64]
%pair = type [2 x i64]
@target = global i64 800
@array_size = global i64 10
@nums = global %array [ i64 123, i64 934, i64 3, i64 342, i64 732, i64 396, i64 502, i64 221, i64 6, i64 797 ]
define i64 @two_sum(i64* %arr) {
%i_ptr = alloca i64
store i64 0, i64* %i_ptr
%j_ptr = alloca i64
%array_size_val = load i64, i64* @array_size
%result = alloca i64
store i64 -1, i64* %result
br label %outer_loop
outer_loop:
store i64 0, i64* %j_ptr
br label %inner_loop
inner_loop:
%i = load i64, i64* %i_ptr
%j = load i64, i64* %j_ptr
%i_elem_ptr = getelementptr %array, %array* %arr, i32 0, i64 %i
%j_elem_ptr = getelementptr %array, %array* %arr, i32 0, i64 %j
%i_elem = load i64, i64* %i_elem_ptr
%j_elem = load i64, i64* %j_elem_ptr
%sum = add i64 %i_elem, %j_elem
%target_val = load i64, i64* @target
%cmp = icmp eq i64 %target_val, %sum
br i1 %cmp, label %found, label %not_found
found:
%ans = add i64 %i, %j
store i64 %ans, i64* %result
br label %end_loop
not_found:
%j_plus_1 = add i64 %j, 1
store i64 %j_plus_1, i64* %j_ptr
%cmp1 = icmp eq i64 %array_size_val, %j
br i1 %cmp1, label %end_inner_loop, label %inner_loop
end_inner_loop:
%i_plus_1 = add i64 %i, 1
store i64 %i_plus_1, i64* %i_ptr
%cmp2 = icmp eq i64 %array_size_val, %i
br i1 %cmp2, label %end_loop, label %outer_loop
end_loop:
%res_val = load i64, i64* %result
ret i64 %res_val
}
define i64 @main(i64 %argc, i8** %arcv) {
%ans = call i64 @two_sum(%array* @nums)
ret i64 %ans
}