条件分岐を一部実装した
こんな感じのコードが実行出来る様になった。
import stdlib; fib: (n) { if (n) { return n * fib(n-1); }; return 1; }; export main: () { exit(fib(3)); };
if(n)の部分はまだ比較演算子を実装していない為。
コンパイルすると
_fib.LT1ii: pushl %ebp movl %esp, %ebp subl $4, %esp cmpl $0, 8(%ebp) je L.0 movl 8(%ebp), %eax subl $1, %eax movl %eax, (%esp) call _fib.LT1ii movl %eax, %ebx movl 8(%ebp), %eax imul %ebx, %eax leave ret L.0: movl $1, %eax leave ret
ちなみにrowl0で等価なコードをコンパイルすると
fib: pushl %ebp movl %esp,%ebp movl 8(%ebp),%eax cmpl $0,%eax je _lbl5 movl 8(%ebp),%eax pushl %eax movl 8(%ebp),%eax pushl %eax movl $1,%eax movl %eax,%ebx popl %eax subl %ebx,%eax pushl %eax subl $4,%esp movl 4(%esp),%eax movl %eax,0(%esp) call fib addl $8,%esp popl %ebx imul %ebx,%eax leave ret _lbl5: movl $1,%eax leave ret
生成コードがとても良くなった。これ以上の最適化は今の段階ではやめておこう。