From cb0b31a2d185f18662814c9f3c9158b2eea74760 Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Tue, 27 Aug 2019 16:40:59 -0700 Subject: Add atomic.fence instruction (#2307) This adds `atomic.fence` instruction: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#fence-operator This also fix bugs in `atomic.wait` and `atomic.notify` instructions in binaryen.js and adds tests for them. --- src/wasm/wasm-validator.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/wasm/wasm-validator.cpp') diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 339ad6f68..9b1220371 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -270,6 +270,7 @@ public: void visitAtomicCmpxchg(AtomicCmpxchg* curr); void visitAtomicWait(AtomicWait* curr); void visitAtomicNotify(AtomicNotify* curr); + void visitAtomicFence(AtomicFence* curr); void visitSIMDExtract(SIMDExtract* curr); void visitSIMDReplace(SIMDReplace* curr); void visitSIMDShuffle(SIMDShuffle* curr); @@ -917,6 +918,21 @@ void FunctionValidator::visitAtomicNotify(AtomicNotify* curr) { "AtomicNotify notifyCount type must be i32"); } +void FunctionValidator::visitAtomicFence(AtomicFence* curr) { + shouldBeTrue( + getModule()->memory.exists, curr, "Memory operations require a memory"); + shouldBeTrue(getModule()->features.hasAtomics(), + curr, + "Atomic operation (atomics are disabled)"); + shouldBeFalse(!getModule()->memory.shared, + curr, + "Atomic operation with non-shared memory"); + shouldBeTrue(curr->order == 0, + curr, + "Currently only sequentially consistent atomics are supported, " + "so AtomicFence's order should be 0"); +} + void FunctionValidator::visitSIMDExtract(SIMDExtract* curr) { shouldBeTrue( getModule()->features.hasSIMD(), curr, "SIMD operation (SIMD is disabled)"); -- cgit v1.2.3