93 lines
No EOL
2.4 KiB
LLVM
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
|
|
} |