26 lines
756 B
LLVM
26 lines
756 B
LLVM
@gbl = global [5 x i64] [ i64 2, i64 3, i64 4, i64 5, i64 6 ]
|
|
|
|
define i64 @add(i64 %x1, i64 %x2) {
|
|
%1 = add i64 %x1, %x2
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @foldl(i64(i64, i64)* %f, i64 %acc, i64* %argv, i64 %argc) {
|
|
%cmp = icmp eq i64 %argc, 0
|
|
br i1 %cmp, label %then, label %else
|
|
then:
|
|
ret i64 %acc
|
|
else:
|
|
%tail = getelementptr i64, i64* %argv, i32 1
|
|
%head = load i64, i64* %argv
|
|
%new_acc = call i64 %f(i64 %acc, i64 %head)
|
|
%new_argc = sub i64 %argc, 1
|
|
%val = call i64 @foldl(i64(i64, i64)* %f, i64 %new_acc, i64* %tail, i64 %new_argc)
|
|
ret i64 %val
|
|
}
|
|
|
|
define i64 @main(i64 %argc, i8** %arcv) {
|
|
%1 = getelementptr [5 x i64], [5 x i64]* @gbl, i32 0, i32 0
|
|
%2 = call i64 @foldl(i64(i64, i64)* @add, i64 0, i64* %1, i64 5)
|
|
ret i64 %2
|
|
}
|