今日のLLVM - フィボナッチ数列
Posted by nanki Fri, 25 Dec 2009 01:35:00 GMT
LLVM言語にて、フィボナッチ数列。
@str = internal constant [4 x i8] c"%d\0A\00"
define void @main() nounwind {
init:
br label %loop
loop:
%i = phi i32 [0, %init], [%i.next, %loop]
%fib = call i32 @fib(i32 %i)
call i32 @printf( i8* getelementptr ([4 x i8]* @str, i32 0,i32 0), i32 %fib)
%i.next = add i32 %i, 1
%cond = icmp ult i32 %i.next, 30
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define i32 @fib(i32 %n) nounwind {
%cond = icmp ult i32 %n, 2
br i1 %cond, label %c1, label %c2
c1:
ret i32 1
c2:
%n1 = sub i32 %n, 1
%n2 = sub i32 %n, 2
%fib1 = call i32 @fib(i32 %n1)
%fib2 = call i32 @fib(i32 %n2)
%r = add i32 %fib1, %fib2
ret i32 %r
}
declare i32 @printf(i8*, ...) nounwind𐄡 llvm-as fib.ll -o - | lli
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040便利。
