add more test files

This commit is contained in:
Ilya Rezvov
2018-01-22 20:16:05 -08:00
parent 0b593a4a8c
commit 5618f59cc3
20 changed files with 3079 additions and 45 deletions
+50
View File
@@ -0,0 +1,50 @@
(module
(memory 1)
(data (i32.const 0) "abcdefghijklmnopqrstuvwxyz")
(func (export "good1") (param $i i32) (result i32)
(i32.load8_u offset=0 (get_local $i)) ;; 97 'a'
)
(func (export "good2") (param $i i32) (result i32)
(i32.load8_u offset=1 (get_local $i)) ;; 98 'b'
)
(func (export "good3") (param $i i32) (result i32)
(i32.load8_u offset=2 (get_local $i)) ;; 99 'c'
)
(func (export "good4") (param $i i32) (result i32)
(i32.load8_u offset=25 (get_local $i)) ;; 122 'z'
)
(func (export "good5") (param $i i32) (result i32)
(i32.load16_u offset=0 (get_local $i)) ;; 25185 'ab'
)
(func (export "good6") (param $i i32) (result i32)
(i32.load16_u align=1 (get_local $i)) ;; 25185 'ab'
)
(func (export "good7") (param $i i32) (result i32)
(i32.load16_u offset=1 align=1 (get_local $i)) ;; 25442 'bc'
)
(func (export "good8") (param $i i32) (result i32)
(i32.load16_u offset=2 (get_local $i)) ;; 25699 'cd'
)
(func (export "good9") (param $i i32) (result i32)
(i32.load16_u offset=25 align=1 (get_local $i)) ;; 122 'z\0'
)
(func (export "good10") (param $i i32) (result i32)
(i32.load offset=0 (get_local $i)) ;; 1684234849 'abcd'
)
(func (export "good11") (param $i i32) (result i32)
(i32.load offset=1 align=1 (get_local $i)) ;; 1701077858 'bcde'
)
(func (export "good12") (param $i i32) (result i32)
(i32.load offset=2 align=2 (get_local $i)) ;; 1717920867 'cdef'
)
(func (export "good13") (param $i i32) (result i32)
(i32.load offset=25 align=1 (get_local $i)) ;; 122 'z\0\0\0'
)
(func (export "bad") (param $i i32)
(drop (i32.load offset=4294967295 (get_local $i)))
)
)
+325
View File
@@ -0,0 +1,325 @@
;; Test `br` operator
(module
;; Auxiliary definition
(func $dummy)
(func (export "type-i32") (block (drop (i32.ctz (br 0)))))
(func (export "type-i64") (block (drop (i64.ctz (br 0)))))
(func (export "type-f32") (block (drop (f32.neg (br 0)))))
(func (export "type-f64") (block (drop (f64.neg (br 0)))))
(func (export "type-i32-value") (result i32)
(block (result i32) (i32.ctz (br 0 (i32.const 1))))
)
(func (export "type-i64-value") (result i64)
(block (result i64) (i64.ctz (br 0 (i64.const 2))))
)
(func (export "type-f32-value") (result f32)
(block (result f32) (f32.neg (br 0 (f32.const 3))))
)
(func (export "type-f64-value") (result f64)
(block (result f64) (f64.neg (br 0 (f64.const 4))))
)
(func (export "as-block-first")
(block (br 0) (call $dummy))
)
(func (export "as-block-mid")
(block (call $dummy) (br 0) (call $dummy))
)
(func (export "as-block-last")
(block (nop) (call $dummy) (br 0))
)
(func (export "as-block-value") (result i32)
(block (result i32) (nop) (call $dummy) (br 0 (i32.const 2)))
)
(func (export "as-loop-first") (result i32)
(block (result i32) (loop (result i32) (br 1 (i32.const 3)) (i32.const 2)))
)
(func (export "as-loop-mid") (result i32)
(block (result i32)
(loop (result i32) (call $dummy) (br 1 (i32.const 4)) (i32.const 2))
)
)
(func (export "as-loop-last") (result i32)
(block (result i32)
(loop (result i32) (nop) (call $dummy) (br 1 (i32.const 5)))
)
)
(func (export "as-br-value") (result i32)
(block (result i32) (br 0 (br 0 (i32.const 9))))
)
(func (export "as-br_if-cond")
(block (br_if 0 (br 0)))
)
(func (export "as-br_if-value") (result i32)
(block (result i32)
(drop (br_if 0 (br 0 (i32.const 8)) (i32.const 1))) (i32.const 7)
)
)
(func (export "as-br_if-value-cond") (result i32)
(block (result i32)
(drop (br_if 0 (i32.const 6) (br 0 (i32.const 9)))) (i32.const 7)
)
)
(func (export "as-br_table-index")
(block (br_table 0 0 0 (br 0)))
)
(func (export "as-br_table-value") (result i32)
(block (result i32)
(br_table 0 0 0 (br 0 (i32.const 10)) (i32.const 1)) (i32.const 7)
)
)
(func (export "as-br_table-value-index") (result i32)
(block (result i32)
(br_table 0 0 (i32.const 6) (br 0 (i32.const 11))) (i32.const 7)
)
)
(func (export "as-return-value") (result i64)
(block (result i64) (return (br 0 (i64.const 7))))
)
(func (export "as-if-cond") (result i32)
(block (result i32)
(if (result i32) (br 0 (i32.const 2))
(then (i32.const 0))
(else (i32.const 1))
)
)
)
(func (export "as-if-then") (param i32 i32) (result i32)
(block (result i32)
(if (result i32) (get_local 0)
(then (br 1 (i32.const 3)))
(else (get_local 1))
)
)
)
(func (export "as-if-else") (param i32 i32) (result i32)
(block (result i32)
(if (result i32) (get_local 0)
(then (get_local 1))
(else (br 1 (i32.const 4)))
)
)
)
(func (export "as-select-first") (param i32 i32) (result i32)
(block (result i32)
(select (br 0 (i32.const 5)) (get_local 0) (get_local 1))
)
)
(func (export "as-select-second") (param i32 i32) (result i32)
(block (result i32)
(select (get_local 0) (br 0 (i32.const 6)) (get_local 1))
)
)
(func (export "as-select-cond") (result i32)
(block (result i32)
(select (i32.const 0) (i32.const 1) (br 0 (i32.const 7)))
)
)
(func $f (param i32 i32 i32) (result i32) (i32.const -1))
(func (export "as-call-first") (result i32)
(block (result i32)
(call $f (br 0 (i32.const 12)) (i32.const 2) (i32.const 3))
)
)
(func (export "as-call-mid") (result i32)
(block (result i32)
(call $f (i32.const 1) (br 0 (i32.const 13)) (i32.const 3))
)
)
(func (export "as-call-last") (result i32)
(block (result i32)
(call $f (i32.const 1) (i32.const 2) (br 0 (i32.const 14)))
)
)
(type $sig (func (param i32 i32 i32) (result i32)))
(table anyfunc (elem $f))
(func (export "as-call_indirect-func") (result i32)
(block (result i32)
(call_indirect (type $sig)
(br 0 (i32.const 20))
(i32.const 1) (i32.const 2) (i32.const 3)
)
)
)
(func (export "as-call_indirect-first") (result i32)
(block (result i32)
(call_indirect (type $sig)
(i32.const 0)
(br 0 (i32.const 21)) (i32.const 2) (i32.const 3)
)
)
)
(func (export "as-call_indirect-mid") (result i32)
(block (result i32)
(call_indirect (type $sig)
(i32.const 0)
(i32.const 1) (br 0 (i32.const 22)) (i32.const 3)
)
)
)
(func (export "as-call_indirect-last") (result i32)
(block (result i32)
(call_indirect (type $sig)
(i32.const 0)
(i32.const 1) (i32.const 2) (br 0 (i32.const 23))
)
)
)
(func (export "as-set_local-value") (result i32) (local f32)
(block (result i32) (set_local 0 (br 0 (i32.const 17))) (i32.const -1))
)
(memory 1)
(func (export "as-load-address") (result f32)
(block (result f32) (f32.load (br 0 (f32.const 1.7))))
)
(func (export "as-loadN-address") (result i64)
(block (result i64) (i64.load8_s (br 0 (i64.const 30))))
)
(func (export "as-store-address") (result i32)
(block (result i32)
(f64.store (br 0 (i32.const 30)) (f64.const 7)) (i32.const -1)
)
)
(func (export "as-store-value") (result i32)
(block (result i32)
(i64.store (i32.const 2) (br 0 (i32.const 31))) (i32.const -1)
)
)
(func (export "as-storeN-address") (result i32)
(block (result i32)
(i32.store8 (br 0 (i32.const 32)) (i32.const 7)) (i32.const -1)
)
)
(func (export "as-storeN-value") (result i32)
(block (result i32)
(i64.store16 (i32.const 2) (br 0 (i32.const 33))) (i32.const -1)
)
)
(func (export "as-unary-operand") (result f32)
(block (result f32) (f32.neg (br 0 (f32.const 3.4))))
)
(func (export "as-binary-left") (result i32)
(block (result i32) (i32.add (br 0 (i32.const 3)) (i32.const 10)))
)
(func (export "as-binary-right") (result i64)
(block (result i64) (i64.sub (i64.const 10) (br 0 (i64.const 45))))
)
(func (export "as-test-operand") (result i32)
(block (result i32) (i32.eqz (br 0 (i32.const 44))))
)
(func (export "as-compare-left") (result i32)
(block (result i32) (f64.le (br 0 (i32.const 43)) (f64.const 10)))
)
(func (export "as-compare-right") (result i32)
(block (result i32) (f32.ne (f32.const 10) (br 0 (i32.const 42))))
)
(func (export "as-convert-operand") (result i32)
(block (result i32) (i32.wrap/i64 (br 0 (i32.const 41))))
)
(func (export "as-grow_memory-size") (result i32)
(block (result i32) (grow_memory (br 0 (i32.const 40))))
)
(func (export "nested-block-value") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(call $dummy)
(i32.add (i32.const 4) (br 0 (i32.const 8)))
)
)
)
(func (export "nested-br-value") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop
(block (result i32)
(drop (i32.const 4))
(br 0 (br 1 (i32.const 8)))
)
)
(i32.const 16)
)
)
)
(func (export "nested-br_if-value") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop
(block (result i32)
(drop (i32.const 4))
(drop (br_if 0 (br 1 (i32.const 8)) (i32.const 1)))
(i32.const 32)
)
)
(i32.const 16)
)
)
)
(func (export "nested-br_if-value-cond") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop (br_if 0 (i32.const 4) (br 0 (i32.const 8))))
(i32.const 16)
)
)
)
(func (export "nested-br_table-value") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop
(block (result i32)
(drop (i32.const 4))
(br_table 0 (br 1 (i32.const 8)) (i32.const 1))
)
)
(i32.const 16)
)
)
)
(func (export "nested-br_table-value-index") (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(br_table 0 (i32.const 4) (br 0 (i32.const 8)))
(i32.const 16)
)
)
)
)
+150
View File
@@ -0,0 +1,150 @@
;; Test `br_if` operator
(module
(func $dummy)
(func (export "as-block-first") (param i32) (result i32)
(block (br_if 0 (get_local 0)) (return (i32.const 2))) (i32.const 3)
)
(func (export "as-block-mid") (param i32) (result i32)
(block (call $dummy) (br_if 0 (get_local 0)) (return (i32.const 2)))
(i32.const 3)
)
(func (export "as-block-last") (param i32)
(block (call $dummy) (call $dummy) (br_if 0 (get_local 0)))
)
(func (export "as-block-first-value") (param i32) (result i32)
(block (result i32)
(drop (br_if 0 (i32.const 10) (get_local 0))) (return (i32.const 11))
)
)
(func (export "as-block-mid-value") (param i32) (result i32)
(block (result i32)
(call $dummy)
(drop (br_if 0 (i32.const 20) (get_local 0)))
(return (i32.const 21))
)
)
(func (export "as-block-last-value") (param i32) (result i32)
(block (result i32)
(call $dummy) (call $dummy) (br_if 0 (i32.const 11) (get_local 0))
)
)
(func (export "as-loop-first") (param i32) (result i32)
(block (loop (br_if 1 (get_local 0)) (return (i32.const 2)))) (i32.const 3)
)
(func (export "as-loop-mid") (param i32) (result i32)
(block (loop (call $dummy) (br_if 1 (get_local 0)) (return (i32.const 2))))
(i32.const 4)
)
(func (export "as-loop-last") (param i32)
(loop (call $dummy) (br_if 1 (get_local 0)))
)
(func (export "as-if-then") (param i32 i32)
(block
(if (get_local 0) (then (br_if 1 (get_local 1))) (else (call $dummy)))
)
)
(func (export "as-if-else") (param i32 i32)
(block
(if (get_local 0) (then (call $dummy)) (else (br_if 1 (get_local 1))))
)
)
(func (export "nested-block-value") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(i32.add
(i32.const 4)
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0)))
(i32.const 16)
)
)
)
)
)
(func (export "nested-br-value") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(br 0
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0))) (i32.const 4)
)
)
(i32.const 16)
)
)
)
(func (export "nested-br_if-value") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop (br_if 0
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0))) (i32.const 4)
)
(i32.const 1)
))
(i32.const 16)
)
)
)
(func (export "nested-br_if-value-cond") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(drop (br_if 0
(i32.const 4)
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0))) (i32.const 1)
)
))
(i32.const 16)
)
)
)
(func (export "nested-br_table-value") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(br_table 0
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0))) (i32.const 4)
)
(i32.const 1)
)
(i32.const 16)
)
)
)
(func (export "nested-br_table-value-index") (param i32) (result i32)
(i32.add
(i32.const 1)
(block (result i32)
(drop (i32.const 2))
(br_table 0
(i32.const 4)
(block (result i32)
(drop (br_if 1 (i32.const 8) (get_local 0))) (i32.const 1)
)
)
(i32.const 16)
)
)
)
)
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
(module
(func (export "br") (block (br 0)))
(func (export "br_if") (block (br_if 0 (i32.const 1))))
(func (export "br_table") (block (br_table 0 (i32.const 0))))
)
+109
View File
@@ -0,0 +1,109 @@
;; Test `call` operator
(module
;; Auxiliary definitions
(func $const-i32 (result i32) (i32.const 0x132))
(func $const-i64 (result i64) (i64.const 0x164))
(func $const-f32 (result f32) (f32.const 0xf32))
(func $const-f64 (result f64) (f64.const 0xf64))
(func $id-i32 (param i32) (result i32) (get_local 0))
(func $id-i64 (param i64) (result i64) (get_local 0))
(func $id-f32 (param f32) (result f32) (get_local 0))
(func $id-f64 (param f64) (result f64) (get_local 0))
(func $f32-i32 (param f32 i32) (result i32) (get_local 1))
(func $i32-i64 (param i32 i64) (result i64) (get_local 1))
(func $f64-f32 (param f64 f32) (result f32) (get_local 1))
(func $i64-f64 (param i64 f64) (result f64) (get_local 1))
;; Typing
(func (export "type-i32") (result i32) (call $const-i32))
(func (export "type-i64") (result i64) (call $const-i64))
(func (export "type-f32") (result f32) (call $const-f32))
(func (export "type-f64") (result f64) (call $const-f64))
(func (export "type-first-i32") (result i32) (call $id-i32 (i32.const 32)))
(func (export "type-first-i64") (result i64) (call $id-i64 (i64.const 64)))
(func (export "type-first-f32") (result f32) (call $id-f32 (f32.const 1.32)))
(func (export "type-first-f64") (result f64) (call $id-f64 (f64.const 1.64)))
(func (export "type-second-i32") (result i32)
(call $f32-i32 (f32.const 32.1) (i32.const 32))
)
(func (export "type-second-i64") (result i64)
(call $i32-i64 (i32.const 32) (i64.const 64))
)
(func (export "type-second-f32") (result f32)
(call $f64-f32 (f64.const 64) (f32.const 32))
)
(func (export "type-second-f64") (result f64)
(call $i64-f64 (i64.const 64) (f64.const 64.1))
)
;; Recursion
(func $fac (export "fac") (param i64) (result i64)
(if (result i64) (i64.eqz (get_local 0))
(then (i64.const 1))
(else
(i64.mul
(get_local 0)
(call $fac (i64.sub (get_local 0) (i64.const 1)))
)
)
)
)
(func $fac-acc (export "fac-acc") (param i64 i64) (result i64)
(if (result i64) (i64.eqz (get_local 0))
(then (get_local 1))
(else
(call $fac-acc
(i64.sub (get_local 0) (i64.const 1))
(i64.mul (get_local 0) (get_local 1))
)
)
)
)
(func $fib (export "fib") (param i64) (result i64)
(if (result i64) (i64.le_u (get_local 0) (i64.const 1))
(then (i64.const 1))
(else
(i64.add
(call $fib (i64.sub (get_local 0) (i64.const 2)))
(call $fib (i64.sub (get_local 0) (i64.const 1)))
)
)
)
)
(func $even (export "even") (param i64) (result i32)
(if (result i32) (i64.eqz (get_local 0))
(then (i32.const 44))
(else (call $odd (i64.sub (get_local 0) (i64.const 1))))
)
)
(func $odd (export "odd") (param i64) (result i32)
(if (result i32) (i64.eqz (get_local 0))
(then (i32.const 99))
(else (call $even (i64.sub (get_local 0) (i64.const 1))))
)
)
;; Stack exhaustion
;; Implementations are required to have every call consume some abstract
;; resource towards exhausting some abstract finite limit, such that
;; infinitely recursive test cases reliably trap in finite time. This is
;; because otherwise applications could come to depend on it on those
;; implementations and be incompatible with implementations that don't do
;; it (or don't do it under the same circumstances).
(func $runaway (export "runaway") (call $runaway))
(func $mutual-runaway1 (export "mutual-runaway") (call $mutual-runaway2))
(func $mutual-runaway2 (call $mutual-runaway1))
)
+209
View File
@@ -0,0 +1,209 @@
;; Test `call_indirect` operator
(module
;; Auxiliary definitions
(type $proc (func))
(type $out-i32 (func (result i32)))
(type $out-i64 (func (result i64)))
(type $out-f32 (func (result f32)))
(type $out-f64 (func (result f64)))
(type $over-i32 (func (param i32) (result i32)))
(type $over-i64 (func (param i64) (result i64)))
(type $over-f32 (func (param f32) (result f32)))
(type $over-f64 (func (param f64) (result f64)))
(type $f32-i32 (func (param f32 i32) (result i32)))
(type $i32-i64 (func (param i32 i64) (result i64)))
(type $f64-f32 (func (param f64 f32) (result f32)))
(type $i64-f64 (func (param i64 f64) (result f64)))
(type $over-i32-duplicate (func (param i32) (result i32)))
(type $over-i64-duplicate (func (param i64) (result i64)))
(type $over-f32-duplicate (func (param f32) (result f32)))
(type $over-f64-duplicate (func (param f64) (result f64)))
(func $const-i32 (type $out-i32) (i32.const 0x132))
(func $const-i64 (type $out-i64) (i64.const 0x164))
(func $const-f32 (type $out-f32) (f32.const 0xf32))
(func $const-f64 (type $out-f64) (f64.const 0xf64))
(func $id-i32 (type $over-i32) (get_local 0))
(func $id-i64 (type $over-i64) (get_local 0))
(func $id-f32 (type $over-f32) (get_local 0))
(func $id-f64 (type $over-f64) (get_local 0))
(func $i32-i64 (type $i32-i64) (get_local 1))
(func $i64-f64 (type $i64-f64) (get_local 1))
(func $f32-i32 (type $f32-i32) (get_local 1))
(func $f64-f32 (type $f64-f32) (get_local 1))
(func $over-i32-duplicate (type $over-i32-duplicate) (get_local 0))
(func $over-i64-duplicate (type $over-i64-duplicate) (get_local 0))
(func $over-f32-duplicate (type $over-f32-duplicate) (get_local 0))
(func $over-f64-duplicate (type $over-f64-duplicate) (get_local 0))
(table anyfunc
(elem
$const-i32 $const-i64 $const-f32 $const-f64
$id-i32 $id-i64 $id-f32 $id-f64
$f32-i32 $i32-i64 $f64-f32 $i64-f64
$fac $fib $even $odd
$runaway $mutual-runaway1 $mutual-runaway2
$over-i32-duplicate $over-i64-duplicate
$over-f32-duplicate $over-f64-duplicate
)
)
;; Syntax
(func
(call_indirect (i32.const 0))
(call_indirect (param i64) (i64.const 0) (i32.const 0))
(call_indirect (param i64) (param) (param f64 i32 i64)
(i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0)
)
(call_indirect (result) (i32.const 0))
(drop (i32.eqz (call_indirect (result i32) (i32.const 0))))
(drop (i32.eqz (call_indirect (result i32) (result) (i32.const 0))))
(drop (i32.eqz
(call_indirect (param i64) (result i32) (i64.const 0) (i32.const 0))
))
(drop (i32.eqz
(call_indirect
(param) (param i64) (param) (param f64 i32 i64) (param) (param)
(result) (result i32) (result) (result)
(i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i32.const 0)
)
))
(drop (i64.eqz
(call_indirect (type $over-i64) (param i64) (result i64)
(i64.const 0) (i32.const 0)
)
))
)
;; Typing
(func (export "type-i32") (result i32)
(call_indirect (type $out-i32) (i32.const 0))
)
(func (export "type-i64") (result i64)
(call_indirect (type $out-i64) (i32.const 1))
)
(func (export "type-f32") (result f32)
(call_indirect (type $out-f32) (i32.const 2))
)
(func (export "type-f64") (result f64)
(call_indirect (type $out-f64) (i32.const 3))
)
(func (export "type-index") (result i64)
(call_indirect (type $over-i64) (i64.const 100) (i32.const 5))
)
(func (export "type-first-i32") (result i32)
(call_indirect (type $over-i32) (i32.const 32) (i32.const 4))
)
(func (export "type-first-i64") (result i64)
(call_indirect (type $over-i64) (i64.const 64) (i32.const 5))
)
(func (export "type-first-f32") (result f32)
(call_indirect (type $over-f32) (f32.const 1.32) (i32.const 6))
)
(func (export "type-first-f64") (result f64)
(call_indirect (type $over-f64) (f64.const 1.64) (i32.const 7))
)
(func (export "type-second-i32") (result i32)
(call_indirect (type $f32-i32) (f32.const 32.1) (i32.const 32) (i32.const 8))
)
(func (export "type-second-i64") (result i64)
(call_indirect (type $i32-i64) (i32.const 32) (i64.const 64) (i32.const 9))
)
(func (export "type-second-f32") (result f32)
(call_indirect (type $f64-f32) (f64.const 64) (f32.const 32) (i32.const 10))
)
(func (export "type-second-f64") (result f64)
(call_indirect (type $i64-f64) (i64.const 64) (f64.const 64.1) (i32.const 11))
)
;; Dispatch
(func (export "dispatch") (param i32 i64) (result i64)
(call_indirect (type $over-i64) (get_local 1) (get_local 0))
)
(func (export "dispatch-structural") (param i32) (result i64)
(call_indirect (type $over-i64-duplicate) (i64.const 9) (get_local 0))
)
;; Recursion
(func $fac (export "fac") (type $over-i64)
(if (result i64) (i64.eqz (get_local 0))
(then (i64.const 1))
(else
(i64.mul
(get_local 0)
(call_indirect (type $over-i64)
(i64.sub (get_local 0) (i64.const 1))
(i32.const 12)
)
)
)
)
)
(func $fib (export "fib") (type $over-i64)
(if (result i64) (i64.le_u (get_local 0) (i64.const 1))
(then (i64.const 1))
(else
(i64.add
(call_indirect (type $over-i64)
(i64.sub (get_local 0) (i64.const 2))
(i32.const 13)
)
(call_indirect (type $over-i64)
(i64.sub (get_local 0) (i64.const 1))
(i32.const 13)
)
)
)
)
)
(func $even (export "even") (param i32) (result i32)
(if (result i32) (i32.eqz (get_local 0))
(then (i32.const 44))
(else
(call_indirect (type $over-i32)
(i32.sub (get_local 0) (i32.const 1))
(i32.const 15)
)
)
)
)
(func $odd (export "odd") (param i32) (result i32)
(if (result i32) (i32.eqz (get_local 0))
(then (i32.const 99))
(else
(call_indirect (type $over-i32)
(i32.sub (get_local 0) (i32.const 1))
(i32.const 14)
)
)
)
)
;; Stack exhaustion
;; Implementations are required to have every call consume some abstract
;; resource towards exhausting some abstract finite limit, such that
;; infinitely recursive test cases reliably trap in finite time. This is
;; because otherwise applications could come to depend on it on those
;; implementations and be incompatible with implementations that don't do
;; it (or don't do it under the same circumstances).
(func $runaway (export "runaway") (call_indirect (type $proc) (i32.const 16)))
(func $mutual-runaway1 (export "mutual-runaway") (call_indirect (type $proc) (i32.const 18)))
(func $mutual-runaway2 (call_indirect (type $proc) (i32.const 17)))
)
+73
View File
@@ -0,0 +1,73 @@
;; Test comment syntax
;;comment
;;;;;;;;;;;
;;comment
( ;;comment
module;;comment
);;comment
;;)
;;;)
;; ;)
;; (;
(;;)
(;comment;)
(;;comment;)
(;;;comment;)
(;;;;;;;;;;;;;;)
(;(((((((((( ;)
(;)))))))))));)
(;comment";)
(;comment"";)
(;comment""";)
;; ASCII 00-1F, 7F
(;
;)
(;Heiße Würstchen;)
(;;)
(;comment
comment;)
(;comment;)
(;comment;)((;comment;)
(;comment;)module(;comment;)
(;comment;))(;comment;)
(;comment(;nested;)comment;)
(;comment
(;nested
;)comment
;)
(module
(;comment(;nested(;further;)nested;)comment;)
)
(;comment;;comment;)
(;comment;;comment
;)
(module
(;comment;;comment(;nested;)comment;)
)
+27
View File
@@ -0,0 +1,27 @@
(module
(func (export "i64.extend_s_i32") (param $x i32) (result i64) (i64.extend_s/i32 (get_local $x)))
(func (export "i64.extend_u_i32") (param $x i32) (result i64) (i64.extend_u/i32 (get_local $x)))
(func (export "i32.wrap_i64") (param $x i64) (result i32) (i32.wrap/i64 (get_local $x)))
(func (export "i32.trunc_s_f32") (param $x f32) (result i32) (i32.trunc_s/f32 (get_local $x)))
(func (export "i32.trunc_u_f32") (param $x f32) (result i32) (i32.trunc_u/f32 (get_local $x)))
(func (export "i32.trunc_s_f64") (param $x f64) (result i32) (i32.trunc_s/f64 (get_local $x)))
(func (export "i32.trunc_u_f64") (param $x f64) (result i32) (i32.trunc_u/f64 (get_local $x)))
(func (export "i64.trunc_s_f32") (param $x f32) (result i64) (i64.trunc_s/f32 (get_local $x)))
(func (export "i64.trunc_u_f32") (param $x f32) (result i64) (i64.trunc_u/f32 (get_local $x)))
(func (export "i64.trunc_s_f64") (param $x f64) (result i64) (i64.trunc_s/f64 (get_local $x)))
(func (export "i64.trunc_u_f64") (param $x f64) (result i64) (i64.trunc_u/f64 (get_local $x)))
(func (export "f32.convert_s_i32") (param $x i32) (result f32) (f32.convert_s/i32 (get_local $x)))
(func (export "f32.convert_s_i64") (param $x i64) (result f32) (f32.convert_s/i64 (get_local $x)))
(func (export "f64.convert_s_i32") (param $x i32) (result f64) (f64.convert_s/i32 (get_local $x)))
(func (export "f64.convert_s_i64") (param $x i64) (result f64) (f64.convert_s/i64 (get_local $x)))
(func (export "f32.convert_u_i32") (param $x i32) (result f32) (f32.convert_u/i32 (get_local $x)))
(func (export "f32.convert_u_i64") (param $x i64) (result f32) (f32.convert_u/i64 (get_local $x)))
(func (export "f64.convert_u_i32") (param $x i32) (result f64) (f64.convert_u/i32 (get_local $x)))
(func (export "f64.convert_u_i64") (param $x i64) (result f64) (f64.convert_u/i64 (get_local $x)))
(func (export "f64.promote_f32") (param $x f32) (result f64) (f64.promote/f32 (get_local $x)))
(func (export "f32.demote_f64") (param $x f64) (result f32) (f32.demote/f64 (get_local $x)))
(func (export "f32.reinterpret_i32") (param $x i32) (result f32) (f32.reinterpret/i32 (get_local $x)))
(func (export "f64.reinterpret_i64") (param $x i64) (result f64) (f64.reinterpret/i64 (get_local $x)))
(func (export "i32.reinterpret_f32") (param $x f32) (result i32) (i32.reinterpret/f32 (get_local $x)))
(func (export "i64.reinterpret_f64") (param $x f64) (result i64) (i64.reinterpret/f64 (get_local $x)))
)
+131
View File
@@ -0,0 +1,131 @@
(module
(memory 1)
;; Stores an i16 value in little-endian-format
(func $i16_store_little (param $address i32) (param $value i32)
(i32.store8 (get_local $address) (get_local $value))
(i32.store8 (i32.add (get_local $address) (i32.const 1)) (i32.shr_u (get_local $value) (i32.const 8)))
)
;; Stores an i32 value in little-endian format
(func $i32_store_little (param $address i32) (param $value i32)
(call $i16_store_little (get_local $address) (get_local $value))
(call $i16_store_little (i32.add (get_local $address) (i32.const 2)) (i32.shr_u (get_local $value) (i32.const 16)))
)
;; Stores an i64 value in little-endian format
(func $i64_store_little (param $address i32) (param $value i64)
(call $i32_store_little (get_local $address) (i32.wrap/i64 (get_local $value)))
(call $i32_store_little (i32.add (get_local $address) (i32.const 4)) (i32.wrap/i64 (i64.shr_u (get_local $value) (i64.const 32))))
)
;; Loads an i16 value in little-endian format
(func $i16_load_little (param $address i32) (result i32)
(i32.or
(i32.load8_u (get_local $address))
(i32.shl (i32.load8_u (i32.add (get_local $address) (i32.const 1))) (i32.const 8))
)
)
;; Loads an i32 value in little-endian format
(func $i32_load_little (param $address i32) (result i32)
(i32.or
(call $i16_load_little (get_local $address))
(i32.shl (call $i16_load_little (i32.add (get_local $address) (i32.const 2))) (i32.const 16))
)
)
;; Loads an i64 value in little-endian format
(func $i64_load_little (param $address i32) (result i64)
(i64.or
(i64.extend_u/i32 (call $i32_load_little (get_local $address)))
(i64.shl (i64.extend_u/i32 (call $i32_load_little (i32.add (get_local $address) (i32.const 4)))) (i64.const 32))
)
)
(func (export "i32_load16_s") (param $value i32) (result i32)
(call $i16_store_little (i32.const 0) (get_local $value))
(i32.load16_s (i32.const 0))
)
(func (export "i32_load16_u") (param $value i32) (result i32)
(call $i16_store_little (i32.const 0) (get_local $value))
(i32.load16_u (i32.const 0))
)
(func (export "i32_load") (param $value i32) (result i32)
(call $i32_store_little (i32.const 0) (get_local $value))
(i32.load (i32.const 0))
)
(func (export "i64_load16_s") (param $value i64) (result i64)
(call $i16_store_little (i32.const 0) (i32.wrap/i64 (get_local $value)))
(i64.load16_s (i32.const 0))
)
(func (export "i64_load16_u") (param $value i64) (result i64)
(call $i16_store_little (i32.const 0) (i32.wrap/i64 (get_local $value)))
(i64.load16_u (i32.const 0))
)
(func (export "i64_load32_s") (param $value i64) (result i64)
(call $i32_store_little (i32.const 0) (i32.wrap/i64 (get_local $value)))
(i64.load32_s (i32.const 0))
)
(func (export "i64_load32_u") (param $value i64) (result i64)
(call $i32_store_little (i32.const 0) (i32.wrap/i64 (get_local $value)))
(i64.load32_u (i32.const 0))
)
(func (export "i64_load") (param $value i64) (result i64)
(call $i64_store_little (i32.const 0) (get_local $value))
(i64.load (i32.const 0))
)
(func (export "f32_load") (param $value f32) (result f32)
(call $i32_store_little (i32.const 0) (i32.reinterpret/f32 (get_local $value)))
(f32.load (i32.const 0))
)
(func (export "f64_load") (param $value f64) (result f64)
(call $i64_store_little (i32.const 0) (i64.reinterpret/f64 (get_local $value)))
(f64.load (i32.const 0))
)
(func (export "i32_store16") (param $value i32) (result i32)
(i32.store16 (i32.const 0) (get_local $value))
(call $i16_load_little (i32.const 0))
)
(func (export "i32_store") (param $value i32) (result i32)
(i32.store (i32.const 0) (get_local $value))
(call $i32_load_little (i32.const 0))
)
(func (export "i64_store16") (param $value i64) (result i64)
(i64.store16 (i32.const 0) (get_local $value))
(i64.extend_u/i32 (call $i16_load_little (i32.const 0)))
)
(func (export "i64_store32") (param $value i64) (result i64)
(i64.store32 (i32.const 0) (get_local $value))
(i64.extend_u/i32 (call $i32_load_little (i32.const 0)))
)
(func (export "i64_store") (param $value i64) (result i64)
(i64.store (i32.const 0) (get_local $value))
(call $i64_load_little (i32.const 0))
)
(func (export "f32_store") (param $value f32) (result f32)
(f32.store (i32.const 0) (get_local $value))
(f32.reinterpret/i32 (call $i32_load_little (i32.const 0)))
)
(func (export "f64_store") (param $value f64) (result f64)
(f64.store (i32.const 0) (get_local $value))
(f64.reinterpret/i64 (call $i64_load_little (i32.const 0)))
)
)
+82
View File
@@ -0,0 +1,82 @@
(module
;; Recursive factorial
(func (export "fac-rec") (param i64) (result i64)
(if (result i64) (i64.eq (get_local 0) (i64.const 0))
(then (i64.const 1))
(else
(i64.mul (get_local 0) (call 0 (i64.sub (get_local 0) (i64.const 1))))
)
)
)
;; Recursive factorial named
(func $fac-rec-named (export "fac-rec-named") (param $n i64) (result i64)
(if (result i64) (i64.eq (get_local $n) (i64.const 0))
(then (i64.const 1))
(else
(i64.mul
(get_local $n)
(call $fac-rec-named (i64.sub (get_local $n) (i64.const 1)))
)
)
)
)
;; Iterative factorial
(func (export "fac-iter") (param i64) (result i64)
(local i64 i64)
(set_local 1 (get_local 0))
(set_local 2 (i64.const 1))
(block
(loop
(if
(i64.eq (get_local 1) (i64.const 0))
(then (br 2))
(else
(set_local 2 (i64.mul (get_local 1) (get_local 2)))
(set_local 1 (i64.sub (get_local 1) (i64.const 1)))
)
)
(br 0)
)
)
(get_local 2)
)
;; Iterative factorial named
(func (export "fac-iter-named") (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)
)
;; Optimized factorial.
(func (export "fac-opt") (param i64) (result i64)
(local i64)
(set_local 1 (i64.const 1))
(block
(br_if 0 (i64.lt_s (get_local 0) (i64.const 2)))
(loop
(set_local 1 (i64.mul (get_local 1) (get_local 0)))
(set_local 0 (i64.add (get_local 0) (i64.const -1)))
(br_if 0 (i64.gt_s (get_local 0) (i64.const 1)))
)
)
(get_local 1)
)
)
+169
View File
@@ -0,0 +1,169 @@
;; Test `func` declarations, i.e. functions
(module
;; Auxiliary definition
(type $sig (func))
(func $dummy)
;; Syntax
(func)
(func (export "f"))
(func $f)
(func $h (export "g"))
(func (local))
(func (local) (local))
(func (local i32))
(func (local $x i32))
(func (local i32 f64 i64))
(func (local i32) (local f64))
(func (local i32 f32) (local $x i64) (local) (local i32 f64))
(func (param))
(func (param) (param))
(func (param i32))
(func (param $x i32))
(func (param i32 f64 i64))
(func (param i32) (param f64))
(func (param i32 f32) (param $x i64) (param) (param i32 f64))
(func (result i32) (unreachable))
(type $sig-1 (func))
(type $sig-2 (func (result i32)))
(type $sig-3 (func (param $x i32)))
(type $sig-4 (func (param i32 f64 i32) (result i32)))
(func (export "type-use-1") (type $sig-1))
(func (export "type-use-2") (type $sig-2) (i32.const 0))
(func (export "type-use-3") (type $sig-3))
(func (export "type-use-4") (type $sig-4) (i32.const 0))
(func (export "type-use-5") (type $sig-2) (result i32) (i32.const 0))
(func (export "type-use-6") (type $sig-3) (param i32))
(func (export "type-use-7")
(type $sig-4) (param i32) (param f64 i32) (result i32) (i32.const 0)
)
(func (type $sig))
(func (type $forward)) ;; forward reference
(func $complex
(param i32 f32) (param $x i64) (param) (param i32)
(result) (result i32) (result)
(local f32) (local $y i32) (local i64 i32) (local) (local f64 i32)
(unreachable) (unreachable)
)
(func $complex-sig
(type $sig)
(local f32) (local $y i32) (local i64 i32) (local) (local f64 i32)
(unreachable) (unreachable)
)
(type $forward (func))
;; Typing of locals
(func (export "local-first-i32") (result i32) (local i32 i32) (get_local 0))
(func (export "local-first-i64") (result i64) (local i64 i64) (get_local 0))
(func (export "local-first-f32") (result f32) (local f32 f32) (get_local 0))
(func (export "local-first-f64") (result f64) (local f64 f64) (get_local 0))
(func (export "local-second-i32") (result i32) (local i32 i32) (get_local 1))
(func (export "local-second-i64") (result i64) (local i64 i64) (get_local 1))
(func (export "local-second-f32") (result f32) (local f32 f32) (get_local 1))
(func (export "local-second-f64") (result f64) (local f64 f64) (get_local 1))
(func (export "local-mixed") (result f64)
(local f32) (local $x i32) (local i64 i32) (local) (local f64 i32)
(drop (f32.neg (get_local 0)))
(drop (i32.eqz (get_local 1)))
(drop (i64.eqz (get_local 2)))
(drop (i32.eqz (get_local 3)))
(drop (f64.neg (get_local 4)))
(drop (i32.eqz (get_local 5)))
(get_local 4)
)
;; Typing of parameters
(func (export "param-first-i32") (param i32 i32) (result i32) (get_local 0))
(func (export "param-first-i64") (param i64 i64) (result i64) (get_local 0))
(func (export "param-first-f32") (param f32 f32) (result f32) (get_local 0))
(func (export "param-first-f64") (param f64 f64) (result f64) (get_local 0))
(func (export "param-second-i32") (param i32 i32) (result i32) (get_local 1))
(func (export "param-second-i64") (param i64 i64) (result i64) (get_local 1))
(func (export "param-second-f32") (param f32 f32) (result f32) (get_local 1))
(func (export "param-second-f64") (param f64 f64) (result f64) (get_local 1))
(func (export "param-mixed") (param f32 i32) (param) (param $x i64) (param i32 f64 i32)
(result f64)
(drop (f32.neg (get_local 0)))
(drop (i32.eqz (get_local 1)))
(drop (i64.eqz (get_local 2)))
(drop (i32.eqz (get_local 3)))
(drop (f64.neg (get_local 4)))
(drop (i32.eqz (get_local 5)))
(get_local 4)
)
;; Typing of result
(func (export "empty"))
(func (export "value-void") (call $dummy))
(func (export "value-i32") (result i32) (i32.const 77))
(func (export "value-i64") (result i64) (i64.const 7777))
(func (export "value-f32") (result f32) (f32.const 77.7))
(func (export "value-f64") (result f64) (f64.const 77.77))
(func (export "value-block-void") (block (call $dummy) (call $dummy)))
(func (export "value-block-i32") (result i32)
(block (result i32) (call $dummy) (i32.const 77))
)
(func (export "return-empty") (return))
(func (export "return-i32") (result i32) (return (i32.const 78)))
(func (export "return-i64") (result i64) (return (i64.const 7878)))
(func (export "return-f32") (result f32) (return (f32.const 78.7)))
(func (export "return-f64") (result f64) (return (f64.const 78.78)))
(func (export "return-block-i32") (result i32)
(return (block (result i32) (call $dummy) (i32.const 77)))
)
(func (export "break-empty") (br 0))
(func (export "break-i32") (result i32) (br 0 (i32.const 79)))
(func (export "break-i64") (result i64) (br 0 (i64.const 7979)))
(func (export "break-f32") (result f32) (br 0 (f32.const 79.9)))
(func (export "break-f64") (result f64) (br 0 (f64.const 79.79)))
(func (export "break-block-i32") (result i32)
(br 0 (block (result i32) (call $dummy) (i32.const 77)))
)
(func (export "break-br_if-empty") (param i32)
(br_if 0 (get_local 0))
)
(func (export "break-br_if-num") (param i32) (result i32)
(drop (br_if 0 (i32.const 50) (get_local 0))) (i32.const 51)
)
(func (export "break-br_table-empty") (param i32)
(br_table 0 0 0 (get_local 0))
)
(func (export "break-br_table-num") (param i32) (result i32)
(br_table 0 0 (i32.const 50) (get_local 0)) (i32.const 51)
)
(func (export "break-br_table-nested-empty") (param i32)
(block (br_table 0 1 0 (get_local 0)))
)
(func (export "break-br_table-nested-num") (param i32) (result i32)
(i32.add
(block (result i32)
(br_table 0 1 0 (i32.const 50) (get_local 0)) (i32.const 51)
)
(i32.const 2)
)
)
;; Default initialization of locals
(func (export "init-local-i32") (result i32) (local i32) (get_local 0))
(func (export "init-local-i64") (result i64) (local i64) (get_local 0))
(func (export "init-local-f32") (result f32) (local f32) (get_local 0))
(func (export "init-local-f64") (result f64) (local f64) (get_local 0))
)
+25
View File
@@ -0,0 +1,25 @@
(module
(type (func)) ;; 0: void -> void
(type $S (func)) ;; 1: void -> void
(type (func (param))) ;; 2: void -> void
(type (func (result i32))) ;; 3: void -> i32
(type (func (param) (result i32))) ;; 4: void -> i32
(type $T (func (param i32) (result i32))) ;; 5: i32 -> i32
(type $U (func (param i32))) ;; 6: i32 -> void
(func $print (import "spectest" "print") (type 6))
(func (type 0))
(func (type $S))
(func (export "one") (type 4) (i32.const 13))
(func (export "two") (type $T) (i32.add (get_local 0) (i32.const 1)))
;; Both signature and parameters are allowed (and required to match)
;; since this allows the naming of parameters.
(func (export "three") (type $T) (param $a i32) (result i32)
(i32.sub (get_local 0) (i32.const 2))
)
(func (export "four") (type $U) (call $print (get_local 0)))
)
+62
View File
@@ -0,0 +1,62 @@
;; Test `get_local` operator
(module
;; Typing
(func (export "type-local-i32") (result i32) (local i32) (get_local 0))
(func (export "type-local-i64") (result i64) (local i64) (get_local 0))
(func (export "type-local-f32") (result f32) (local f32) (get_local 0))
(func (export "type-local-f64") (result f64) (local f64) (get_local 0))
(func (export "type-param-i32") (param i32) (result i32) (get_local 0))
(func (export "type-param-i64") (param i64) (result i64) (get_local 0))
(func (export "type-param-f32") (param f32) (result f32) (get_local 0))
(func (export "type-param-f64") (param f64) (result f64) (get_local 0))
(func (export "type-mixed") (param i64 f32 f64 i32 i32)
(local f32 i64 i64 f64)
(drop (i64.eqz (get_local 0)))
(drop (f32.neg (get_local 1)))
(drop (f64.neg (get_local 2)))
(drop (i32.eqz (get_local 3)))
(drop (i32.eqz (get_local 4)))
(drop (f32.neg (get_local 5)))
(drop (i64.eqz (get_local 6)))
(drop (i64.eqz (get_local 7)))
(drop (f64.neg (get_local 8)))
)
;; Reading
(func (export "read") (param i64 f32 f64 i32 i32) (result f64)
(local f32 i64 i64 f64)
(set_local 5 (f32.const 5.5))
(set_local 6 (i64.const 6))
(set_local 8 (f64.const 8))
(f64.add
(f64.convert_u/i64 (get_local 0))
(f64.add
(f64.promote/f32 (get_local 1))
(f64.add
(get_local 2)
(f64.add
(f64.convert_u/i32 (get_local 3))
(f64.add
(f64.convert_s/i32 (get_local 4))
(f64.add
(f64.promote/f32 (get_local 5))
(f64.add
(f64.convert_u/i64 (get_local 6))
(f64.add
(f64.convert_u/i64 (get_local 7))
(get_local 8)
)
)
)
)
)
)
)
)
)
)
+27
View File
@@ -0,0 +1,27 @@
;; Test globals
(module
(global $a i32 (i32.const -2))
(global (;1;) f32 (f32.const -3))
(global (;2;) f64 (f64.const -4))
(global $b i64 (i64.const -5))
(global $x (mut i32) (i32.const -12))
(global (;5;) (mut f32) (f32.const -13))
(global (;6;) (mut f64) (f64.const -14))
(global $y (mut i64) (i64.const -15))
(func (export "get-a") (result i32) (get_global $a))
(func (export "get-b") (result i64) (get_global $b))
(func (export "get-x") (result i32) (get_global $x))
(func (export "get-y") (result i64) (get_global $y))
(func (export "set-x") (param i32) (set_global $x (get_local 0)))
(func (export "set-y") (param i64) (set_global $y (get_local 0)))
(func (export "get-1") (result f32) (get_global 1))
(func (export "get-2") (result f64) (get_global 2))
(func (export "get-5") (result f32) (get_global 5))
(func (export "get-6") (result f64) (get_global 6))
(func (export "set-5") (param f32) (set_global 5 (get_local 0)))
(func (export "set-6") (param f64) (set_global 6 (get_local 0)))
)
+275
View File
@@ -0,0 +1,275 @@
(module
(func (export "block") (result i32)
(block $exit (result i32)
(br $exit (i32.const 1))
(i32.const 0)
)
)
(func (export "loop1") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block $exit (result i32)
(loop $cont (result i32)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if (i32.eq (get_local $i) (i32.const 5))
(then (br $exit (get_local $i)))
)
(br $cont)
)
)
)
(func (export "loop2") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block $exit (result i32)
(loop $cont (result i32)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if (i32.eq (get_local $i) (i32.const 5))
(then (br $cont))
)
(if (i32.eq (get_local $i) (i32.const 8))
(then (br $exit (get_local $i)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(br $cont)
)
)
)
(func (export "loop3") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block $exit (result i32)
(loop $cont (result i32)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if (i32.eq (get_local $i) (i32.const 5))
(then (br $exit (get_local $i)))
)
(get_local $i)
)
)
)
(func (export "loop4") (param $max i32) (result i32)
(local $i i32)
(set_local $i (i32.const 1))
(block $exit (result i32)
(loop $cont (result i32)
(set_local $i (i32.add (get_local $i) (get_local $i)))
(if (i32.gt_u (get_local $i) (get_local $max))
(then (br $exit (get_local $i)))
)
(br $cont)
)
)
)
(func (export "loop5") (result i32)
(i32.add
(loop $l (result i32) (i32.const 1))
(i32.const 1)
)
)
(func (export "if") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block
(if $l
(i32.const 1)
(then (br $l) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if $l
(i32.const 1)
(then (br $l) (set_local $i (i32.const 666)))
(else (set_local $i (i32.const 888)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if $l
(i32.const 1)
(then (br $l) (set_local $i (i32.const 666)))
(else (set_local $i (i32.const 888)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if $l
(i32.const 0)
(then (set_local $i (i32.const 888)))
(else (br $l) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if $l
(i32.const 0)
(then (set_local $i (i32.const 888)))
(else (br $l) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
)
(get_local $i)
)
(func (export "if2") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block
(if
(i32.const 1)
(then (br 0) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if
(i32.const 1)
(then (br 0) (set_local $i (i32.const 666)))
(else (set_local $i (i32.const 888)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if
(i32.const 1)
(then (br 0) (set_local $i (i32.const 666)))
(else (set_local $i (i32.const 888)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if
(i32.const 0)
(then (set_local $i (i32.const 888)))
(else (br 0) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
(if
(i32.const 0)
(then (set_local $i (i32.const 888)))
(else (br 0) (set_local $i (i32.const 666)))
)
(set_local $i (i32.add (get_local $i) (i32.const 1)))
)
(get_local $i)
)
(func (export "switch") (param i32) (result i32)
(block $ret (result i32)
(i32.mul (i32.const 10)
(block $exit (result i32)
(block $0
(block $default
(block $3
(block $2
(block $1
(br_table $0 $1 $2 $3 $default (get_local 0))
) ;; 1
) ;; 2
(br $exit (i32.const 2))
) ;; 3
(br $ret (i32.const 3))
) ;; default
) ;; 0
(i32.const 5)
)
)
)
)
(func (export "return") (param i32) (result i32)
(block $default
(block $1
(block $0
(br_table $0 $1 (get_local 0))
(br $default)
) ;; 0
(return (i32.const 0))
) ;; 1
) ;; default
(i32.const 2)
)
(func (export "br_if0") (result i32)
(local $i i32)
(set_local $i (i32.const 0))
(block $outer (result i32)
(block $inner
(br_if $inner (i32.const 0))
(set_local $i (i32.or (get_local $i) (i32.const 0x1)))
(br_if $inner (i32.const 1))
(set_local $i (i32.or (get_local $i) (i32.const 0x2)))
)
(drop (br_if $outer
(block (result i32)
(set_local $i (i32.or (get_local $i) (i32.const 0x4)))
(get_local $i)
)
(i32.const 0)
))
(set_local $i (i32.or (get_local $i) (i32.const 0x8)))
(drop (br_if $outer
(block (result i32)
(set_local $i (i32.or (get_local $i) (i32.const 0x10)))
(get_local $i)
)
(i32.const 1)
))
(set_local $i (i32.or (get_local $i) (i32.const 0x20))) (get_local $i)
)
)
(func (export "br_if1") (result i32)
(block $l0 (result i32)
(drop
(br_if $l0
(block $l1 (result i32) (br $l1 (i32.const 1)))
(i32.const 1)
)
)
(i32.const 1)
)
)
(func (export "br_if2") (result i32)
(block $l0 (result i32)
(if (i32.const 1)
(then (br $l0 (block $l1 (result i32) (br $l1 (i32.const 1)))))
)
(i32.const 1)
)
)
(func (export "br_if3") (result i32)
(local $i1 i32)
(drop
(i32.add
(block $l0 (result i32)
(drop (br_if $l0
(block (result i32) (set_local $i1 (i32.const 1)) (get_local $i1))
(block (result i32) (set_local $i1 (i32.const 2)) (get_local $i1))
))
(i32.const 0)
)
(i32.const 0)
)
)
(get_local $i1)
)
(func (export "br") (result i32)
(block $l0 (result i32)
(if (i32.const 1)
(then (br $l0 (block $l1 (result i32) (br $l1 (i32.const 1)))))
(else (block (drop (block $l1 (result i32) (br $l1 (i32.const 1))))))
)
(i32.const 1)
)
)
(func (export "shadowing") (result i32)
(block $l1 (result i32) (i32.xor (br $l1 (i32.const 1)) (i32.const 2)))
)
(func (export "redefinition") (result i32)
(block $l1 (result i32)
(i32.add
(block $l1 (result i32) (i32.const 2))
(block $l1 (result i32) (br $l1 (i32.const 3)))
)
)
)
)
-36
View File
@@ -1,36 +0,0 @@
(; Function definitions parsing ;)
(module
;; Auxiliary definition
(type $sig (func))
(func $dummy)
;; Syntax
(func)
(func (export "f") (import "extern_mod" "external_func") (param i32 i32) (result i64))
(func (export "fff") (import "extern_mod" "external_func") (type $sig) (param i32 i32) (result i64))
(func (import "extern_mod" "external_func") (type $sig))
(func $add (param $x i32) (param $y i32) (result i32) (i32.add (i32.const 20) (i32.const 22)))
(func (export "f"))
(func $f)
(func $h (export "g"))
(func (local))
(func (local) (local))
(func (local i32))
(func (local $x i32))
(func (local i32 f64 i64))
(func (local i32) (local f64))
(func $complex (local i32 f32) (local $x i64) (local) (local i32 f64))
(func (param))
(func (param) (param))
(func (param i32))
(func (param $x i32))
(func (param i32 f64 i64))
(func (param i32) (param f64))
(func (param i32 f32) (param $x i64) (param) (param i32 f64))
(func (result i32) (unreachable))
)
+118
View File
@@ -0,0 +1,118 @@
(module
;; Statement switch
(func (export "stmt") (param $i i32) (result i32)
(local $j i32)
(set_local $j (i32.const 100))
(block $switch
(block $7
(block $default
(block $6
(block $5
(block $4
(block $3
(block $2
(block $1
(block $0
(br_table $0 $1 $2 $3 $4 $5 $6 $7 $default
(get_local $i)
)
) ;; 0
(return (get_local $i))
) ;; 1
(nop)
;; fallthrough
) ;; 2
;; fallthrough
) ;; 3
(set_local $j (i32.sub (i32.const 0) (get_local $i)))
(br $switch)
) ;; 4
(br $switch)
) ;; 5
(set_local $j (i32.const 101))
(br $switch)
) ;; 6
(set_local $j (i32.const 101))
;; fallthrough
) ;; default
(set_local $j (i32.const 102))
) ;; 7
;; fallthrough
)
(return (get_local $j))
)
;; Expression switch
(func (export "expr") (param $i i64) (result i64)
(local $j i64)
(set_local $j (i64.const 100))
(return
(block $switch (result i64)
(block $7
(block $default
(block $4
(block $5
(block $6
(block $3
(block $2
(block $1
(block $0
(br_table $0 $1 $2 $3 $4 $5 $6 $7 $default
(i32.wrap/i64 (get_local $i))
)
) ;; 0
(return (get_local $i))
) ;; 1
(nop)
;; fallthrough
) ;; 2
;; fallthrough
) ;; 3
(br $switch (i64.sub (i64.const 0) (get_local $i)))
) ;; 6
(set_local $j (i64.const 101))
;; fallthrough
) ;; 4
;; fallthrough
) ;; 5
;; fallthrough
) ;; default
(br $switch (get_local $j))
) ;; 7
(i64.const -5)
)
)
)
;; Argument switch
(func (export "arg") (param $i i32) (result i32)
(return
(block $2 (result i32)
(i32.add (i32.const 10)
(block $1 (result i32)
(i32.add (i32.const 100)
(block $0 (result i32)
(i32.add (i32.const 1000)
(block $default (result i32)
(br_table $0 $1 $2 $default
(i32.mul (i32.const 2) (get_local $i))
(i32.and (i32.const 3) (get_local $i))
)
)
)
)
)
)
)
)
)
)
;; Corner cases
(func (export "corner") (result i32)
(block
(br_table 0 (i32.const 0))
)
(i32.const 1)
)
)