Index: src/compiler/instruction-selector.cc |
diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
index 32ffc634e01efcb20cec6338e5ef9241bb8b400f..1fee0d426aed22a6516be9f5733ece4af13241b2 100644 |
--- a/src/compiler/instruction-selector.cc |
+++ b/src/compiler/instruction-selector.cc |
@@ -21,7 +21,7 @@ namespace compiler { |
InstructionSelector::InstructionSelector( |
Zone* zone, size_t node_count, Linkage* linkage, |
InstructionSequence* sequence, Schedule* schedule, |
- SourcePositionTable* source_positions, |
+ SourcePositionTable* source_positions, Frame* frame, |
SourcePositionMode source_position_mode, Features features) |
: zone_(zone), |
linkage_(linkage), |
@@ -36,7 +36,8 @@ InstructionSelector::InstructionSelector( |
used_(node_count, false, zone), |
virtual_registers_(node_count, |
InstructionOperand::kInvalidVirtualRegister, zone), |
- scheduler_(nullptr) { |
+ scheduler_(nullptr), |
+ frame_(frame) { |
instructions_.reserve(node_count); |
} |
@@ -1066,6 +1067,8 @@ void InstructionSelector::VisitNode(Node* node) { |
return MarkAsFloat64(node), VisitFloat64InsertLowWord32(node); |
case IrOpcode::kFloat64InsertHighWord32: |
return MarkAsFloat64(node), VisitFloat64InsertHighWord32(node); |
+ case IrOpcode::kStackSlot: |
+ return VisitStackSlot(node); |
case IrOpcode::kLoadStackPointer: |
return VisitLoadStackPointer(node); |
case IrOpcode::kLoadFramePointer: |
@@ -1133,6 +1136,14 @@ void InstructionSelector::EmitLookupSwitch(const SwitchInfo& sw, |
Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr); |
} |
+void InstructionSelector::VisitStackSlot(Node* node) { |
+ int size = 1 << ElementSizeLog2Of(StackSlotRepresentationOf(node->op())); |
+ int slot = frame_->AllocateSpillSlot(size); |
+ OperandGenerator g(this); |
+ |
+ Emit(kArchStackSlot, g.DefineAsRegister(node), |
+ sequence()->AddImmediate(Constant(slot)), 0, nullptr); |
+} |
// 32 bit targets do not implement the following instructions. |
#if V8_TARGET_ARCH_32_BIT |