diff options
author | Heejin Ahn <aheejin@gmail.com> | 2019-08-27 16:40:59 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-27 16:40:59 -0700 |
commit | cb0b31a2d185f18662814c9f3c9158b2eea74760 (patch) | |
tree | 4fe23ff2abb08af7a804f6e6755b07454f79f45d /src/binaryen-c.cpp | |
parent | f070e8c10a15a02735fbd9b88c4c569a8c786933 (diff) | |
download | binaryen-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.cpp | 23 |
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) { |