@@ -49,6 +49,7 @@ template<typename Ctx> Result<typename Ctx::MemTypeT> memtype(Ctx&);
4949template <typename Ctx>
5050Result<typename Ctx::MemTypeT> memtypeContinued (Ctx&, Type addressType);
5151template <typename Ctx> Result<MemoryOrder> memorder (Ctx&);
52+ template <typename Ctx> MaybeResult<MemoryOrder> maybeMemOrder (Ctx&);
5253template <typename Ctx> Result<typename Ctx::TableTypeT> tabletype (Ctx&);
5354template <typename Ctx>
5455Result<typename Ctx::TableTypeT> tabletypeContinued (Ctx&, Type addressType);
@@ -860,6 +861,18 @@ template<typename Ctx> Result<MemoryOrder> memorder(Ctx& ctx) {
860861 return MemoryOrder::SeqCst;
861862}
862863
864+ // memorder ::= 'seqcst' | 'acqrel'
865+ template <typename Ctx> MaybeResult<MemoryOrder> maybeMemOrder (Ctx& ctx) {
866+ if (ctx.in .takeKeyword (" seqcst" sv)) {
867+ return MemoryOrder::SeqCst;
868+ }
869+ if (ctx.in .takeKeyword (" acqrel" sv)) {
870+ return MemoryOrder::AcqRel;
871+ }
872+
873+ return {};
874+ }
875+
863876// tabletype ::= (limits32 | 'i32' limits32 | 'i64' limit64) reftype
864877template <typename Ctx> Result<typename Ctx::TableTypeT> tabletype (Ctx& ctx) {
865878 Type addressType = Type::i32 ;
@@ -1737,12 +1750,30 @@ Result<> makeLoad(Ctx& ctx,
17371750 bool signed_,
17381751 int bytes,
17391752 bool isAtomic) {
1753+
1754+ // We could only parse this when `isAtomic`, but this way gives a clearer
1755+ // error since `memIdx` can never be mistaken for a `memOrder`.
1756+ auto maybeOrder = maybeMemOrder (ctx);
1757+ CHECK_ERR (maybeOrder);
1758+
1759+ if (maybeOrder && !isAtomic) {
1760+ return Err{" Memory ordering can only be provided for atomic loads." };
1761+ }
1762+
17401763 auto mem = maybeMemidx (ctx);
17411764 CHECK_ERR (mem);
17421765 auto arg = memarg (ctx, bytes);
17431766 CHECK_ERR (arg);
1744- return ctx.makeLoad (
1745- pos, annotations, type, signed_, bytes, isAtomic, mem.getPtr (), *arg);
1767+ // todo should we remove isAtomic?
1768+ return ctx.makeLoad (pos,
1769+ annotations,
1770+ type,
1771+ signed_,
1772+ bytes,
1773+ isAtomic,
1774+ mem.getPtr (),
1775+ *arg,
1776+ maybeOrder ? *maybeOrder : MemoryOrder::SeqCst);
17461777}
17471778
17481779template <typename Ctx>
0 commit comments