diff options
| author | nsfisis <nsfisis@gmail.com> | 2024-03-16 20:41:50 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2024-03-16 20:41:50 +0900 |
| commit | 3d2d891d7e1492d179cd8da7a618fbdd5efcca2c (patch) | |
| tree | 45367f35d98af1125a2197b3bc3dbc35700128d7 /tests/fixtures/spec_testsuites/core/stack.wast | |
| parent | 9b45796547c8022b98a9254320323d72aecd81cb (diff) | |
| download | php-waddiwasi-3d2d891d7e1492d179cd8da7a618fbdd5efcca2c.tar.gz php-waddiwasi-3d2d891d7e1492d179cd8da7a618fbdd5efcca2c.tar.zst php-waddiwasi-3d2d891d7e1492d179cd8da7a618fbdd5efcca2c.zip | |
feat: add spec testsuites
Diffstat (limited to 'tests/fixtures/spec_testsuites/core/stack.wast')
| -rw-r--r-- | tests/fixtures/spec_testsuites/core/stack.wast | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/tests/fixtures/spec_testsuites/core/stack.wast b/tests/fixtures/spec_testsuites/core/stack.wast new file mode 100644 index 0000000..5da5043 --- /dev/null +++ b/tests/fixtures/spec_testsuites/core/stack.wast @@ -0,0 +1,239 @@ +(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)) + (then (br $done)) + (else + (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 $body + br $done + else $body + local.get $i + local.get $res + i64.mul + local.set $res + local.get $i + i64.const 1 + i64.sub + local.set $i + end $body + br $loop + end $loop + end $done + 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 + ) + + (global $temp (mut i32) (i32.const 0)) + (func $add_one_to_global (result i32) + (local i32) + (global.set $temp (i32.add (i32.const 1) (global.get $temp))) + (global.get $temp) + ) + (func $add_one_to_global_and_drop + (drop (call $add_one_to_global)) + ) + (func (export "not-quite-a-tree") (result i32) + call $add_one_to_global + call $add_one_to_global + call $add_one_to_global_and_drop + i32.add + ) +) + +(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)) + +(assert_return (invoke "not-quite-a-tree") (i32.const 3)) +(assert_return (invoke "not-quite-a-tree") (i32.const 9)) + + +;; Syntax of flat call_indirect + +(module + (type $proc (func)) + (table 1 funcref) + + (func + (block i32.const 0 call_indirect) + (loop i32.const 0 call_indirect) + (if (i32.const 0) (then i32.const 0 call_indirect)) + (if (i32.const 0) + (then i32.const 0 call_indirect) + (else i32.const 0 call_indirect) + ) + (block i32.const 0 call_indirect (type $proc)) + (loop i32.const 0 call_indirect (type $proc)) + (if (i32.const 0) (then i32.const 0 call_indirect (type $proc))) + (if (i32.const 0) + (then i32.const 0 call_indirect (type $proc)) + (else i32.const 0 call_indirect (type $proc)) + ) + (block i32.const 0 i32.const 0 call_indirect (param i32)) + (loop i32.const 0 i32.const 0 call_indirect (param i32)) + (if (i32.const 0) (then i32.const 0 i32.const 0 call_indirect (param i32))) + (if (i32.const 0) + (then i32.const 0 i32.const 0 call_indirect (param i32)) + (else i32.const 0 i32.const 0 call_indirect (param i32)) + ) + (block (result i32) i32.const 0 call_indirect (result i32)) (drop) + (loop (result i32) i32.const 0 call_indirect (result i32)) (drop) + (if (result i32) (i32.const 0) + (then i32.const 0 call_indirect (result i32)) + (else i32.const 0 call_indirect (result i32)) + ) (drop) + (block i32.const 0 call_indirect (type $proc) (param) (result)) + (loop i32.const 0 call_indirect (type $proc) (param) (result)) + (if (i32.const 0) + (then i32.const 0 call_indirect (type $proc) (param) (result)) + ) + (if (i32.const 0) + (then i32.const 0 call_indirect (type $proc) (param) (param) (result)) + (else i32.const 0 call_indirect (type $proc) (param) (result) (result)) + ) + + block i32.const 0 call_indirect end + loop i32.const 0 call_indirect end + i32.const 0 if i32.const 0 call_indirect end + i32.const 0 if i32.const 0 call_indirect else i32.const 0 call_indirect end + block i32.const 0 call_indirect (type $proc) end + loop i32.const 0 call_indirect (type $proc) end + i32.const 0 if i32.const 0 call_indirect (type $proc) end + i32.const 0 + if + i32.const 0 call_indirect (type $proc) + else + i32.const 0 call_indirect (type $proc) + end + block i32.const 0 i32.const 0 call_indirect (param i32) end + loop i32.const 0 i32.const 0 call_indirect (param i32) end + i32.const 0 if i32.const 0 i32.const 0 call_indirect (param i32) end + i32.const 0 + if + i32.const 0 i32.const 0 call_indirect (param i32) + else + i32.const 0 i32.const 0 call_indirect (param i32) + end + block (result i32) i32.const 0 call_indirect (result i32) end drop + loop (result i32) i32.const 0 call_indirect (result i32) end drop + i32.const 0 + if (result i32) + i32.const 0 call_indirect (result i32) + else + i32.const 0 call_indirect (result i32) + end drop + block i32.const 0 call_indirect (type $proc) (param) (result) end + loop i32.const 0 call_indirect (type $proc) (param) (result) end + i32.const 0 if i32.const 0 call_indirect (type $proc) (param) (result) end + i32.const 0 + if + i32.const 0 call_indirect (type $proc) (param) (result) + else + i32.const 0 call_indirect (type $proc) (param) (param) (result) (result) + end + i32.const 0 call_indirect + ) +) |
