summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2017-08-24 12:43:12 -0700
committerGitHub <noreply@github.com>2017-08-24 12:43:12 -0700
commite60fcd0ba97ed75440c6f838619455be7a5e90a3 (patch)
treedbf187ed1eefcc9e16d5f5fac4be38b3fb539f94 /src/wasm/wasm-s-parser.cpp
parentb07fafcebebab82dba46012256edc6445862cfce (diff)
downloadbinaryen-e60fcd0ba97ed75440c6f838619455be7a5e90a3.tar.gz
binaryen-e60fcd0ba97ed75440c6f838619455be7a5e90a3.tar.bz2
binaryen-e60fcd0ba97ed75440c6f838619455be7a5e90a3.zip
Add support for atomic wait and wake operators (#1140)
According to spec at https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#wait-and-wake-operators
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;