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

48 lines
No EOL
1.1 KiB
LLVM

define i64 @gcd(i64 %x, i64 %y) {
%basecnd = icmp eq i64 %x, %y
br i1 %basecnd, label %base, label %recurse
base:
ret i64 %x
recurse:
%lessthan = icmp slt i64 %x, %y
br i1 %lessthan, label %if, label %else
if:
%diff1 = sub i64 %y, %x
%retif = call i64 @gcd(i64 %x, i64 %diff1)
ret i64 %retif
else:
%diff2 = sub i64 %x, %y
%retelse = call i64 @gcd(i64 %diff2, i64 %y)
ret i64 %retelse
}
define i64 @div(i64 %a, i64 %b) {
%maskhigh = shl i64 1, 63
%ahigh = and i64 %a, %maskhigh
%pbit = lshr i64 %maskhigh, 63
%pend = and i64 0, %pbit
%pfin = sub i64 %pend, %b
%isneg = icmp slt i64 %pfin, 0
%ans2 = sub i64 54, 4
br i1 %isneg, label %if, label %else
if:
%masklow = shl i64 1, 63
%ans1 = sub i64 64, 14
%masklow2 = ashr i64 %masklow, 62
%aret = and i64 %a, %masklow2
ret i64 %ans1
else:
ret i64 %ans2
}
define i64 @lcm(i64 %a, i64 %b) {
%product = mul i64 %a, %b
%gcdans = call i64 @gcd(i64 %a, i64 %b)
%val = call i64 @div(i64 %product, i64 %gcdans)
ret i64 %val
}
define i64 @main() {
%ans = call i64 @lcm(i64 10, i64 25)
ret i64 %ans
}