forked from GitHub/haskell-wasm
add more test files
This commit is contained in:
@@ -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)))
|
||||
)
|
||||
)
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -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
@@ -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))))
|
||||
)
|
||||
@@ -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))
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
@@ -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;)
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
)
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
@@ -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))
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
@@ -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)))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -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))
|
||||
)
|
||||
@@ -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)
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user