Commit 140b00d8 authored by Yu Yin's avatar Yu Yin Committed by V8 LUCI CQ

[mips] Support acq/rel accesses and atomic accesses on tagged

Port commit 6a487504

Change-Id: Icfff8241e6e920970f0168ebfae535291c4d9e72
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3111275Reviewed-by: 's avatarZhao Jiazhong <zhaojiazhong-hf@loongson.cn>
Commit-Queue: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn>
Cr-Commit-Position: refs/heads/main@{#76418}
parent 5eb08ce2
...@@ -867,7 +867,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -867,7 +867,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ TruncateDoubleToI(isolate(), zone(), i.OutputRegister(), __ TruncateDoubleToI(isolate(), zone(), i.OutputRegister(),
i.InputDoubleRegister(0), DetermineStubCallMode()); i.InputDoubleRegister(0), DetermineStubCallMode());
break; break;
case kArchStoreWithWriteBarrier: { case kArchStoreWithWriteBarrier:
case kArchAtomicStoreWithWriteBarrier: {
RecordWriteMode mode = RecordWriteMode mode =
static_cast<RecordWriteMode>(MiscField::decode(instr->opcode())); static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
Register object = i.InputRegister(0); Register object = i.InputRegister(0);
...@@ -879,7 +880,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -879,7 +880,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
scratch0, scratch1, mode, scratch0, scratch1, mode,
DetermineStubCallMode()); DetermineStubCallMode());
__ Addu(kScratchReg, object, index); __ Addu(kScratchReg, object, index);
__ sw(value, MemOperand(kScratchReg)); if (arch_opcode == kArchStoreWithWriteBarrier) {
__ sw(value, MemOperand(kScratchReg));
} else {
DCHECK_EQ(kArchAtomicStoreWithWriteBarrier, arch_opcode);
__ sync();
__ sw(value, MemOperand(kScratchReg));
__ sync();
}
if (mode > RecordWriteMode::kValueIsPointer) { if (mode > RecordWriteMode::kValueIsPointer) {
__ JumpIfSmi(value, ool->exit()); __ JumpIfSmi(value, ool->exit());
} }
......
...@@ -1900,7 +1900,10 @@ void InstructionSelector::VisitMemoryBarrier(Node* node) { ...@@ -1900,7 +1900,10 @@ void InstructionSelector::VisitMemoryBarrier(Node* node) {
} }
void InstructionSelector::VisitWord32AtomicLoad(Node* node) { void InstructionSelector::VisitWord32AtomicLoad(Node* node) {
LoadRepresentation load_rep = LoadRepresentationOf(node->op()); // TODO(mips-dev): Confirm whether there is any mips32 chip in use and
// support atomic loads of tagged values with barriers.
AtomicLoadParameters atomic_load_params = AtomicLoadParametersOf(node->op());
LoadRepresentation load_rep = atomic_load_params.representation();
MipsOperandGenerator g(this); MipsOperandGenerator g(this);
Node* base = node->InputAt(0); Node* base = node->InputAt(0);
Node* index = node->InputAt(1); Node* index = node->InputAt(1);
...@@ -1912,6 +1915,9 @@ void InstructionSelector::VisitWord32AtomicLoad(Node* node) { ...@@ -1912,6 +1915,9 @@ void InstructionSelector::VisitWord32AtomicLoad(Node* node) {
case MachineRepresentation::kWord16: case MachineRepresentation::kWord16:
opcode = load_rep.IsSigned() ? kAtomicLoadInt16 : kAtomicLoadUint16; opcode = load_rep.IsSigned() ? kAtomicLoadInt16 : kAtomicLoadUint16;
break; break;
case MachineRepresentation::kTaggedSigned: // Fall through.
case MachineRepresentation::kTaggedPointer: // Fall through.
case MachineRepresentation::kTagged:
case MachineRepresentation::kWord32: case MachineRepresentation::kWord32:
opcode = kAtomicLoadWord32; opcode = kAtomicLoadWord32;
break; break;
...@@ -1933,7 +1939,10 @@ void InstructionSelector::VisitWord32AtomicLoad(Node* node) { ...@@ -1933,7 +1939,10 @@ void InstructionSelector::VisitWord32AtomicLoad(Node* node) {
} }
void InstructionSelector::VisitWord32AtomicStore(Node* node) { void InstructionSelector::VisitWord32AtomicStore(Node* node) {
MachineRepresentation rep = AtomicStoreRepresentationOf(node->op()); // TODO(mips-dev): Confirm whether there is any mips32 chip in use and
// support atomic stores of tagged values with barriers.
AtomicStoreParameters store_params = AtomicStoreParametersOf(node->op());
MachineRepresentation rep = store_params.representation();
MipsOperandGenerator g(this); MipsOperandGenerator g(this);
Node* base = node->InputAt(0); Node* base = node->InputAt(0);
Node* index = node->InputAt(1); Node* index = node->InputAt(1);
...@@ -1946,6 +1955,9 @@ void InstructionSelector::VisitWord32AtomicStore(Node* node) { ...@@ -1946,6 +1955,9 @@ void InstructionSelector::VisitWord32AtomicStore(Node* node) {
case MachineRepresentation::kWord16: case MachineRepresentation::kWord16:
opcode = kAtomicStoreWord16; opcode = kAtomicStoreWord16;
break; break;
case MachineRepresentation::kTaggedSigned: // Fall through.
case MachineRepresentation::kTaggedPointer: // Fall through.
case MachineRepresentation::kTagged:
case MachineRepresentation::kWord32: case MachineRepresentation::kWord32:
opcode = kAtomicStoreWord32; opcode = kAtomicStoreWord32;
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment