diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 24 | ||||
-rw-r--r-- | src/binaryen-c.h | 2 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 42 |
3 files changed, 67 insertions, 1 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index f4084eb82..9b46f0aba 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -732,6 +732,26 @@ BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) { return static_cast<Expression*>(ret); } +BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenType type, BinaryenExpressionRef ptr) { + auto* ret = Builder(*((Module*)module)).makeAtomicLoad(bytes, offset, (Expression*)ptr, WasmType(type)); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicLoad(the_module, " << bytes << ", " << offset << ", " << type << ", expressions[" << expressions[ptr] << "]);\n"; + } + + return static_cast<Expression*>(ret); +} +BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) { + auto* ret = Builder(*((Module*)module)).makeAtomicStore(bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type)); + + if (tracing) { + auto id = noteExpression(ret); + std::cout << " expressions[" << id << "] = BinaryenAtomicStore(the_module, " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n"; + } + + 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)); @@ -1102,7 +1122,9 @@ int BinaryenModuleValidate(BinaryenModuleRef module) { } Module* wasm = (Module*)module; - return WasmValidator().validate(*wasm) ? 1 : 0; + // TODO add feature selection support to C API + FeatureSet features = Feature::Atomics; + return WasmValidator().validate(*wasm, features) ? 1 : 0; } void BinaryenModuleOptimize(BinaryenModuleRef module) { diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 88fe8904c..54cc73ace 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -360,6 +360,8 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressio BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands); BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module); BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module); +BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenType type, BinaryenExpressionRef ptr); +BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type); BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type); BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type); BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType type); diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 352da1c0a..e6d248715 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -429,6 +429,24 @@ return Module['_BinaryenBinary'](module, Module['GeUInt32'], left, right); }, 'atomic':{ + 'load': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i32'], ptr); + }, + 'load8_u': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i32'], ptr); + }, + 'load16_u': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i32'], ptr); + }, + 'store': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i32']); + }, + 'store8': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i32']); + }, + 'store16': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i32']); + }, 'rmw': { 'add': function(offset, ptr, value) { return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 4, offset, ptr, value, Module['i32']); @@ -655,6 +673,30 @@ return Module['_BinaryenBinary'](module, Module['GeUInt64'], left, right); }, 'atomic':{ + 'load': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 8, offset, Module['i64'], ptr); + }, + 'load8_u': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i64'], ptr); + }, + 'load16_u': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i64'], ptr); + }, + 'load32_u': function(offset, ptr) { + return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i64'], ptr); + }, + 'store': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 8, offset, ptr, value, Module['i64']); + }, + 'store8': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i64']); + }, + 'store16': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i64']); + }, + 'store32': function(offset, ptr, value) { + return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i64']); + }, 'rmw': { 'add': function(offset, ptr, value) { return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 8, offset, ptr, value, Module['i64']); |