CS153/hw6/llprograms/sp22_hw3/is_square.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

93 lines
No EOL
2.4 KiB
LLVM

%point = type [2 x i64]
@pt1 = global %point [ i64 10, i64 20 ]
@pt2 = global %point [ i64 10, i64 10 ]
@pt3 = global %point [ i64 20, i64 10 ]
@pt4 = global %point [ i64 20, i64 20 ]
define i64 @distance(%point* %fst, %point* %snd) {
%one = getelementptr %point, %point* %fst, i32 0, i64 0
%two = getelementptr %point, %point* %fst, i32 0, i64 1
%thre = getelementptr %point, %point* %snd, i32 0, i64 0
%four = getelementptr %point, %point* %snd, i32 0, i64 1
%x1 = load i64, i64* %one
%y1 = load i64, i64* %two
%x2 = load i64, i64* %thre
%y2 = load i64, i64* %four
%1 = sub i64 %x1, %x2
%2 = mul i64 %1, %1
%3 = sub i64 %y1, %y2
%4 = mul i64 %3, %3
%5 = add i64 %2, %4
ret i64 %5
}
define i64 @is_square(%point* %p1, %point* %p2, %point* %p3, %point* %p4) {
%d2 = call i64 @distance(%point* %p1, %point* %p2)
%d3 = call i64 @distance(%point* %p1, %point* %p3)
%d4 = call i64 @distance(%point* %p1, %point* %p4)
%part1c1 = icmp eq i64 %d2, 0
%part1c2 = icmp eq i64 %d3, 0
%part1c3 = icmp eq i64 %d4, 0
%b1tmp = or i1 %part1c1, %part1c2
%b1 = or i1 %b1tmp, %part1c3
br i1 %b1, label %end, label %part2
part2:
%c1 = icmp eq i64 %d2, %d3
%1 = mul i64 %d2, 2
%c2 = icmp eq i64 %1, %d4
%d5 = call i64 @distance(%point* %p2, %point* %p4)
%d6 = call i64 @distance(%point* %p2, %point* %p3)
%2 = mul i64 %d5, 2
%c3 = icmp eq i64 %2, %d6
%cmp1 = and i1 %c1, %c2
%b2 = and i1 %c3, %cmp1
br i1 %b2, label %exitT, label %part3
part3:
%3 = mul i64 %d3, 2
%d7 = call i64 @distance(%point* %p3, %point* %p2)
%d8 = call i64 @distance(%point* %p3, %point* %p4)
%4 = mul i64 %d7, 2
%part3c1 = icmp eq i64 %d3, %d4
%part3c2 = icmp eq i64 %3, %d2
%part3c3 = icmp eq i64 %4, %d8
%cmp3_1 = and i1 %part3c1, %part3c2
%b3 = and i1 %cmp3_1, %part3c3
br i1 %b3, label %exitT, label %part4
part4:
%5 = mul i64 %d2, 2
%d9 = call i64 @distance(%point* %p2, %point* %p3)
%d10 = call i64 @distance(%point* %p2, %point* %p4)
%6 = mul i64 %d9, 2
%part4c1 = icmp eq i64 %d2, %d4
%part4c2 = icmp eq i64 %5, %d3
%part4c3 = icmp eq i64 %6, %d10
%cmp4_1 = and i1 %part4c1, %part4c2
%b4 = and i1 %cmp4_1, %part4c3
br i1 %b4, label %exitT, label %end
exitT:
ret i64 1
end:
ret i64 0
}
define i64 @main(i64 %argc, i8** %argv) {
%ans = call i64 @is_square(%point* @pt1, %point* @pt2, %point* @pt3, %point* @pt4)
ret i64 %ans
}