@@ -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,32 @@ Result<> makeLoad(Ctx& ctx,
17371750 bool signed_,
17381751 int bytes,
17391752 bool isAtomic) {
1753+
17401754 auto mem = maybeMemidx (ctx);
17411755 CHECK_ERR (mem);
1756+
1757+ // We could only parse this when `isAtomic`, but this way gives a clearer
1758+ // error since `memIdx` can never be mistaken for a `memOrder`.
1759+ auto maybeOrder = maybeMemOrder (ctx);
1760+ CHECK_ERR (maybeOrder);
1761+
1762+ if (maybeOrder && !isAtomic) {
1763+ return Err{" Memory ordering can only be provided for atomic loads." };
1764+ }
1765+
17421766 auto arg = memarg (ctx, bytes);
17431767 CHECK_ERR (arg);
1744- return ctx.makeLoad (
1745- pos, annotations, type, signed_, bytes, isAtomic, mem.getPtr (), *arg);
1768+ return ctx.makeLoad (pos,
1769+ annotations,
1770+ type,
1771+ signed_,
1772+ bytes,
1773+ isAtomic,
1774+ mem.getPtr (),
1775+ *arg,
1776+ maybeOrder ? *maybeOrder
1777+ : isAtomic ? MemoryOrder::SeqCst
1778+ : MemoryOrder::Unordered);
17461779}
17471780
17481781template <typename Ctx>
0 commit comments