summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r--src/wasm/wasm-s-parser.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index 044507e86..fd7c7e7ae 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -781,6 +781,7 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) {
abort_on(op);
}
case 'w': {
+ if (!strncmp(op, "wait", strlen("wait"))) return makeAtomicWait(s, type);
if (op[1] == 'r') return makeUnary(s, UnaryOp::WrapInt64, type);
abort_on(op);
}
@@ -866,6 +867,9 @@ Expression* SExpressionWasmBuilder::makeExpression(Element& s) {
if (str[1] == 'n') return allocator.alloc<Unreachable>();
abort_on(str);
}
+ case 'w': {
+ if (!strncmp(str, "wake", strlen("wake"))) return makeAtomicWake(s);
+ }
default: abort_on(str);
}
}
@@ -1241,6 +1245,26 @@ Expression* SExpressionWasmBuilder::makeAtomicCmpxchg(Element& s, WasmType type,
return ret;
}
+Expression* SExpressionWasmBuilder::makeAtomicWait(Element& s, WasmType type) {
+ auto ret = allocator.alloc<AtomicWait>();
+ ret->type = i32;
+ ret->expectedType = type;
+ ret->ptr = parseExpression(s[1]);
+ ret->expected = parseExpression(s[2]);
+ ret->timeout = parseExpression(s[3]);
+ ret->finalize();
+ return ret;
+}
+
+Expression* SExpressionWasmBuilder::makeAtomicWake(Element& s) {
+ auto ret = allocator.alloc<AtomicWake>();
+ ret->type = i32;
+ ret->ptr = parseExpression(s[1]);
+ ret->wakeCount = parseExpression(s[2]);
+ ret->finalize();
+ return ret;
+}
+
Expression* SExpressionWasmBuilder::makeIf(Element& s) {
auto ret = allocator.alloc<If>();
Index i = 1;