summaryrefslogtreecommitdiff
path: root/src/binaryen-c.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2019-08-27 16:40:59 -0700
committerGitHub <noreply@github.com>2019-08-27 16:40:59 -0700
commitcb0b31a2d185f18662814c9f3c9158b2eea74760 (patch)
tree4fe23ff2abb08af7a804f6e6755b07454f79f45d /src/binaryen-c.cpp
parentf070e8c10a15a02735fbd9b88c4c569a8c786933 (diff)
downloadbinaryen-cb0b31a2d185f18662814c9f3c9158b2eea74760.tar.gz
binaryen-cb0b31a2d185f18662814c9f3c9158b2eea74760.tar.bz2
binaryen-cb0b31a2d185f18662814c9f3c9158b2eea74760.zip
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.
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r--src/binaryen-c.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index d8f8163c4..a06e32d87 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -331,6 +331,9 @@ BinaryenExpressionId BinaryenAtomicWaitId(void) {
BinaryenExpressionId BinaryenAtomicNotifyId(void) {
return Expression::Id::AtomicNotifyId;
}
+BinaryenExpressionId BinaryenAtomicFenceId(void) {
+ return Expression::Id::AtomicFenceId;
+}
BinaryenExpressionId BinaryenSIMDExtractId(void) {
return Expression::Id::SIMDExtractId;
}
@@ -1466,6 +1469,15 @@ BinaryenExpressionRef BinaryenAtomicNotify(BinaryenModuleRef module,
return static_cast<Expression*>(ret);
}
+BinaryenExpressionRef BinaryenAtomicFence(BinaryenModuleRef module) {
+ auto* ret = Builder(*(Module*)module).makeAtomicFence();
+
+ if (tracing) {
+ traceExpression(ret, "BinaryenAtomicFence");
+ }
+
+ return static_cast<Expression*>(ret);
+}
BinaryenExpressionRef BinaryenSIMDExtract(BinaryenModuleRef module,
BinaryenOp op,
BinaryenExpressionRef vec,
@@ -2520,6 +2532,17 @@ BinaryenAtomicNotifyGetNotifyCount(BinaryenExpressionRef expr) {
assert(expression->is<AtomicNotify>());
return static_cast<AtomicNotify*>(expression)->notifyCount;
}
+// AtomicFence
+uint8_t BinaryenAtomicFenceGetOrder(BinaryenExpressionRef expr) {
+ if (tracing) {
+ std::cout << " BinaryenAtomicFenceGetOrder(expressions["
+ << expressions[expr] << "]);\n";
+ }
+
+ auto* expression = (Expression*)expr;
+ assert(expression->is<AtomicFence>());
+ return static_cast<AtomicFence*>(expression)->order;
+}
// SIMDExtract
BinaryenOp BinaryenSIMDExtractGetOp(BinaryenExpressionRef expr) {
if (tracing) {