Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 18 additions & 7 deletions src/wasm-interpreter.h
Original file line number Diff line number Diff line change
Expand Up @@ -4028,7 +4028,7 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
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:
Expand Down Expand Up @@ -4063,7 +4063,7 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
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);
Expand All @@ -4079,8 +4079,12 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
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
}
Expand Down Expand Up @@ -5149,8 +5153,15 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
}
}

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));
Expand All @@ -5161,7 +5172,7 @@ class ModuleRunnerBase : public ExpressionRunner<SubType> {
// 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;
Expand Down