diff --git a/tests/samples/stack.wast b/tests/samples/stack.wast new file mode 100644 index 0000000..168f9b1 --- /dev/null +++ b/tests/samples/stack.wast @@ -0,0 +1,128 @@ +(module + (func (export "fac-expr") (param $n i64) (result i64) + (local $i i64) + (local $res i64) + (set_local $i (get_local $n)) + (set_local $res (i64.const 1)) + (block $done + (loop $loop + (if + (i64.eq (get_local $i) (i64.const 0)) + (then (br $done)) + (else + (set_local $res (i64.mul (get_local $i) (get_local $res))) + (set_local $i (i64.sub (get_local $i) (i64.const 1))) + ) + ) + (br $loop) + ) + ) + (get_local $res) + ) + + (func (export "fac-stack") (param $n i64) (result i64) + (local $i i64) + (local $res i64) + (get_local $n) + (set_local $i) + (i64.const 1) + (set_local $res) + (block $done + (loop $loop + (get_local $i) + (i64.const 0) + (i64.eq) + (if + (then (br $done)) + (else + (get_local $i) + (get_local $res) + (i64.mul) + (set_local $res) + (get_local $i) + (i64.const 1) + (i64.sub) + (set_local $i) + ) + ) + (br $loop) + ) + ) + (get_local $res) + ) + + (func (export "fac-stack-raw") (param $n i64) (result i64) + (local $i i64) + (local $res i64) + get_local $n + set_local $i + i64.const 1 + set_local $res + block $done + loop $loop + get_local $i + i64.const 0 + i64.eq + if $body + br $done + else $body + get_local $i + get_local $res + i64.mul + set_local $res + get_local $i + i64.const 1 + i64.sub + set_local $i + end $body + br $loop + end $loop + end $done + get_local $res + ) + + (func (export "fac-mixed") (param $n i64) (result i64) + (local $i i64) + (local $res i64) + (set_local $i (get_local $n)) + (set_local $res (i64.const 1)) + (block $done + (loop $loop + (i64.eq (get_local $i) (i64.const 0)) + (if + (then (br $done)) + (else + (i64.mul (get_local $i) (get_local $res)) + (set_local $res) + (i64.sub (get_local $i) (i64.const 1)) + (set_local $i) + ) + ) + (br $loop) + ) + ) + (get_local $res) + ) + + (func (export "fac-mixed-raw") (param $n i64) (result i64) + (local $i i64) + (local $res i64) + (set_local $i (get_local $n)) + (set_local $res (i64.const 1)) + block $done + loop $loop + (i64.eq (get_local $i) (i64.const 0)) + if + br $done + else + (i64.mul (get_local $i) (get_local $res)) + set_local $res + (i64.sub (get_local $i) (i64.const 1)) + set_local $i + end + br $loop + end + end + get_local $res + ) +) \ No newline at end of file