diff options
author | Daniel Wirtz <dcode@dcode.io> | 2017-11-09 22:46:32 +0100 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2017-11-09 13:46:32 -0800 |
commit | 83f62325ac33706b1fcc589bc5ad6e290ed14d3f (patch) | |
tree | c23bbbbb56eec9655fcfc312c3f25331f7f7e700 /src/binaryen-c.cpp | |
parent | e6eb478ec4eae111063780bd67c48abbf9c68947 (diff) | |
download | binaryen-83f62325ac33706b1fcc589bc5ad6e290ed14d3f.tar.gz binaryen-83f62325ac33706b1fcc589bc5ad6e290ed14d3f.tar.bz2 binaryen-83f62325ac33706b1fcc589bc5ad6e290ed14d3f.zip |
Added BinaryenAtomic* incl. ops to binaryen-c (#1276)
* Added BinaryenAtomicRMW incl. ops to binaryen-c
* AtomicCmpxchg, AtomicWait, AtomicWake
Diffstat (limited to 'src/binaryen-c.cpp')
-rw-r--r-- | src/binaryen-c.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index cf5feb573..c97d0ec6c 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -308,6 +308,12 @@ BinaryenOp BinaryenPageSize(void) { return PageSize; } BinaryenOp BinaryenCurrentMemory(void) { return CurrentMemory; } BinaryenOp BinaryenGrowMemory(void) { return GrowMemory; } BinaryenOp BinaryenHasFeature(void) { return HasFeature; } +BinaryenOp BinaryenAtomicRMWAdd(void) { return AtomicRMWOp::Add; } +BinaryenOp BinaryenAtomicRMWSub(void) { return AtomicRMWOp::Sub; } +BinaryenOp BinaryenAtomicRMWAnd(void) { return AtomicRMWOp::And; } +BinaryenOp BinaryenAtomicRMWOr(void) { return AtomicRMWOp::Or; } +BinaryenOp BinaryenAtomicRMWXor(void) { return AtomicRMWOp::Xor; } +BinaryenOp BinaryenAtomicRMWXchg(void) { return AtomicRMWOp::Xchg; } BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module, const char* name, BinaryenExpressionRef* children, BinaryenIndex numChildren, BinaryenType type) { auto* ret = ((Module*)module)->allocator.alloc<Block>(); @@ -659,7 +665,7 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressio std::cout << " expressions[" << id << "] = BinaryenReturn(the_module, expressions[" << expressions[value] << "]);\n"; } - return static_cast<Expression*>(ret); + return static_cast<Expression*>(ret); } BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands) { if (tracing) { @@ -695,6 +701,46 @@ BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) { return static_cast<Expression*>(ret); } +BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) { + auto* ret = Builder(*((Module*)module)).makeAtomicRMW(AtomicRMWOp(op), bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type)); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicRMW(the_module, " << op << ", " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n"; + } + + return static_cast<Expression*>(ret); +} +BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type) { + auto* ret = Builder(*((Module*)module)).makeAtomicCmpxchg(bytes, offset, (Expression*)ptr, (Expression*)expected, (Expression*)replacement, WasmType(type)); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicCmpxchg(the_module, " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[expected] << "], expressions[" << expressions[replacement] << "], " << type << ");\n"; + } + + return static_cast<Expression*>(ret); +} +BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType expectedType) { + auto* ret = Builder(*((Module*)module)).makeAtomicWait((Expression*)ptr, (Expression*)expected, (Expression*)timeout, WasmType(expectedType)); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicWait(the_module, expressions[" << expressions[ptr] << "], expressions[" << expressions[expected] << "], expressions[" << expressions[timeout] << "], " << expectedType << ");\n"; + } + + return static_cast<Expression*>(ret); +} +BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount) { + auto* ret = Builder(*((Module*)module)).makeAtomicWake((Expression*)ptr, (Expression*)wakeCount); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicWake(the_module, expressions[" << expressions[ptr] << "], expressions[" << expressions[wakeCount] << "]);\n"; + } + + return static_cast<Expression*>(ret); +} void BinaryenExpressionPrint(BinaryenExpressionRef expr) { if (tracing) { |