条件分岐を一部実装した

こんな感じのコードが実行出来る様になった。

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

生成コードがとても良くなった。これ以上の最適化は今の段階ではやめておこう。