CS153/hw6/llprograms/sp20_hw3/ackermann.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

32 lines
726 B
LLVM

define i64 @ack(i64 %m, i64 %n) {
%r = alloca i64
%icm = icmp sgt i64 %m, 0
br i1 %icm, label %mnonzero, label %mzero
mzero:
%tmp = add i64 %n, 1
store i64 %tmp, i64* %r
br label %end
mnonzero:
%icn = icmp sgt i64 %n, 0
br i1 %icn, label %nnonzero, label %nzero
nzero:
%msub = sub i64 %m, 1
%tmp = call i64 @ack(i64 %msub, i64 1)
store i64 %tmp, i64* %r
br label %end
nnonzero:
%msub = sub i64 %m, 1
%nsub = sub i64 %n, 1
%newn = call i64 @ack(i64 %m, i64 %nsub)
%tmp = call i64 @ack(i64 %msub, i64 %newn)
store i64 %tmp, i64* %r
br label %end
end:
%rv1 = load i64, i64* %r
ret i64 %rv1
}
define i64 @main(i64 %argc, i8** %argv) {
%ans = call i64 @ack(i64 2, i64 2)
ret i64 %ans
}