diff options
author | Derek Schuff <dschuff@chromium.org> | 2017-07-10 09:47:21 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-10 09:47:21 -0700 |
commit | bcb29e59c92347eebcd138034a4f4c06d042670a (patch) | |
tree | ce51ac4020bacd34c748693d85d70616bf340714 /src/wasm-traversal.h | |
parent | 4995132cfaf575e430a7d0e95257b677286171c3 (diff) | |
download | binaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.tar.gz binaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.tar.bz2 binaryen-bcb29e59c92347eebcd138034a4f4c06d042670a.zip |
Add IR, parsing, printing, and binary for atomic cmpxchg (#1083)
Diffstat (limited to 'src/wasm-traversal.h')
-rw-r--r-- | src/wasm-traversal.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h index 11332b5c3..f56bfca96 100644 --- a/src/wasm-traversal.h +++ b/src/wasm-traversal.h @@ -50,6 +50,7 @@ struct Visitor { ReturnType visitLoad(Load* curr) {} ReturnType visitStore(Store* curr) {} ReturnType visitAtomicRMW(AtomicRMW* curr) {return ReturnType();} //Stub impl so not every pass has to implement this yet. + ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) {return ReturnType();} //Stub impl so not every pass has to implement this yet. ReturnType visitConst(Const* curr) {} ReturnType visitUnary(Unary* curr) {} ReturnType visitBinary(Binary* curr) {} @@ -92,6 +93,7 @@ struct Visitor { case Expression::Id::LoadId: DELEGATE(Load); case Expression::Id::StoreId: DELEGATE(Store); case Expression::Id::AtomicRMWId: DELEGATE(AtomicRMW); + case Expression::Id::AtomicCmpxchgId: DELEGATE(AtomicCmpxchg); case Expression::Id::ConstId: DELEGATE(Const); case Expression::Id::UnaryId: DELEGATE(Unary); case Expression::Id::BinaryId: DELEGATE(Binary); @@ -133,6 +135,7 @@ struct UnifiedExpressionVisitor : public Visitor<SubType> { ReturnType visitLoad(Load* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitStore(Store* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitAtomicRMW(AtomicRMW* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } + ReturnType visitAtomicCmpxchg(AtomicCmpxchg* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitConst(Const* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitUnary(Unary* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } ReturnType visitBinary(Binary* curr) { return static_cast<SubType*>(this)->visitExpression(curr); } @@ -310,6 +313,7 @@ struct Walker : public VisitorType { static void doVisitLoad(SubType* self, Expression** currp) { self->visitLoad((*currp)->cast<Load>()); } static void doVisitStore(SubType* self, Expression** currp) { self->visitStore((*currp)->cast<Store>()); } static void doVisitAtomicRMW(SubType* self, Expression** currp) { self->visitAtomicRMW((*currp)->cast<AtomicRMW>()); } + static void doVisitAtomicCmpxchg(SubType* self, Expression** currp){ self->visitAtomicCmpxchg((*currp)->cast<AtomicCmpxchg>()); } static void doVisitConst(SubType* self, Expression** currp) { self->visitConst((*currp)->cast<Const>()); } static void doVisitUnary(SubType* self, Expression** currp) { self->visitUnary((*currp)->cast<Unary>()); } static void doVisitBinary(SubType* self, Expression** currp) { self->visitBinary((*currp)->cast<Binary>()); } @@ -438,6 +442,13 @@ struct PostWalker : public Walker<SubType, VisitorType> { self->pushTask(SubType::scan, &curr->cast<AtomicRMW>()->ptr); break; } + case Expression::Id::AtomicCmpxchgId: { + self->pushTask(SubType::doVisitAtomicCmpxchg, currp); + self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->replacement); + self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->expected); + self->pushTask(SubType::scan, &curr->cast<AtomicCmpxchg>()->ptr); + break; + } case Expression::Id::ConstId: { self->pushTask(SubType::doVisitConst, currp); break; |