Index: src/compiler/x64/instruction-selector-x64.cc |
diff --git a/src/compiler/x64/instruction-selector-x64.cc b/src/compiler/x64/instruction-selector-x64.cc |
index 26d8960b913f897c458f9de1ba0cad07959786d4..1038cc3d1c59894715f0674750b6b45eb4958be4 100644 |
--- a/src/compiler/x64/instruction-selector-x64.cc |
+++ b/src/compiler/x64/instruction-selector-x64.cc |
@@ -146,6 +146,47 @@ void InstructionSelector::VisitLoad(Node* node) { |
} |
+void InstructionSelector::VisitLoadAtomic(Node* node) { |
+ MachineType rep = RepresentationOf(OpParameter<LoadRepresentation>(node)); |
+ MachineType typ = TypeOf(OpParameter<LoadRepresentation>(node)); |
+ X64OperandGenerator g(this); |
+ |
+ ArchOpcode opcode; |
+ switch (rep) { |
+ case kRepFloat32: |
+ opcode = kX64Movss; |
+ break; |
+ case kRepFloat64: |
+ opcode = kX64Movsd; |
+ break; |
+ case kRepBit: // Fall through. |
+ case kRepWord8: |
+ opcode = typ == kTypeInt32 ? kX64Movsxbl : kX64Movzxbl; |
+ break; |
+ case kRepWord16: |
+ opcode = typ == kTypeInt32 ? kX64Movsxwl : kX64Movzxwl; |
+ break; |
+ case kRepWord32: |
+ opcode = kX64Movl; |
+ break; |
+ case kRepTagged: |
+ case kRepWord64: |
+ default: |
+ UNREACHABLE(); |
+ return; |
+ } |
+ |
+ InstructionOperand outputs[1]; |
+ outputs[0] = g.DefineAsRegister(node); |
+ InstructionOperand inputs[3]; |
+ size_t input_count = 0; |
+ AddressingMode mode = |
+ g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); |
+ InstructionCode code = opcode | AddressingModeField::encode(mode); |
+ Emit(code, 1, outputs, input_count, inputs); |
+} |
+ |
+ |
void InstructionSelector::VisitStore(Node* node) { |
X64OperandGenerator g(this); |
Node* base = node->InputAt(0); |