Add parsing/printing for relaxed atomics in RMW
diff --git a/src/parser/parsers.h b/src/parser/parsers.h
index d9ef5d4..b1eb6c7 100644
--- a/src/parser/parsers.h
+++ b/src/parser/parsers.h
@@ -1815,10 +1815,20 @@
uint8_t bytes) {
auto mem = maybeMemidx(ctx);
CHECK_ERR(mem);
+
+ auto maybeOrder = maybeMemOrder(ctx);
+ CHECK_ERR(maybeOrder);
+
auto arg = memarg(ctx, bytes);
CHECK_ERR(arg);
- return ctx.makeAtomicRMW(
- pos, annotations, op, type, bytes, mem.getPtr(), *arg, MemoryOrder::SeqCst);
+ return ctx.makeAtomicRMW(pos,
+ annotations,
+ op,
+ type,
+ bytes,
+ mem.getPtr(),
+ *arg,
+ maybeOrder ? *maybeOrder : MemoryOrder::SeqCst);
}
template<typename Ctx>
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index e54d3ee..6eba429 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -661,6 +661,7 @@
}
restoreNormalColor(o);
printMemoryName(curr->memory, o, wasm);
+ printMemoryOrder(curr->order);
if (curr->offset) {
o << " offset=" << curr->offset;
}
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 2c73040..1aa002f 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -3705,37 +3705,37 @@
case BinaryConsts::I32AtomicRMW##op: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 4, offset, Type::i32, mem, MemoryOrder::SeqCst); \
+ RMW##op, 4, offset, Type::i32, mem, memoryOrder); \
} \
case BinaryConsts::I32AtomicRMW##op##8U: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 1, offset, Type::i32, mem, MemoryOrder::SeqCst); \
+ RMW##op, 1, offset, Type::i32, mem, memoryOrder); \
} \
case BinaryConsts::I32AtomicRMW##op##16U: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 2, offset, Type::i32, mem, MemoryOrder::SeqCst); \
+ RMW##op, 2, offset, Type::i32, mem, memoryOrder); \
} \
case BinaryConsts::I64AtomicRMW##op: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 8, offset, Type::i64, mem, MemoryOrder::SeqCst); \
+ RMW##op, 8, offset, Type::i64, mem, memoryOrder); \
} \
case BinaryConsts::I64AtomicRMW##op##8U: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 1, offset, Type::i64, mem, MemoryOrder::SeqCst); \
+ RMW##op, 1, offset, Type::i64, mem, memoryOrder); \
} \
case BinaryConsts::I64AtomicRMW##op##16U: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 2, offset, Type::i64, mem, MemoryOrder::SeqCst); \
+ RMW##op, 2, offset, Type::i64, mem, memoryOrder); \
} \
case BinaryConsts::I64AtomicRMW##op##32U: { \
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
return builder.makeAtomicRMW( \
- RMW##op, 4, offset, Type::i64, mem, MemoryOrder::SeqCst); \
+ RMW##op, 4, offset, Type::i64, mem, memoryOrder); \
}
RMW(Add);