Skip to content

Commit 18480e3

Browse files
gemini: add ordering field for rmw
1 parent aa77b42 commit 18480e3

11 files changed

Lines changed: 58 additions & 33 deletions

File tree

src/binaryen-c.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,15 +1382,15 @@ BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module,
13821382
BinaryenExpressionRef value,
13831383
BinaryenType type,
13841384
const char* memoryName) {
1385-
return static_cast<Expression*>(
1386-
Builder(*(Module*)module)
1387-
.makeAtomicRMW(AtomicRMWOp(op),
1388-
bytes,
1389-
offset,
1390-
(Expression*)ptr,
1391-
(Expression*)value,
1392-
Type(type),
1393-
getMemoryName(module, memoryName)));
1385+
return Builder(*(Module*)module)
1386+
.makeAtomicRMW(AtomicRMWOp(op),
1387+
bytes,
1388+
offset,
1389+
(Expression*)ptr,
1390+
(Expression*)value,
1391+
Type(type),
1392+
Name(memoryName),
1393+
MemoryOrder::SeqCst);
13941394
}
13951395
BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module,
13961396
BinaryenIndex bytes,

src/ir/properties.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,11 @@ inline MemoryOrder getMemoryOrder(Expression* curr) {
507507
if (auto* store = curr->dynCast<Store>()) {
508508
return store->order;
509509
}
510-
if (curr->is<AtomicRMW>() || curr->is<AtomicWait>() ||
511-
curr->is<AtomicNotify>() || curr->is<AtomicFence>()) {
510+
if (auto* rmw = curr->dynCast<AtomicRMW>()) {
511+
return rmw->order;
512+
}
513+
if (curr->is<AtomicWait>() || curr->is<AtomicNotify>() ||
514+
curr->is<AtomicFence>()) {
512515
return MemoryOrder::SeqCst;
513516
}
514517
return MemoryOrder::Unordered;

src/parser/contexts.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,8 @@ struct NullInstrParserCtx {
575575
Type,
576576
int,
577577
MemoryIdxT*,
578-
MemargT) {
578+
MemargT,
579+
MemoryOrder) {
579580
return Ok{};
580581
}
581582
Result<> makeAtomicCmpxchg(
@@ -2274,11 +2275,12 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx>, AnnotationParserCtx {
22742275
Type type,
22752276
int bytes,
22762277
Name* mem,
2277-
Memarg memarg) {
2278+
Memarg memarg,
2279+
MemoryOrder order) {
22782280
auto m = getMemory(pos, mem);
22792281
CHECK_ERR(m);
2280-
return withLoc(pos,
2281-
irBuilder.makeAtomicRMW(op, bytes, memarg.offset, type, *m));
2282+
return withLoc(
2283+
pos, irBuilder.makeAtomicRMW(op, bytes, memarg.offset, type, *m, order));
22822284
}
22832285

22842286
Result<> makeAtomicCmpxchg(Index pos,

src/parser/parsers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1818,7 +1818,7 @@ Result<> makeAtomicRMW(Ctx& ctx,
18181818
auto arg = memarg(ctx, bytes);
18191819
CHECK_ERR(arg);
18201820
return ctx.makeAtomicRMW(
1821-
pos, annotations, op, type, bytes, mem.getPtr(), *arg);
1821+
pos, annotations, op, type, bytes, mem.getPtr(), *arg, MemoryOrder::SeqCst);
18221822
}
18231823

18241824
template<typename Ctx>

src/tools/fuzzing/fuzzing.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4770,7 +4770,8 @@ Expression* TranslateToFuzzReader::makeAtomic(Type type) {
47704770
ptr,
47714771
value,
47724772
type,
4773-
wasm.memories[0]->name);
4773+
wasm.memories[0]->name,
4774+
MemoryOrder::SeqCst);
47744775
} else {
47754776
auto* expected = make(type);
47764777
auto* replacement = make(type);

src/wasm-builder.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,16 +466,18 @@ class Builder {
466466
Expression* ptr,
467467
Expression* value,
468468
Type type,
469-
Name memory) {
469+
Name memory,
470+
MemoryOrder order) {
470471
auto* ret = wasm.allocator.alloc<AtomicRMW>();
471472
ret->op = op;
472473
ret->bytes = bytes;
473474
ret->offset = offset;
474475
ret->ptr = ptr;
475476
ret->value = value;
476477
ret->type = type;
477-
ret->finalize();
478478
ret->memory = memory;
479+
ret->order = order;
480+
ret->finalize();
479481
return ret;
480482
}
481483
AtomicCmpxchg* makeAtomicCmpxchg(unsigned bytes,

src/wasm-delegations-fields.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ DELEGATE_FIELD_CHILD(AtomicRMW, ptr)
375375
DELEGATE_FIELD_INT(AtomicRMW, op)
376376
DELEGATE_FIELD_INT(AtomicRMW, bytes)
377377
DELEGATE_FIELD_ADDRESS(AtomicRMW, offset)
378+
DELEGATE_FIELD_INT(AtomicRMW, order)
378379
DELEGATE_FIELD_NAME_KIND(AtomicRMW, memory, ModuleItemKind::Memory)
379380
DELEGATE_FIELD_CASE_END(AtomicRMW)
380381

src/wasm-ir-builder.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,12 @@ class IRBuilder : public UnifiedExpressionVisitor<IRBuilder, Result<>> {
160160
unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order);
161161
Result<> makeAtomicStore(
162162
unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order);
163-
Result<> makeAtomicRMW(
164-
AtomicRMWOp op, unsigned bytes, Address offset, Type type, Name mem);
163+
Result<> makeAtomicRMW(AtomicRMWOp op,
164+
unsigned bytes,
165+
Address offset,
166+
Type type,
167+
Name mem,
168+
MemoryOrder order);
165169
Result<>
166170
makeAtomicCmpxchg(unsigned bytes, Address offset, Type type, Name mem);
167171
Result<> makeAtomicWait(Type type, Address offset, Name mem);

src/wasm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,7 @@ class AtomicRMW : public SpecificExpression<Expression::AtomicRMWId> {
10351035
Expression* ptr;
10361036
Expression* value;
10371037
Name memory;
1038+
MemoryOrder order = MemoryOrder::SeqCst;
10381039

10391040
void finalize();
10401041
};

src/wasm/wasm-binary.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3704,31 +3704,38 @@ Result<> WasmBinaryReader::readInst() {
37043704
#define RMW(op) \
37053705
case BinaryConsts::I32AtomicRMW##op: { \
37063706
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3707-
return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i32, mem); \
3707+
return builder.makeAtomicRMW( \
3708+
RMW##op, 4, offset, Type::i32, mem, MemoryOrder::SeqCst); \
37083709
} \
37093710
case BinaryConsts::I32AtomicRMW##op##8U: { \
37103711
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3711-
return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i32, mem); \
3712+
return builder.makeAtomicRMW( \
3713+
RMW##op, 1, offset, Type::i32, mem, MemoryOrder::SeqCst); \
37123714
} \
37133715
case BinaryConsts::I32AtomicRMW##op##16U: { \
37143716
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3715-
return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i32, mem); \
3717+
return builder.makeAtomicRMW( \
3718+
RMW##op, 2, offset, Type::i32, mem, MemoryOrder::SeqCst); \
37163719
} \
37173720
case BinaryConsts::I64AtomicRMW##op: { \
37183721
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3719-
return builder.makeAtomicRMW(RMW##op, 8, offset, Type::i64, mem); \
3722+
return builder.makeAtomicRMW( \
3723+
RMW##op, 8, offset, Type::i64, mem, MemoryOrder::SeqCst); \
37203724
} \
37213725
case BinaryConsts::I64AtomicRMW##op##8U: { \
37223726
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3723-
return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i64, mem); \
3727+
return builder.makeAtomicRMW( \
3728+
RMW##op, 1, offset, Type::i64, mem, MemoryOrder::SeqCst); \
37243729
} \
37253730
case BinaryConsts::I64AtomicRMW##op##16U: { \
37263731
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3727-
return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i64, mem); \
3732+
return builder.makeAtomicRMW( \
3733+
RMW##op, 2, offset, Type::i64, mem, MemoryOrder::SeqCst); \
37283734
} \
37293735
case BinaryConsts::I64AtomicRMW##op##32U: { \
37303736
auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \
3731-
return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i64, mem); \
3737+
return builder.makeAtomicRMW( \
3738+
RMW##op, 4, offset, Type::i64, mem, MemoryOrder::SeqCst); \
37323739
}
37333740

37343741
RMW(Add);

0 commit comments

Comments
 (0)