diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/binaryen.js/expressions.js | 3 | ||||
-rw-r--r-- | test/lit/basic/shared-i31.wast | 37 | ||||
-rw-r--r-- | test/spec/shared-i31.wast | 230 |
3 files changed, 267 insertions, 3 deletions
diff --git a/test/binaryen.js/expressions.js b/test/binaryen.js/expressions.js index bd8ec6793..c05e820a7 100644 --- a/test/binaryen.js/expressions.js +++ b/test/binaryen.js/expressions.js @@ -1777,9 +1777,6 @@ console.log("# RefI31"); theRefI31.value = value = module.local.get(2, binaryen.i32); assert(theRefI31.value === value); - theRefI31.type = binaryen.f64; - theRefI31.finalize(); - // assert(theRefI31.type === binaryen.?); // TODO: (ref i31) console.log(theRefI31.toText()); assert( diff --git a/test/lit/basic/shared-i31.wast b/test/lit/basic/shared-i31.wast new file mode 100644 index 000000000..b448bcad3 --- /dev/null +++ b/test/lit/basic/shared-i31.wast @@ -0,0 +1,37 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. + +;; RUN: wasm-opt %s -all -S -o - | filecheck %s +;; RUN: wasm-opt %s -all --roundtrip -S -o - | filecheck %s + +(module + ;; CHECK: (type $0 (func (param (ref null (shared i31))) (result i32))) + + ;; CHECK: (type $1 (func (param i32) (result (ref (shared i31))))) + + ;; CHECK: (func $make (type $1) (param $0 i32) (result (ref (shared i31))) + ;; CHECK-NEXT: (ref.i31_shared + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $make (param i32) (result (ref (shared i31))) + (ref.i31_shared (local.get 0)) + ) + + ;; CHECK: (func $get_s (type $0) (param $0 (ref null (shared i31))) (result i32) + ;; CHECK-NEXT: (i31.get_s + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $get_s (param (ref null (shared i31))) (result i32) + (i31.get_s (local.get 0)) + ) + + ;; CHECK: (func $get_u (type $0) (param $0 (ref null (shared i31))) (result i32) + ;; CHECK-NEXT: (i31.get_u + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $get_u (param (ref null (shared i31))) (result i32) + (i31.get_u (local.get 0)) + ) +) diff --git a/test/spec/shared-i31.wast b/test/spec/shared-i31.wast new file mode 100644 index 000000000..ef1e2a9f1 --- /dev/null +++ b/test/spec/shared-i31.wast @@ -0,0 +1,230 @@ +(module + (func (export "new") (param $i i32) (result (ref (shared i31))) + (ref.i31_shared (local.get $i)) + ) + + (func (export "get_u") (param $i i32) (result i32) + (i31.get_u (ref.i31_shared (local.get $i))) + ) + (func (export "get_s") (param $i i32) (result i32) + (i31.get_s (ref.i31_shared (local.get $i))) + ) + + (func (export "get_u-null") (result i32) + (i31.get_u (ref.null (shared i31))) + ) + (func (export "get_s-null") (result i32) + (i31.get_u (ref.null (shared i31))) + ) + + (global $i (ref (shared i31)) (ref.i31_shared (i32.const 2))) + (global $m (mut (ref (shared i31))) (ref.i31_shared (i32.const 3))) + + (func (export "get_globals") (result i32 i32) + (i31.get_u (global.get $i)) + (i31.get_u (global.get $m)) + ) + + (func (export "set_global") (param i32) + (global.set $m (ref.i31_shared (local.get 0))) + ) +) + +(assert_return (invoke "new" (i32.const 1)) (ref.i31_shared)) + +(assert_return (invoke "get_u" (i32.const 0)) (i32.const 0)) +(assert_return (invoke "get_u" (i32.const 100)) (i32.const 100)) +(assert_return (invoke "get_u" (i32.const -1)) (i32.const 0x7fff_ffff)) +(assert_return (invoke "get_u" (i32.const 0x3fff_ffff)) (i32.const 0x3fff_ffff)) +(assert_return (invoke "get_u" (i32.const 0x4000_0000)) (i32.const 0x4000_0000)) +(assert_return (invoke "get_u" (i32.const 0x7fff_ffff)) (i32.const 0x7fff_ffff)) +(assert_return (invoke "get_u" (i32.const 0xaaaa_aaaa)) (i32.const 0x2aaa_aaaa)) +(assert_return (invoke "get_u" (i32.const 0xcaaa_aaaa)) (i32.const 0x4aaa_aaaa)) + +(assert_return (invoke "get_s" (i32.const 0)) (i32.const 0)) +(assert_return (invoke "get_s" (i32.const 100)) (i32.const 100)) +(assert_return (invoke "get_s" (i32.const -1)) (i32.const -1)) +(assert_return (invoke "get_s" (i32.const 0x3fff_ffff)) (i32.const 0x3fff_ffff)) +(assert_return (invoke "get_s" (i32.const 0x4000_0000)) (i32.const -0x4000_0000)) +(assert_return (invoke "get_s" (i32.const 0x7fff_ffff)) (i32.const -1)) +(assert_return (invoke "get_s" (i32.const 0xaaaa_aaaa)) (i32.const 0x2aaa_aaaa)) +(assert_return (invoke "get_s" (i32.const 0xcaaa_aaaa)) (i32.const 0xcaaa_aaaa)) + +(assert_trap (invoke "get_u-null") "null i31 reference") +(assert_trap (invoke "get_s-null") "null i31 reference") + +(assert_return (invoke "get_globals") (i32.const 2) (i32.const 3)) + +(invoke "set_global" (i32.const 1234)) +(assert_return (invoke "get_globals") (i32.const 2) (i32.const 1234)) + +(module $tables_of_i31ref + (table $table 3 10 (ref null (shared i31))) + (elem (table $table) (i32.const 0) (ref null (shared i31)) + (item (ref.i31_shared (i32.const 999))) + (item (ref.i31_shared (i32.const 888))) + (item (ref.i31_shared (i32.const 777)))) + + (func (export "size") (result i32) + table.size $table + ) + + (func (export "get") (param i32) (result i32) + (i31.get_u (table.get $table (local.get 0))) + ) + + (func (export "grow") (param i32 i32) (result i32) + (table.grow $table (ref.i31_shared (local.get 1)) (local.get 0)) + ) + + (func (export "fill") (param i32 i32 i32) + (table.fill $table (local.get 0) (ref.i31_shared (local.get 1)) (local.get 2)) + ) + + (func (export "copy") (param i32 i32 i32) + (table.copy $table $table (local.get 0) (local.get 1) (local.get 2)) + ) + + (elem $elem (ref null (shared i31)) (item (ref.i31_shared (i32.const 123))) + (item (ref.i31_shared (i32.const 456))) + (item (ref.i31_shared (i32.const 789)))) + ;; (func (export "init") (param i32 i32 i32) + ;; (table.init $table $elem (local.get 0) (local.get 1) (local.get 2)) + ;; ) +) + +;; Initial state. +(assert_return (invoke "size") (i32.const 3)) +(assert_return (invoke "get" (i32.const 0)) (i32.const 999)) +(assert_return (invoke "get" (i32.const 1)) (i32.const 888)) +(assert_return (invoke "get" (i32.const 2)) (i32.const 777)) + +;; Grow from size 3 to size 5. +(assert_return (invoke "grow" (i32.const 2) (i32.const 333)) (i32.const 3)) +(assert_return (invoke "size") (i32.const 5)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 333)) +(assert_return (invoke "get" (i32.const 4)) (i32.const 333)) + +;; Fill table[2..4] = 111. +(invoke "fill" (i32.const 2) (i32.const 111) (i32.const 2)) +(assert_return (invoke "get" (i32.const 2)) (i32.const 111)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 111)) + +;; Copy from table[0..2] to table[3..5]. +(invoke "copy" (i32.const 3) (i32.const 0) (i32.const 2)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 999)) +(assert_return (invoke "get" (i32.const 4)) (i32.const 888)) + +;; ;; Initialize the passive element at table[1..4]. +;; (invoke "init" (i32.const 1) (i32.const 0) (i32.const 3)) +;; (assert_return (invoke "get" (i32.const 1)) (i32.const 123)) +;; (assert_return (invoke "get" (i32.const 2)) (i32.const 456)) +;; (assert_return (invoke "get" (i32.const 3)) (i32.const 789)) + +(module $env + (global (export "g") i32 (i32.const 42)) +) +(register "env") + +;; (module $i31ref_of_global_table_initializer +;; (global $g (import "env" "g") i32) +;; (table $t 3 3 (ref (shared i31)) (ref.i31_shared (global.get $g))) +;; (func (export "get") (param i32) (result i32) +;; (i31.get_u (local.get 0) (table.get $t)) +;; ) +;; ) + +;; (assert_return (invoke "get" (i32.const 0)) (i32.const 42)) +;; (assert_return (invoke "get" (i32.const 1)) (i32.const 42)) +;; (assert_return (invoke "get" (i32.const 2)) (i32.const 42)) + +(module $i31ref_of_global_global_initializer + (global $g0 (import "env" "g") i32) + (global $g1 (ref null (shared i31)) (ref.i31_shared (global.get $g0))) + (func (export "get") (result i32) + (i31.get_u (global.get $g1)) + ) +) + +(assert_return (invoke "get") (i32.const 42)) + +(module $anyref_global_of_i31ref + (global $c (ref null (shared any)) (ref.i31_shared (i32.const 1234))) + (global $m (mut (ref null (shared any))) (ref.i31_shared (i32.const 5678))) + + (func (export "get_globals") (result i32 i32) + (i31.get_u (ref.cast (ref null (shared i31)) (global.get $c))) + (i31.get_u (ref.cast (ref null (shared i31)) (global.get $m))) + ) + + (func (export "set_global") (param i32) + (global.set $m (ref.i31_shared (local.get 0))) + ) +) + +(assert_return (invoke "get_globals") (i32.const 1234) (i32.const 5678)) +(invoke "set_global" (i32.const 0)) +(assert_return (invoke "get_globals") (i32.const 1234) (i32.const 0)) + +(module $anyref_table_of_i31ref + (table $table 3 10 (ref null (shared any))) + (elem (table $table) (i32.const 0) (ref null (shared i31)) + (item (ref.i31_shared (i32.const 999))) + (item (ref.i31_shared (i32.const 888))) + (item (ref.i31_shared (i32.const 777)))) + + (func (export "size") (result i32) + table.size $table + ) + + (func (export "get") (param i32) (result i32) + (i31.get_u (ref.cast (ref null (shared i31)) (table.get $table (local.get 0)))) + ) + + (func (export "grow") (param i32 i32) (result i32) + (table.grow $table (ref.i31_shared (local.get 1)) (local.get 0)) + ) + + (func (export "fill") (param i32 i32 i32) + (table.fill $table (local.get 0) (ref.i31_shared (local.get 1)) (local.get 2)) + ) + + (func (export "copy") (param i32 i32 i32) + (table.copy $table $table (local.get 0) (local.get 1) (local.get 2)) + ) + + (elem $elem (ref null (shared i31)) (item (ref.i31_shared (i32.const 123))) + (item (ref.i31_shared (i32.const 456))) + (item (ref.i31_shared (i32.const 789)))) + ;; (func (export "init") (param i32 i32 i32) + ;; (table.init $table $elem (local.get 0) (local.get 1) (local.get 2)) + ;; ) +) + +;; Initial state. +(assert_return (invoke "size") (i32.const 3)) +(assert_return (invoke "get" (i32.const 0)) (i32.const 999)) +(assert_return (invoke "get" (i32.const 1)) (i32.const 888)) +(assert_return (invoke "get" (i32.const 2)) (i32.const 777)) + +;; Grow from size 3 to size 5. +(assert_return (invoke "grow" (i32.const 2) (i32.const 333)) (i32.const 3)) +(assert_return (invoke "size") (i32.const 5)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 333)) +(assert_return (invoke "get" (i32.const 4)) (i32.const 333)) + +;; Fill table[2..4] = 111. +(invoke "fill" (i32.const 2) (i32.const 111) (i32.const 2)) +(assert_return (invoke "get" (i32.const 2)) (i32.const 111)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 111)) + +;; Copy from table[0..2] to table[3..5]. +(invoke "copy" (i32.const 3) (i32.const 0) (i32.const 2)) +(assert_return (invoke "get" (i32.const 3)) (i32.const 999)) +(assert_return (invoke "get" (i32.const 4)) (i32.const 888)) + +;; ;; Initialize the passive element at table[1..4]. +;; (invoke "init" (i32.const 1) (i32.const 0) (i32.const 3)) +;; (assert_return (invoke "get" (i32.const 1)) (i32.const 123)) +;; (assert_return (invoke "get" (i32.const 2)) (i32.const 456)) +;; (assert_return (invoke "get" (i32.const 3)) (i32.const 789)) |