(module
    (func $main (result i32)
        (call $fib (i32.const 40))
    )

    (func $fib (param $n i32) (result i32)
        (if (i32.eq (get_local $n) (i32.const 0))
            (then (return (i32.const 1)))
        )
        (if (i32.eq (get_local $n) (i32.const 1))
            (then (return (i32.const 1)))
        )
        (i32.add
            (call $fib (i32.sub (get_local $n) (i32.const 1)))
            (call $fib (i32.sub (get_local $n) (i32.const 2)))
        )
    )

    (export "main" (func $main))
)