Index: src/compiler/mips64/instruction-selector-mips64.cc |
diff --git a/src/compiler/mips64/instruction-selector-mips64.cc b/src/compiler/mips64/instruction-selector-mips64.cc |
index 924b10b5f903c0492f9ad31f2a9390c3483aaad3..f1cee6060091d20747c52599bd892ec4662ef3b7 100644 |
--- a/src/compiler/mips64/instruction-selector-mips64.cc |
+++ b/src/compiler/mips64/instruction-selector-mips64.cc |
@@ -1992,6 +1992,43 @@ void InstructionSelector::VisitAtomicLoad(Node* node) { |
} |
} |
+void InstructionSelector::VisitAtomicStore(Node* node) { |
+ MachineRepresentation rep = AtomicStoreRepresentationOf(node->op()); |
+ Mips64OperandGenerator g(this); |
+ Node* base = node->InputAt(0); |
+ Node* index = node->InputAt(1); |
+ Node* value = node->InputAt(2); |
+ ArchOpcode opcode = kArchNop; |
+ switch (rep) { |
+ case MachineRepresentation::kWord8: |
+ opcode = kAtomicStoreWord8; |
+ break; |
+ case MachineRepresentation::kWord16: |
+ opcode = kAtomicStoreWord16; |
+ break; |
+ case MachineRepresentation::kWord32: |
+ opcode = kAtomicStoreWord32; |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ return; |
+ } |
+ |
+ if (g.CanBeImmediate(index, opcode)) { |
+ Emit(opcode | AddressingModeField::encode(kMode_MRI), |
+ g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index), |
+ g.UseRegister(value)); |
+ } else { |
+ InstructionOperand addr_reg = g.TempRegister(); |
+ Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg, |
+ g.UseRegister(index), g.UseRegister(base)); |
+ // Emit desired store opcode, using temp addr_reg. |
+ Emit(opcode | AddressingModeField::encode(kMode_MRI), |
+ g.DefineAsRegister(node), addr_reg, g.TempImmediate(0), |
+ g.UseRegister(value)); |
+ } |
+} |
+ |
// static |
MachineOperatorBuilder::Flags |
InstructionSelector::SupportedMachineOperatorFlags() { |