| (module |
| (type $0 (func (param i64) (result i64))) |
| (export "fac-rec" (func $f0)) |
| (export "fac-rec-named" (func $f1)) |
| (export "fac-iter" (func $f2)) |
| (export "fac-iter-named" (func $f3)) |
| (export "fac-opt" (func $f4)) |
| (func $f0 (param $0 i64) (result i64) |
| (if (result i64) |
| (i64.eqz |
| (local.get $0) |
| ) |
| (then |
| (i64.const 1) |
| ) |
| (else |
| (i64.mul |
| (call $f0 |
| (i64.sub |
| (local.get $0) |
| (i64.const 1) |
| ) |
| ) |
| (local.get $0) |
| ) |
| ) |
| ) |
| ) |
| (func $f1 (param $0 i64) (result i64) |
| (if (result i64) |
| (i64.eqz |
| (local.get $0) |
| ) |
| (then |
| (i64.const 1) |
| ) |
| (else |
| (i64.mul |
| (call $f1 |
| (i64.sub |
| (local.get $0) |
| (i64.const 1) |
| ) |
| ) |
| (local.get $0) |
| ) |
| ) |
| ) |
| ) |
| (func $f2 (param $0 i64) (result i64) |
| (unreachable) |
| ) |
| (func $f3 (param $0 i64) (result i64) |
| (local $1 i64) |
| (local.set $1 |
| (i64.const 1) |
| ) |
| (loop $label$3 |
| (if |
| (i32.eqz |
| (i64.eqz |
| (local.get $0) |
| ) |
| ) |
| (then |
| (local.set $1 |
| (i64.mul |
| (local.get $0) |
| (local.get $1) |
| ) |
| ) |
| (local.set $0 |
| (i64.sub |
| (local.get $0) |
| (i64.const 1) |
| ) |
| ) |
| (br $label$3) |
| ) |
| ) |
| ) |
| (local.get $1) |
| ) |
| (func $f4 (param $0 i64) (result i64) |
| (local $1 i64) |
| (local.set $1 |
| (i64.const 1) |
| ) |
| (if |
| (i64.ge_s |
| (local.get $0) |
| (i64.const 2) |
| ) |
| (then |
| (loop $label$3 |
| (local.set $1 |
| (i64.mul |
| (local.get $0) |
| (local.get $1) |
| ) |
| ) |
| (br_if $label$3 |
| (i64.gt_s |
| (local.tee $0 |
| (i64.sub |
| (local.get $0) |
| (i64.const 1) |
| ) |
| ) |
| (i64.const 1) |
| ) |
| ) |
| ) |
| ) |
| ) |
| (local.get $1) |
| ) |
| ) |