@@ -419,6 +419,18 @@ BinaryenExternalKind BinaryenExternalTag(void) {
419419 return static_cast <BinaryenExternalKind>(ExternalKind::Tag);
420420}
421421
422+ // MemoryOrder for atomic operations
423+
424+ BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderUnordered (void ) {
425+ return static_cast <BinaryenMemoryOrder>(MemoryOrder::Unordered);
426+ }
427+ BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderAcqRel (void ) {
428+ return static_cast <BinaryenMemoryOrder>(MemoryOrder::AcqRel);
429+ }
430+ BINARYEN_API BinaryenMemoryOrder BinaryenMemoryOrderSeqCst (void ) {
431+ return static_cast <BinaryenMemoryOrder>(MemoryOrder::SeqCst);
432+ }
433+
422434// Features
423435
424436BinaryenFeatures BinaryenFeatureMVP (void ) {
@@ -1347,23 +1359,25 @@ BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module,
13471359 uint32_t offset,
13481360 BinaryenType type,
13491361 BinaryenExpressionRef ptr,
1350- const char * memoryName) {
1362+ const char * memoryName,
1363+ BinaryenMemoryOrder order) {
13511364 return static_cast <Expression*>(
13521365 Builder (*(Module*)module )
13531366 .makeAtomicLoad (bytes,
13541367 offset,
13551368 (Expression*)ptr,
13561369 Type (type),
13571370 getMemoryName (module , memoryName),
1358- MemoryOrder::SeqCst ));
1371+ static_cast < MemoryOrder>(order) ));
13591372}
13601373BinaryenExpressionRef BinaryenAtomicStore (BinaryenModuleRef module ,
13611374 uint32_t bytes,
13621375 uint32_t offset,
13631376 BinaryenExpressionRef ptr,
13641377 BinaryenExpressionRef value,
13651378 BinaryenType type,
1366- const char * memoryName) {
1379+ const char * memoryName,
1380+ BinaryenMemoryOrder order) {
13671381 return static_cast <Expression*>(
13681382 Builder (*(Module*)module )
13691383 .makeAtomicStore (bytes,
@@ -1372,7 +1386,7 @@ BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module,
13721386 (Expression*)value,
13731387 Type (type),
13741388 getMemoryName (module , memoryName),
1375- MemoryOrder::SeqCst ));
1389+ static_cast < MemoryOrder>(order) ));
13761390}
13771391BinaryenExpressionRef BinaryenAtomicRMW (BinaryenModuleRef module ,
13781392 BinaryenOp op,
@@ -1381,7 +1395,8 @@ BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13811395 BinaryenExpressionRef ptr,
13821396 BinaryenExpressionRef value,
13831397 BinaryenType type,
1384- const char * memoryName) {
1398+ const char * memoryName,
1399+ BinaryenMemoryOrder order) {
13851400 return Builder (*(Module*)module )
13861401 .makeAtomicRMW (AtomicRMWOp (op),
13871402 bytes,
@@ -1390,7 +1405,7 @@ BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13901405 (Expression*)value,
13911406 Type (type),
13921407 getMemoryName (module , memoryName),
1393- MemoryOrder::SeqCst );
1408+ static_cast < MemoryOrder>(order) );
13941409}
13951410BinaryenExpressionRef BinaryenAtomicCmpxchg (BinaryenModuleRef module ,
13961411 BinaryenIndex bytes,
@@ -1399,16 +1414,18 @@ BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module,
13991414 BinaryenExpressionRef expected,
14001415 BinaryenExpressionRef replacement,
14011416 BinaryenType type,
1402- const char * memoryName) {
1403- return Builder (*(Module*)module )
1404- .makeAtomicCmpxchg (bytes,
1405- offset,
1406- (Expression*)ptr,
1407- (Expression*)expected,
1408- (Expression*)replacement,
1409- Type (type),
1410- getMemoryName (module , memoryName),
1411- MemoryOrder::SeqCst);
1417+ const char * memoryName,
1418+ BinaryenMemoryOrder order) {
1419+ return static_cast <Expression*>(
1420+ Builder (*(Module*)module )
1421+ .makeAtomicCmpxchg (bytes,
1422+ offset,
1423+ (Expression*)ptr,
1424+ (Expression*)expected,
1425+ (Expression*)replacement,
1426+ Type (type),
1427+ getMemoryName (module , memoryName),
1428+ static_cast <MemoryOrder>(order)));
14121429}
14131430BinaryenExpressionRef BinaryenAtomicWait (BinaryenModuleRef module ,
14141431 BinaryenExpressionRef ptr,
@@ -2647,6 +2664,21 @@ void BinaryenLoadSetAtomic(BinaryenExpressionRef expr, bool isAtomic) {
26472664 static_cast <Load*>(expression)->order =
26482665 isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
26492666}
2667+
2668+ BinaryenMemoryOrder BinaryenLoadGetMemoryOrder (BinaryenExpressionRef expr) {
2669+ auto * expression = (Expression*)expr;
2670+ assert (expression->is <Load>());
2671+ return static_cast <BinaryenMemoryOrder>(
2672+ static_cast <Load*>(expression)->order );
2673+ }
2674+
2675+ void BinaryenLoadSetMemoryOrder (BinaryenExpressionRef expr,
2676+ BinaryenMemoryOrder order) {
2677+ auto * expression = (Expression*)expr;
2678+ assert (expression->is <Load>());
2679+ static_cast <Load*>(expression)->order = static_cast <MemoryOrder>(order);
2680+ }
2681+
26502682bool BinaryenLoadIsSigned (BinaryenExpressionRef expr) {
26512683 auto * expression = (Expression*)expr;
26522684 assert (expression->is <Load>());
@@ -2711,6 +2743,21 @@ void BinaryenStoreSetAtomic(BinaryenExpressionRef expr, bool isAtomic) {
27112743 static_cast <Store*>(expression)->order =
27122744 isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered;
27132745}
2746+
2747+ BinaryenMemoryOrder BinaryenStoreGetMemoryOrder (BinaryenExpressionRef expr) {
2748+ auto * expression = (Expression*)expr;
2749+ assert (expression->is <Store>());
2750+ return static_cast <BinaryenMemoryOrder>(
2751+ static_cast <Store*>(expression)->order );
2752+ }
2753+
2754+ void BinaryenStoreSetMemoryOrder (BinaryenExpressionRef expr,
2755+ BinaryenMemoryOrder order) {
2756+ auto * expression = (Expression*)expr;
2757+ assert (expression->is <Store>());
2758+ static_cast <Store*>(expression)->order = static_cast <MemoryOrder>(order);
2759+ }
2760+
27142761uint32_t BinaryenStoreGetBytes (BinaryenExpressionRef expr) {
27152762 auto * expression = (Expression*)expr;
27162763 assert (expression->is <Store>());
@@ -3033,6 +3080,21 @@ void BinaryenAtomicRMWSetValue(BinaryenExpressionRef expr,
30333080 assert (valueExpr);
30343081 static_cast <AtomicRMW*>(expression)->value = (Expression*)valueExpr;
30353082}
3083+
3084+ BinaryenMemoryOrder
3085+ BinaryenAtomicRMWGetMemoryOrder (BinaryenExpressionRef expr) {
3086+ auto * expression = (Expression*)expr;
3087+ assert (expression->is <AtomicRMW>());
3088+ return static_cast <BinaryenMemoryOrder>(
3089+ static_cast <AtomicRMW*>(expression)->order );
3090+ }
3091+
3092+ void BinaryenAtomicRMWSetMemoryOrder (BinaryenExpressionRef expr,
3093+ BinaryenMemoryOrder order) {
3094+ auto * expression = (Expression*)expr;
3095+ assert (expression->is <AtomicRMW>());
3096+ static_cast <AtomicRMW*>(expression)->order = static_cast <MemoryOrder>(order);
3097+ }
30363098// AtomicCmpxchg
30373099uint32_t BinaryenAtomicCmpxchgGetBytes (BinaryenExpressionRef expr) {
30383100 auto * expression = (Expression*)expr;
@@ -3094,6 +3156,22 @@ void BinaryenAtomicCmpxchgSetReplacement(
30943156 static_cast <AtomicCmpxchg*>(expression)->replacement =
30953157 (Expression*)replacementExpr;
30963158}
3159+
3160+ BinaryenMemoryOrder
3161+ BinaryenAtomicCmpxchgGetMemoryOrder (BinaryenExpressionRef expr) {
3162+ auto * expression = (Expression*)expr;
3163+ assert (expression->is <AtomicCmpxchg>());
3164+ return static_cast <BinaryenMemoryOrder>(
3165+ static_cast <AtomicCmpxchg*>(expression)->order );
3166+ }
3167+
3168+ void BinaryenAtomicCmpxchgSetMemoryOrder (BinaryenExpressionRef expr,
3169+ BinaryenMemoryOrder order) {
3170+ auto * expression = (Expression*)expr;
3171+ assert (expression->is <AtomicCmpxchg>());
3172+ static_cast <AtomicCmpxchg*>(expression)->order =
3173+ static_cast <MemoryOrder>(order);
3174+ }
30973175// AtomicWait
30983176BinaryenExpressionRef BinaryenAtomicWaitGetPtr (BinaryenExpressionRef expr) {
30993177 auto * expression = (Expression*)expr;
0 commit comments