feat: implement memory.atomic.notify,wait32,wait64 (#5255)

* 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>
This commit is contained in:
Harald Hoyer
2022-11-21 19:23:06 +01:00
committed by GitHub
parent fe2bfdbc1f
commit c74706aa59
21 changed files with 970 additions and 112 deletions

View File

@@ -0,0 +1,18 @@
;; From https://github.com/bytecodealliance/wasmtime/pull/5255
;;
(module
(memory 1 1)
(func (export "notify") (result i32) (memory.atomic.notify (i32.const 0) (i32.const -1)))
)
;; notify returns 0 on unshared memories
(assert_return (invoke "notify") (i32.const 0))
(module
(memory 1 1 shared)
(func (export "notify_shared") (result i32) (memory.atomic.notify (i32.const 0) (i32.const -1)))
)
;; notify returns 0 with 0 waiters
(assert_return (invoke "notify_shared") (i32.const 0))

View File

@@ -12,7 +12,7 @@
(export "main" (func $main))
)
(assert_trap (invoke "main") "misaligned memory access")
(assert_trap (invoke "main") "unaligned atomic")
(module
@@ -48,5 +48,96 @@
(export "wait64" (func $wait64))
)
(assert_trap (invoke "wait32") "misaligned memory access")
(assert_trap (invoke "wait64") "misaligned memory access")
(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))

View File

@@ -80,19 +80,19 @@
;; misaligned loads
(assert_return (invoke "32.load8u" (i32.const 1)) (i32.const 0))
(assert_trap (invoke "32.load16u" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "32.load32u" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "32.load16u" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "32.load32u" (i32.const 1)) "unaligned atomic")
(assert_return (invoke "64.load8u" (i32.const 1)) (i64.const 0))
(assert_trap (invoke "64.load16u" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.load32u" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.load64u" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.load16u" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "64.load32u" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "64.load64u" (i32.const 1)) "unaligned atomic")
(assert_return (invoke "32.load8u o1" (i32.const 0)) (i32.const 0))
(assert_trap (invoke "32.load16u o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "32.load32u o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "32.load16u o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "32.load32u o1" (i32.const 0)) "unaligned atomic")
(assert_return (invoke "64.load8u o1" (i32.const 0)) (i64.const 0))
(assert_trap (invoke "64.load16u o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.load32u o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.load64u o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.load16u o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "64.load32u o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "64.load64u o1" (i32.const 0)) "unaligned atomic")
;; aligned stores
(assert_return (invoke "32.store8" (i32.const 0)))
@@ -111,16 +111,16 @@
;; misaligned stores
(assert_return (invoke "32.store8" (i32.const 1)))
(assert_trap (invoke "32.store16" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "32.store32" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "32.store16" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "32.store32" (i32.const 1)) "unaligned atomic")
(assert_return (invoke "64.store8" (i32.const 1)))
(assert_trap (invoke "64.store16" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.store32" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.store64" (i32.const 1)) "misaligned memory access")
(assert_trap (invoke "64.store16" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "64.store32" (i32.const 1)) "unaligned atomic")
(assert_trap (invoke "64.store64" (i32.const 1)) "unaligned atomic")
(assert_return (invoke "32.store8 o1" (i32.const 0)))
(assert_trap (invoke "32.store16 o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "32.store32 o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "32.store16 o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "32.store32 o1" (i32.const 0)) "unaligned atomic")
(assert_return (invoke "64.store8 o1" (i32.const 0)))
(assert_trap (invoke "64.store16 o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.store32 o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.store64 o1" (i32.const 0)) "misaligned memory access")
(assert_trap (invoke "64.store16 o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "64.store32 o1" (i32.const 0)) "unaligned atomic")
(assert_trap (invoke "64.store64 o1" (i32.const 0)) "unaligned atomic")