Skip to content

Commit 8c73b53

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm] Use dmb ishst instead of dmb ish for store-store fence.
TEST=ci Change-Id: Id7fb33bb4d9626ad420fd5aac2df86b47bd5c7bf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/459662 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Alexander Aprelev <aam@google.com>
1 parent c1fff5e commit 8c73b53

16 files changed

+71
-28
lines changed

runtime/platform/atomic.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,28 @@ static inline T LoadRelaxed(const T* ptr) {
153153
std::memory_order_relaxed);
154154
}
155155

156+
inline void StoreStoreFence() {
157+
#if defined(HOST_ARCH_ARM) && defined(_MSC_VER)
158+
__dmb(_ARM_BARRIER_ISHST);
159+
#elif defined(HOST_ARCH_ARM64) && defined(_MSC_VER)
160+
__dmb(_ARM64_BARRIER_ISHST);
161+
#elif defined(HOST_ARCH_ARM64) && defined(__GNUC__)
162+
__asm__ __volatile__("dmb ishst" : : : "memory");
163+
#elif defined(HOST_ARCH_ARM) && defined(__GNUC__)
164+
__asm__ __volatile__("dmb ishst" : : : "memory");
165+
#elif defined(HOST_ARCH_RISCV32) && defined(__GNUC__)
166+
__asm__ __volatile__("fence w,w" : : : "memory");
167+
#elif defined(HOST_ARCH_RISCV64) && defined(__GNUC__)
168+
__asm__ __volatile__("fence w,w" : : : "memory");
169+
#else
170+
// GCC warns that TSAN doesn't understand thread fences.
171+
#if defined(__GNUC__) && !defined(__clang__)
172+
#pragma GCC diagnostic ignored "-Wtsan"
173+
#endif
174+
std::atomic_thread_fence(std::memory_order_release);
175+
#endif
176+
}
177+
156178
} // namespace dart
157179

158180
#endif // RUNTIME_PLATFORM_ATOMIC_H_

runtime/vm/compiler/assembler/assembler_arm.cc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -527,11 +527,6 @@ void Assembler::strex(Register rd, Register rt, Register rn, Condition cond) {
527527
Emit(encoding);
528528
}
529529

530-
void Assembler::dmb() {
531-
// Emit a `dmb ish` instruction.
532-
Emit(kDataMemoryBarrier);
533-
}
534-
535530
static int32_t BitFieldExtractEncoding(bool sign_extend,
536531
Register rd,
537532
Register rn,

runtime/vm/compiler/assembler/assembler_arm.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,12 +438,12 @@ class Assembler : public AssemblerBase {
438438
const Address& address,
439439
OperandSize size = kFourBytes) override {
440440
Load(dst, address, size);
441-
dmb();
441+
dmb_ish();
442442
}
443443
void StoreRelease(Register src,
444444
const Address& address,
445445
OperandSize size = kFourBytes) override {
446-
dmb();
446+
dmb_ish();
447447
Store(src, address, size);
448448
}
449449

@@ -469,6 +469,8 @@ class Assembler : public AssemblerBase {
469469
// Debugging and bringup support.
470470
void Breakpoint() override { bkpt(0); }
471471

472+
void StoreStoreFence() override { dmb_ishst(); }
473+
472474
// Data-processing instructions.
473475
void and_(Register rd, Register rn, Operand o, Condition cond = AL);
474476
void ands(Register rd, Register rn, Operand o, Condition cond = AL);
@@ -601,7 +603,8 @@ class Assembler : public AssemblerBase {
601603
void ldrex(Register rd, Register rn, Condition cond = AL);
602604
void strex(Register rd, Register rt, Register rn, Condition cond = AL);
603605

604-
void dmb();
606+
void dmb_ish() { Emit(kDMB_ISH); }
607+
void dmb_ishst() { Emit(kDMB_ISHST); }
605608

606609
// Media instructions.
607610
void sbfx(Register rd,
@@ -1041,13 +1044,13 @@ class Assembler : public AssemblerBase {
10411044
void InitializeHeader(Register tags, Register object) {
10421045
str(tags, FieldAddress(object, target::Object::tags_offset()));
10431046
#if defined(TARGET_HAS_FAST_WRITE_WRITE_FENCE)
1044-
dmb();
1047+
StoreStoreFence();
10451048
#endif
10461049
}
10471050
void InitializeHeaderUntagged(Register tags, Register object) {
10481051
str(tags, Address(object, target::Object::tags_offset()));
10491052
#if defined(TARGET_HAS_FAST_WRITE_WRITE_FENCE)
1050-
dmb();
1053+
StoreStoreFence();
10511054
#endif
10521055
}
10531056

runtime/vm/compiler/assembler/assembler_arm64.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,8 @@ class Assembler : public AssemblerBase {
564564
// Debugging and bringup support.
565565
void Breakpoint() override { brk(0); }
566566

567+
void StoreStoreFence() override { dmb_ishst(); }
568+
567569
void SetPrologueOffset() {
568570
if (prologue_offset_ == -1) {
569571
prologue_offset_ = CodeSize();
@@ -1242,7 +1244,8 @@ class Assembler : public AssemblerBase {
12421244
// Breakpoint.
12431245
void brk(uint16_t imm) { EmitExceptionGenOp(BRK, imm); }
12441246

1245-
void dmb() { Emit(kDataMemoryBarrier); }
1247+
void dmb_ish() { Emit(kDMB_ISH); }
1248+
void dmb_ishst() { Emit(kDMB_ISHST); }
12461249

12471250
// Double floating point.
12481251
bool fmovdi(VRegister vd, double immd) {
@@ -1963,13 +1966,13 @@ class Assembler : public AssemblerBase {
19631966
void InitializeHeader(Register header, Register object) {
19641967
str(header, FieldAddress(object, target::Object::tags_offset()));
19651968
#if defined(TARGET_HAS_FAST_WRITE_WRITE_FENCE)
1966-
dmb();
1969+
StoreStoreFence();
19671970
#endif
19681971
}
19691972
void InitializeHeaderUntagged(Register header, Register object) {
19701973
str(header, Address(object, target::Object::tags_offset()));
19711974
#if defined(TARGET_HAS_FAST_WRITE_WRITE_FENCE)
1972-
dmb();
1975+
StoreStoreFence();
19731976
#endif
19741977
}
19751978

runtime/vm/compiler/assembler/assembler_base.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,8 @@ class AssemblerBase : public StackResource {
630630

631631
virtual void Breakpoint() = 0;
632632

633+
virtual void StoreStoreFence() = 0;
634+
633635
virtual void SmiTag(Register r) = 0;
634636

635637
virtual void Bind(Label* label) = 0;

runtime/vm/compiler/assembler/assembler_ia32.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,8 @@ class Assembler : public AssemblerBase {
11991199
// Debugging and bringup support.
12001200
void Breakpoint() override { int3(); }
12011201

1202+
void StoreStoreFence() override {}
1203+
12021204
// Check if the given value is an integer value that can be directly
12031205
// embedded into the code without additional XORing with jit_cookie.
12041206
// We consider 16-bit integers, powers of two and corresponding masks

runtime/vm/compiler/assembler/assembler_riscv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,8 @@ class Assembler : public MicroAssembler {
10271027
// Debugging and bringup support.
10281028
void Breakpoint() override { trap(); }
10291029

1030+
void StoreStoreFence() override { fence(kWrite, kWrite); }
1031+
10301032
void SetPrologueOffset() {
10311033
if (prologue_offset_ == -1) {
10321034
prologue_offset_ = CodeSize();

runtime/vm/compiler/assembler/assembler_x64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,8 @@ class Assembler : public AssemblerBase {
13451345
// Debugging and bringup support.
13461346
void Breakpoint() override { int3(); }
13471347

1348+
void StoreStoreFence() override {}
1349+
13481350
static bool AddressCanHoldConstantIndex(const Object& constant,
13491351
bool is_external,
13501352
intptr_t cid,

runtime/vm/compiler/assembler/disassembler_arm.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,9 +1444,10 @@ void ARMDecoder::InstructionDecode(uword pc) {
14441444
if (instr->ConditionField() == kSpecialCondition) {
14451445
if (instr->InstructionBits() == static_cast<int32_t>(0xf57ff01f)) {
14461446
Format(instr, "clrex");
1447-
} else if (instr->InstructionBits() ==
1448-
static_cast<int32_t>(kDataMemoryBarrier)) {
1447+
} else if (instr->InstructionBits() == static_cast<int32_t>(kDMB_ISH)) {
14491448
Format(instr, "dmb ish");
1449+
} else if (instr->InstructionBits() == static_cast<int32_t>(kDMB_ISHST)) {
1450+
Format(instr, "dmb ishst");
14501451
} else {
14511452
if (instr->IsSIMDDataProcessing()) {
14521453
DecodeSIMDDataProcessing(instr);

runtime/vm/compiler/assembler/disassembler_arm64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,10 +994,14 @@ void ARM64Decoder::DecodeSystem(Instr* instr) {
994994
return;
995995
}
996996

997-
if (instr->InstructionBits() == kDataMemoryBarrier) {
997+
if (instr->InstructionBits() == kDMB_ISH) {
998998
Format(instr, "dmb ish");
999999
return;
10001000
}
1001+
if (instr->InstructionBits() == kDMB_ISHST) {
1002+
Format(instr, "dmb ishst");
1003+
return;
1004+
}
10011005

10021006
if ((instr->Bits(0, 8) == 0x1f) && (instr->Bits(12, 4) == 2) &&
10031007
(instr->Bits(16, 3) == 3) && (instr->Bits(19, 2) == 0) &&

0 commit comments

Comments
 (0)