(module (func (export "fac-expr") (param $n i64) (result i64) (local $i i64) (local $res i64) (local.set $i (local.get $n)) (local.set $res (i64.const 1)) (block $done (loop $loop (if (i64.eq (local.get $i) (i64.const 0)) (br $done) (block (local.set $res (i64.mul (local.get $i) (local.get $res))) (local.set $i (i64.sub (local.get $i) (i64.const 1))) ) ) (br $loop) ) ) (local.get $res) ) (func (export "fac-stack") (param $n i64) (result i64) (local $i i64) (local $res i64) (local.get $n) (local.set $i) (i64.const 1) (local.set $res) (block $done (loop $loop (local.get $i) (i64.const 0) (i64.eq) (if (then (br $done)) (else (local.get $i) (local.get $res) (i64.mul) (local.set $res) (local.get $i) (i64.const 1) (i64.sub) (local.set $i) ) ) (br $loop) ) ) (local.get $res) ) (func (export "fac-stack-raw") (param $n i64) (result i64) (local $i i64) (local $res i64) local.get $n local.set $i i64.const 1 local.set $res block $done loop $loop local.get $i i64.const 0 i64.eq if br $done else local.get $i local.get $res i64.mul local.set $res local.get $i i64.const 1 i64.sub local.set $i end br $loop end end local.get $res ) (func (export "fac-mixed") (param $n i64) (result i64) (local $i i64) (local $res i64) (local.set $i (local.get $n)) (local.set $res (i64.const 1)) (block $done (loop $loop (i64.eq (local.get $i) (i64.const 0)) (if (then (br $done)) (else (i64.mul (local.get $i) (local.get $res)) (local.set $res) (i64.sub (local.get $i) (i64.const 1)) (local.set $i) ) ) (br $loop) ) ) (local.get $res) ) (func (export "fac-mixed-raw") (param $n i64) (result i64) (local $i i64) (local $res i64) (local.set $i (local.get $n)) (local.set $res (i64.const 1)) block $done loop $loop (i64.eq (local.get $i) (i64.const 0)) if br $done else (i64.mul (local.get $i) (local.get $res)) local.set $res (i64.sub (local.get $i) (i64.const 1)) local.set $i end br $loop end end local.get $res ) ) (assert_return (invoke "fac-expr" (i64.const 25)) (i64.const 7034535277573963776)) (assert_return (invoke "fac-stack" (i64.const 25)) (i64.const 7034535277573963776)) (assert_return (invoke "fac-mixed" (i64.const 25)) (i64.const 7034535277573963776)) ;; from br_table.wast (module (func $type-arg-num-vs-void (block (br_table 0 (i32.const 0) (i32.const 1))) ))