summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-binary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r--src/wasm/wasm-binary.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index b114b81fb..f0787600e 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -952,6 +952,27 @@ void WasmBinaryWriter::visitAtomicCmpxchg(AtomicCmpxchg *curr) {
emitMemoryAccess(curr->bytes, curr->bytes, curr->offset);
}
+void WasmBinaryWriter::visitAtomicWait(AtomicWait *curr) {
+ if (debug) std::cerr << "zz node: AtomicWait" << std::endl;
+ recurse(curr->ptr);
+ recurse(curr->expected);
+ recurse(curr->timeout);
+
+ o << int8_t(BinaryConsts::AtomicPrefix);
+ switch (curr->expectedType) {
+ case i32: o << int8_t(BinaryConsts::I32AtomicWait); break;
+ case i64: o << int8_t(BinaryConsts::I64AtomicWait); break;
+ default: WASM_UNREACHABLE();
+ }
+}
+
+void WasmBinaryWriter::visitAtomicWake(AtomicWake *curr) {
+ if (debug) std::cerr << "zz node: AtomicWake" << std::endl;
+ recurse(curr->ptr);
+ recurse(curr->wakeCount);
+
+ o << int8_t(BinaryConsts::AtomicPrefix) << int8_t(BinaryConsts::AtomicWake);
+}
void WasmBinaryWriter::visitConst(Const *curr) {
if (debug) std::cerr << "zz node: Const" << curr << " : " << curr->type << std::endl;
@@ -2123,6 +2144,8 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) {
if (maybeVisitStore(curr, code, /*isAtomic=*/true)) break;
if (maybeVisitAtomicRMW(curr, code)) break;
if (maybeVisitAtomicCmpxchg(curr, code)) break;
+ if (maybeVisitAtomicWait(curr, code)) break;
+ if (maybeVisitAtomicWake(curr, code)) break;
throw ParseException("invalid code after atomic prefix: " + std::to_string(code));
}
default: {
@@ -2553,6 +2576,38 @@ bool WasmBinaryBuilder::maybeVisitAtomicCmpxchg(Expression*& out, uint8_t code)
return true;
}
+bool WasmBinaryBuilder::maybeVisitAtomicWait(Expression*& out, uint8_t code) {
+ if (code < BinaryConsts::I32AtomicWait || code > BinaryConsts::I64AtomicWait) return false;
+ auto* curr = allocator.alloc<AtomicWait>();
+
+ switch (code) {
+ case BinaryConsts::I32AtomicWait: curr->expectedType = i32; break;
+ case BinaryConsts::I64AtomicWait: curr->expectedType = i64; break;
+ default: WASM_UNREACHABLE();
+ }
+ curr->type = i32;
+ if (debug) std::cerr << "zz node: AtomicWait" << std::endl;
+ curr->timeout = popNonVoidExpression();
+ curr->expected = popNonVoidExpression();
+ curr->ptr = popNonVoidExpression();
+ curr->finalize();
+ out = curr;
+ return true;
+}
+
+bool WasmBinaryBuilder::maybeVisitAtomicWake(Expression*& out, uint8_t code) {
+ if (code != BinaryConsts::AtomicWake) return false;
+ auto* curr = allocator.alloc<AtomicWake>();
+ if (debug) std::cerr << "zz node: AtomicWake" << std::endl;
+
+ curr->type = i32;
+ curr->wakeCount = popNonVoidExpression();
+ curr->ptr = popNonVoidExpression();
+ curr->finalize();
+ out = curr;
+ return true;
+}
+
bool WasmBinaryBuilder::maybeVisitConst(Expression*& out, uint8_t code) {
Const* curr;
if (debug) std::cerr << "zz node: Const, code " << code << std::endl;