Skip to content

Commit 83f6232

Browse files
dcodeIOkripken
authored andcommitted
Added BinaryenAtomic* incl. ops to binaryen-c (#1276)
* Added BinaryenAtomicRMW incl. ops to binaryen-c * AtomicCmpxchg, AtomicWait, AtomicWake
1 parent e6eb478 commit 83f6232

2 files changed

Lines changed: 57 additions & 1 deletion

File tree

src/binaryen-c.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,12 @@ BinaryenOp BinaryenPageSize(void) { return PageSize; }
308308
BinaryenOp BinaryenCurrentMemory(void) { return CurrentMemory; }
309309
BinaryenOp BinaryenGrowMemory(void) { return GrowMemory; }
310310
BinaryenOp BinaryenHasFeature(void) { return HasFeature; }
311+
BinaryenOp BinaryenAtomicRMWAdd(void) { return AtomicRMWOp::Add; }
312+
BinaryenOp BinaryenAtomicRMWSub(void) { return AtomicRMWOp::Sub; }
313+
BinaryenOp BinaryenAtomicRMWAnd(void) { return AtomicRMWOp::And; }
314+
BinaryenOp BinaryenAtomicRMWOr(void) { return AtomicRMWOp::Or; }
315+
BinaryenOp BinaryenAtomicRMWXor(void) { return AtomicRMWOp::Xor; }
316+
BinaryenOp BinaryenAtomicRMWXchg(void) { return AtomicRMWOp::Xchg; }
311317

312318
BinaryenExpressionRef BinaryenBlock(BinaryenModuleRef module, const char* name, BinaryenExpressionRef* children, BinaryenIndex numChildren, BinaryenType type) {
313319
auto* ret = ((Module*)module)->allocator.alloc<Block>();
@@ -659,7 +665,7 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressio
659665
std::cout << " expressions[" << id << "] = BinaryenReturn(the_module, expressions[" << expressions[value] << "]);\n";
660666
}
661667

662-
return static_cast<Expression*>(ret);
668+
return static_cast<Expression*>(ret);
663669
}
664670
BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands) {
665671
if (tracing) {
@@ -695,6 +701,46 @@ BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) {
695701

696702
return static_cast<Expression*>(ret);
697703
}
704+
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
705+
auto* ret = Builder(*((Module*)module)).makeAtomicRMW(AtomicRMWOp(op), bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type));
706+
707+
if (tracing) {
708+
auto id = noteExpression(ret);
709+
std::cout << " expressions[" << id << "] = BinaryenAtomicRMW(the_module, " << op << ", " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n";
710+
}
711+
712+
return static_cast<Expression*>(ret);
713+
}
714+
BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type) {
715+
auto* ret = Builder(*((Module*)module)).makeAtomicCmpxchg(bytes, offset, (Expression*)ptr, (Expression*)expected, (Expression*)replacement, WasmType(type));
716+
717+
if (tracing) {
718+
auto id = noteExpression(ret);
719+
std::cout << " expressions[" << id << "] = BinaryenAtomicCmpxchg(the_module, " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[expected] << "], expressions[" << expressions[replacement] << "], " << type << ");\n";
720+
}
721+
722+
return static_cast<Expression*>(ret);
723+
}
724+
BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType expectedType) {
725+
auto* ret = Builder(*((Module*)module)).makeAtomicWait((Expression*)ptr, (Expression*)expected, (Expression*)timeout, WasmType(expectedType));
726+
727+
if (tracing) {
728+
auto id = noteExpression(ret);
729+
std::cout << " expressions[" << id << "] = BinaryenAtomicWait(the_module, expressions[" << expressions[ptr] << "], expressions[" << expressions[expected] << "], expressions[" << expressions[timeout] << "], " << expectedType << ");\n";
730+
}
731+
732+
return static_cast<Expression*>(ret);
733+
}
734+
BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount) {
735+
auto* ret = Builder(*((Module*)module)).makeAtomicWake((Expression*)ptr, (Expression*)wakeCount);
736+
737+
if (tracing) {
738+
auto id = noteExpression(ret);
739+
std::cout << " expressions[" << id << "] = BinaryenAtomicWake(the_module, expressions[" << expressions[ptr] << "], expressions[" << expressions[wakeCount] << "]);\n";
740+
}
741+
742+
return static_cast<Expression*>(ret);
743+
}
698744

699745
void BinaryenExpressionPrint(BinaryenExpressionRef expr) {
700746
if (tracing) {

src/binaryen-c.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ BinaryenOp BinaryenPageSize(void);
262262
BinaryenOp BinaryenCurrentMemory(void);
263263
BinaryenOp BinaryenGrowMemory(void);
264264
BinaryenOp BinaryenHasFeature(void);
265+
BinaryenOp BinaryenAtomicRMWAdd(void);
266+
BinaryenOp BinaryenAtomicRMWSub(void);
267+
BinaryenOp BinaryenAtomicRMWAnd(void);
268+
BinaryenOp BinaryenAtomicRMWOr(void);
269+
BinaryenOp BinaryenAtomicRMWXor(void);
270+
BinaryenOp BinaryenAtomicRMWXchg(void);
265271

266272
typedef void* BinaryenExpressionRef;
267273

@@ -321,6 +327,10 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressio
321327
BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands);
322328
BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module);
323329
BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module);
330+
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type);
331+
BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type);
332+
BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType type);
333+
BinaryenExpressionRef BinaryenAtomicWake(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef wakeCount);
324334

325335
// Print an expression to stdout. Useful for debugging.
326336
void BinaryenExpressionPrint(BinaryenExpressionRef expr);

0 commit comments

Comments
 (0)