Skip to content

Commit 8b7de40

Browse files
miladfarcaV8 LUCI CQ
authored andcommitted
PPC/s390: [acqrel] Added atomic acquire load and release store instructions
Port 4029beb R=junyan1@ibm.com BUG= LOG=N Change-Id: I90b6819667613d02eefe9eaa555971fd054a2777 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7489536 Commit-Queue: Milad Farazmand <mfarazma@ibm.com> Reviewed-by: John <junyan1@ibm.com> Cr-Commit-Position: refs/heads/main@{#104751}
1 parent fd04cc1 commit 8b7de40

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/wasm/baseline/ppc/liftoff-assembler-ppc-inl.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define V8_WASM_BASELINE_PPC_LIFTOFF_ASSEMBLER_PPC_INL_H_
77

88
#include "src/codegen/assembler.h"
9+
#include "src/codegen/atomic-memory-order.h"
910
#include "src/codegen/interface-descriptors-inl.h"
1011
#include "src/heap/mutable-page.h"
1112
#include "src/wasm/baseline/liftoff-assembler.h"
@@ -749,8 +750,12 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
749750
void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
750751
Register offset_reg, uintptr_t offset_imm,
751752
LoadType type, uint32_t* protected_load_pc,
753+
AtomicMemoryOrder memory_order,
752754
LiftoffRegList /* pinned */, bool i64_offset,
753755
Endianness /* endianness */) {
756+
if (memory_order == AtomicMemoryOrder::kSeqCst) {
757+
sync();
758+
}
754759
Load(dst, src_addr, offset_reg, offset_imm, type, protected_load_pc, true,
755760
i64_offset);
756761
lwsync();
@@ -759,9 +764,17 @@ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
759764
void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
760765
uintptr_t offset_imm, LiftoffRegister src,
761766
StoreType type, uint32_t* protected_store_pc,
767+
AtomicMemoryOrder memory_order,
762768
LiftoffRegList pinned, bool i64_offset,
763769
Endianness /* endianness */) {
764-
lwsync();
770+
DCHECK(memory_order == AtomicMemoryOrder::kSeqCst ||
771+
memory_order == AtomicMemoryOrder::kAcqRel);
772+
773+
if (memory_order == AtomicMemoryOrder::kSeqCst) {
774+
sync();
775+
} else {
776+
lwsync();
777+
}
765778
Store(dst_addr, offset_reg, offset_imm, src, type, pinned, protected_store_pc,
766779
true, i64_offset);
767780
sync();

src/wasm/baseline/s390/liftoff-assembler-s390-inl.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define V8_WASM_BASELINE_S390_LIFTOFF_ASSEMBLER_S390_INL_H_
77

88
#include "src/codegen/assembler.h"
9+
#include "src/codegen/atomic-memory-order.h"
910
#include "src/codegen/interface-descriptors-inl.h"
1011
#include "src/heap/mutable-page.h"
1112
#include "src/wasm/baseline/liftoff-assembler.h"
@@ -665,6 +666,7 @@ void LiftoffAssembler::Store(Register dst_addr, Register offset_reg,
665666
void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
666667
Register offset_reg, uintptr_t offset_imm,
667668
LoadType type, uint32_t* protected_load_pc,
669+
AtomicMemoryOrder /* memory_order */,
668670
LiftoffRegList /* pinned */, bool i64_offset,
669671
Endianness endianness) {
670672
Load(dst, src_addr, offset_reg, offset_imm, type, protected_load_pc,
@@ -674,8 +676,17 @@ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
674676
void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
675677
uintptr_t offset_imm, LiftoffRegister src,
676678
StoreType type, uint32_t* protected_store_pc,
679+
AtomicMemoryOrder memory_order,
677680
LiftoffRegList /* pinned */, bool i64_offset,
678681
Endianness endianness) {
682+
DCHECK(memory_order == AtomicMemoryOrder::kSeqCst ||
683+
memory_order == AtomicMemoryOrder::kAcqRel);
684+
if (memory_order == AtomicMemoryOrder::kAcqRel) {
685+
Store(dst_addr, offset_reg, offset_imm, src, type, {}, protected_store_pc,
686+
true, i64_offset);
687+
return;
688+
}
689+
679690
#ifdef V8_TARGET_BIG_ENDIAN
680691
bool reverse_bytes = endianness == LiftoffAssembler::kLittle;
681692
#else

0 commit comments

Comments
 (0)