Skip to content

Commit 4ca8b4d

Browse files
Michael StarzingerCommit Bot
authored andcommitted
[wasm] Implement "atomic.fence" operator.
This adds decoding and compilation of the "atomic.fence" operator, which is intended to preserve the synchronization guarantees of higher-level languages. Unlike other atomic operators, it does not target a particular linear memory. It may occur in modules which declare no memory, or a non-shared memory, without causing a validation error. See proposal: WebAssembly/threads#141 See discussion: WebAssembly/threads#140 R=clemensh@chromium.org TEST=cctest/test-run-wasm-atomics/RunWasmXXX_AtomicFence BUG=v8:9452 Change-Id: Ibf7e46227f7edfe5c81c097cfc15924c59614067 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1701856 Commit-Queue: Michael Starzinger <mstarzinger@chromium.org> Reviewed-by: Clemens Hammacher <clemensh@chromium.org> Reviewed-by: Deepti Gandluri <gdeepti@chromium.org> Cr-Commit-Position: refs/heads/master@{#62821}
1 parent 7b303af commit 4ca8b4d

40 files changed

Lines changed: 169 additions & 27 deletions

src/codegen/ia32/assembler-ia32.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,13 @@ void Assembler::cmpxchg8b(Operand dst) {
756756
emit_operand(ecx, dst);
757757
}
758758

759+
void Assembler::mfence() {
760+
EnsureSpace ensure_space(this);
761+
EMIT(0x0F);
762+
EMIT(0xAE);
763+
EMIT(0xF0);
764+
}
765+
759766
void Assembler::lfence() {
760767
EnsureSpace ensure_space(this);
761768
EMIT(0x0F);

src/codegen/ia32/assembler-ia32.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
542542
void cmpxchg8b(Operand dst);
543543

544544
// Memory Fence
545+
void mfence();
545546
void lfence();
546547

547548
void pause();

src/codegen/x64/assembler-x64.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,13 @@ void Assembler::emit_cmpxchg(Operand dst, Register src, int size) {
12581258
emit_operand(src, dst);
12591259
}
12601260

1261+
void Assembler::mfence() {
1262+
EnsureSpace ensure_space(this);
1263+
emit(0x0F);
1264+
emit(0xAE);
1265+
emit(0xF0);
1266+
}
1267+
12611268
void Assembler::lfence() {
12621269
EnsureSpace ensure_space(this);
12631270
emit(0x0F);

src/codegen/x64/assembler-x64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,6 +1746,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
17461746
void rorxl(Register dst, Register src, byte imm8);
17471747
void rorxl(Register dst, Operand src, byte imm8);
17481748

1749+
void mfence();
17491750
void lfence();
17501751
void pause();
17511752

src/compiler/backend/arm/code-generator-arm.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
17521752
}
17531753
break;
17541754
}
1755+
case kArmDmbIsh: {
1756+
__ dmb(ISH);
1757+
break;
1758+
}
17551759
case kArmDsbIsb: {
17561760
__ dsb(SY);
17571761
__ isb(SY);

src/compiler/backend/arm/instruction-codes-arm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ namespace compiler {
126126
V(ArmPush) \
127127
V(ArmPoke) \
128128
V(ArmPeek) \
129+
V(ArmDmbIsh) \
129130
V(ArmDsbIsb) \
130131
V(ArmF32x4Splat) \
131132
V(ArmF32x4ExtractLane) \

src/compiler/backend/arm/instruction-scheduler-arm.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
275275
case kArmStr:
276276
case kArmPush:
277277
case kArmPoke:
278+
case kArmDmbIsh:
278279
case kArmDsbIsb:
279280
case kArmWord32AtomicPairStore:
280281
case kArmWord32AtomicPairAdd:

src/compiler/backend/arm/instruction-selector-arm.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,6 +2020,11 @@ void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) {
20202020
g.UseRegister(right));
20212021
}
20222022

2023+
void InstructionSelector::VisitMemoryBarrier(Node* node) {
2024+
ArmOperandGenerator g(this);
2025+
Emit(kArmDmbIsh, g.NoOutput());
2026+
}
2027+
20232028
void InstructionSelector::VisitWord32AtomicLoad(Node* node) {
20242029
LoadRepresentation load_rep = LoadRepresentationOf(node->op());
20252030
ArmOperandGenerator g(this);

src/compiler/backend/arm64/code-generator-arm64.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
16251625
case kArm64StrCompressTagged:
16261626
__ StoreTaggedField(i.InputOrZeroRegister64(0), i.MemoryOperand(1));
16271627
break;
1628+
case kArm64DmbIsh:
1629+
__ Dmb(InnerShareable, BarrierAll);
1630+
break;
16281631
case kArm64DsbIsb:
16291632
__ Dsb(FullSystem, BarrierAll);
16301633
__ Isb();

src/compiler/backend/arm64/instruction-codes-arm64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ namespace compiler {
171171
V(Arm64CompressSigned) \
172172
V(Arm64CompressPointer) \
173173
V(Arm64CompressAny) \
174+
V(Arm64DmbIsh) \
174175
V(Arm64DsbIsb) \
175176
V(Arm64F32x4Splat) \
176177
V(Arm64F32x4ExtractLane) \

0 commit comments

Comments
 (0)