Chromium Code Reviews| Index: src/compiler/instruction-selector.cc |
| diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
| index 32ffc634e01efcb20cec6338e5ef9241bb8b400f..6a79ddccb093c7d7e022b343250ac031bf636ac0 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,22 @@ void InstructionSelector::EmitLookupSwitch(const SwitchInfo& sw, |
| Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr); |
| } |
| +void InstructionSelector::VisitStackSlot(Node* node) { |
| + MachineRepresentation rep = StackSlotRepresentationOf(node->op()); |
|
titzer
2016/01/28 09:02:18
You should probably use ElemSizeLog2Of(MachineRepr
ahaas
2016/01/28 14:55:44
Done.
|
| + int size; |
| + if (rep == MachineRepresentation::kFloat64) { |
| + size = kDoubleSize; |
| + } else if (rep == MachineRepresentation::kWord64) { |
| + size = kInt64Size; |
| + } else { |
| + size = kPointerSize; |
| + } |
| + 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 |