From d1ec4bdf21c4d3289679b3c6399eb9ec57a7ce2b Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Sun, 1 Feb 2026 07:04:36 +0000 Subject: [PATCH] Use the correct memory order in doAtomicLoad --- src/wasm-interpreter.h | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index cf51b3d8f72..d43f100d5ac 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -4028,7 +4028,7 @@ class ModuleRunnerBase : public ExpressionRunner { auto addr = info.instance->getFinalAddress(curr, ptr.getSingleValue(), memorySize); auto loaded = info.instance->doAtomicLoad( - addr, curr->bytes, curr->type, info.name, memorySize); + addr, curr->bytes, curr->type, info.name, memorySize, curr->order); auto computed = value.getSingleValue(); switch (curr->op) { case RMWAdd: @@ -4063,7 +4063,7 @@ class ModuleRunnerBase : public ExpressionRunner { info.instance->getFinalAddress(curr, ptr.getSingleValue(), memorySize); expected = Flow(wrapToSmallerSize(expected.getSingleValue(), curr->bytes)); auto loaded = info.instance->doAtomicLoad( - addr, curr->bytes, curr->type, info.name, memorySize); + addr, curr->bytes, curr->type, info.name, memorySize, curr->order); if (loaded == expected.getSingleValue()) { info.instance->doAtomicStore( addr, curr->bytes, replacement.getSingleValue(), info.name, memorySize); @@ -4079,8 +4079,12 @@ class ModuleRunnerBase : public ExpressionRunner { auto memorySize = info.instance->getMemorySize(info.name); auto addr = info.instance->getFinalAddress( curr, ptr.getSingleValue(), bytes, memorySize); - auto loaded = info.instance->doAtomicLoad( - addr, bytes, curr->expectedType, info.name, memorySize); + auto loaded = info.instance->doAtomicLoad(addr, + bytes, + curr->expectedType, + info.name, + memorySize, + MemoryOrder::SeqCst); if (loaded != expected.getSingleValue()) { return Literal(int32_t(1)); // not equal } @@ -5149,8 +5153,15 @@ class ModuleRunnerBase : public ExpressionRunner { } } - Literal doAtomicLoad( - Address addr, Index bytes, Type type, Name memoryName, Address memorySize) { + Literal doAtomicLoad(Address addr, + Index bytes, + Type type, + Name memoryName, + Address memorySize, + MemoryOrder order) { + if (order == MemoryOrder::Unordered) { + Fatal() << "Expected a non-unordered MemoryOrder in doAtomicLoad"; + } checkAtomicAddress(addr, bytes, memorySize); Const ptr; ptr.value = Literal(int32_t(addr)); @@ -5161,7 +5172,7 @@ class ModuleRunnerBase : public ExpressionRunner { // always an unsigned extension. load.signed_ = false; load.align = bytes; - load.order = MemoryOrder::SeqCst; + load.order = order; load.ptr = &ptr; load.type = type; load.memory = memoryName;