* feat: implement memory.atomic.notify,wait32,wait64 Added the parking_spot crate, which provides the needed registry for the operations. Signed-off-by: Harald Hoyer <harald@profian.com> * fix: change trap message for HeapMisaligned The threads spec test wants "unaligned atomic" instead of "misaligned memory access". Signed-off-by: Harald Hoyer <harald@profian.com> * tests: add test for atomic wait on non-shared memory Signed-off-by: Harald Hoyer <harald@profian.com> * tests: add tests/spec_testsuite/proposals/threads without pooling and reference types. Also "shared_memory" is added to the "spectest" interface. Signed-off-by: Harald Hoyer <harald@profian.com> * tests: add atomics_notify.wast checking that notify with 0 waiters returns 0 on shared and non-shared memory. Signed-off-by: Harald Hoyer <harald@profian.com> * tests: add tests for atomic wait on shared memory - return 2 - timeout for 0 - return 2 - timeout for 1000ns - return 1 - invalid value Signed-off-by: Harald Hoyer <harald@profian.com> * fixup! feat: implement memory.atomic.notify,wait32,wait64 Signed-off-by: Harald Hoyer <harald@profian.com> * fixup! feat: implement memory.atomic.notify,wait32,wait64 Signed-off-by: Harald Hoyer <harald@profian.com> Signed-off-by: Harald Hoyer <harald@profian.com>
144 lines
2.9 KiB
Plaintext
144 lines
2.9 KiB
Plaintext
;; From https://bugzilla.mozilla.org/show_bug.cgi?id=1684861.
|
|
;;
|
|
|
|
(module
|
|
(type (;0;) (func))
|
|
(func $main (type 0)
|
|
i32.const -64
|
|
i32.const -63
|
|
memory.atomic.notify offset=1
|
|
unreachable)
|
|
(memory (;0;) 4 4)
|
|
(export "main" (func $main))
|
|
)
|
|
|
|
(assert_trap (invoke "main") "unaligned atomic")
|
|
|
|
|
|
(module
|
|
(type (;0;) (func))
|
|
(func $main (type 0)
|
|
i32.const -64
|
|
i32.const -63
|
|
memory.atomic.notify offset=65536
|
|
unreachable)
|
|
(memory (;0;) 4 4)
|
|
(export "main" (func $main))
|
|
)
|
|
|
|
(assert_trap (invoke "main") "out of bounds memory access")
|
|
|
|
|
|
(module
|
|
(type (;0;) (func))
|
|
(func $wait32 (type 0)
|
|
i32.const -64
|
|
i32.const 42
|
|
i64.const 0
|
|
memory.atomic.wait32 offset=1
|
|
unreachable)
|
|
(func $wait64 (type 0)
|
|
i32.const -64
|
|
i64.const 43
|
|
i64.const 0
|
|
memory.atomic.wait64 offset=3
|
|
unreachable)
|
|
(memory (;0;) 4 4)
|
|
(export "wait32" (func $wait32))
|
|
(export "wait64" (func $wait64))
|
|
)
|
|
|
|
(assert_trap (invoke "wait32") "unaligned atomic")
|
|
(assert_trap (invoke "wait64") "unaligned atomic")
|
|
|
|
(module
|
|
(type (;0;) (func))
|
|
(func $wait32 (type 0)
|
|
i32.const 0
|
|
i32.const 42
|
|
i64.const 0
|
|
memory.atomic.wait32
|
|
unreachable)
|
|
(func $wait64 (type 0)
|
|
i32.const 0
|
|
i64.const 43
|
|
i64.const 0
|
|
memory.atomic.wait64
|
|
unreachable)
|
|
(memory (;0;) 4 4)
|
|
(export "wait32" (func $wait32))
|
|
(export "wait64" (func $wait64))
|
|
)
|
|
|
|
(assert_trap (invoke "wait32") "atomic wait on non-shared memory")
|
|
(assert_trap (invoke "wait64") "atomic wait on non-shared memory")
|
|
|
|
;; not valid values for memory.atomic.wait
|
|
(module
|
|
(memory 1 1 shared)
|
|
(type (;0;) (func))
|
|
(func $wait32 (result i32)
|
|
i32.const 0
|
|
i32.const 42
|
|
i64.const -1
|
|
memory.atomic.wait32
|
|
)
|
|
(func $wait64 (result i32)
|
|
i32.const 0
|
|
i64.const 43
|
|
i64.const -1
|
|
memory.atomic.wait64
|
|
)
|
|
(export "wait32" (func $wait32))
|
|
(export "wait64" (func $wait64))
|
|
)
|
|
|
|
(assert_return (invoke "wait32") (i32.const 1))
|
|
(assert_return (invoke "wait64") (i32.const 1))
|
|
|
|
;; timeout
|
|
(module
|
|
(memory 1 1 shared)
|
|
(type (;0;) (func))
|
|
(func $wait32 (result i32)
|
|
i32.const 0
|
|
i32.const 0
|
|
i64.const 1000
|
|
memory.atomic.wait32
|
|
)
|
|
(func $wait64 (result i32)
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.const 1000
|
|
memory.atomic.wait64
|
|
)
|
|
(export "wait32" (func $wait32))
|
|
(export "wait64" (func $wait64))
|
|
)
|
|
|
|
(assert_return (invoke "wait32") (i32.const 2))
|
|
(assert_return (invoke "wait64") (i32.const 2))
|
|
|
|
;; timeout on 0ns
|
|
(module
|
|
(memory 1 1 shared)
|
|
(type (;0;) (func))
|
|
(func $wait32 (result i32)
|
|
i32.const 0
|
|
i32.const 0
|
|
i64.const 0
|
|
memory.atomic.wait32
|
|
)
|
|
(func $wait64 (result i32)
|
|
i32.const 0
|
|
i64.const 0
|
|
i64.const 0
|
|
memory.atomic.wait64
|
|
)
|
|
(export "wait32" (func $wait32))
|
|
(export "wait64" (func $wait64))
|
|
)
|
|
|
|
(assert_return (invoke "wait32") (i32.const 2))
|
|
(assert_return (invoke "wait64") (i32.const 2))
|