| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/compiler/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" | 
| 6 | 6 | 
| 7 #include <limits> | 7 #include <limits> | 
| 8 | 8 | 
| 9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" | 
| 10 #include "src/compiler/instruction-selector-impl.h" | 10 #include "src/compiler/instruction-selector-impl.h" | 
| 11 #include "src/compiler/node-matchers.h" | 11 #include "src/compiler/node-matchers.h" | 
| 12 #include "src/compiler/pipeline.h" | 12 #include "src/compiler/pipeline.h" | 
| 13 #include "src/compiler/schedule.h" | 13 #include "src/compiler/schedule.h" | 
| 14 #include "src/compiler/state-values-utils.h" | 14 #include "src/compiler/state-values-utils.h" | 
| 15 #include "src/deoptimizer.h" | 15 #include "src/deoptimizer.h" | 
| 16 | 16 | 
| 17 namespace v8 { | 17 namespace v8 { | 
| 18 namespace internal { | 18 namespace internal { | 
| 19 namespace compiler { | 19 namespace compiler { | 
| 20 | 20 | 
| 21 InstructionSelector::InstructionSelector( | 21 InstructionSelector::InstructionSelector( | 
| 22     Zone* zone, size_t node_count, Linkage* linkage, | 22     Zone* zone, size_t node_count, Linkage* linkage, | 
| 23     InstructionSequence* sequence, Schedule* schedule, | 23     InstructionSequence* sequence, Schedule* schedule, | 
| 24     SourcePositionTable* source_positions, | 24     SourcePositionTable* source_positions, Frame* frame, | 
| 25     SourcePositionMode source_position_mode, Features features) | 25     SourcePositionMode source_position_mode, Features features) | 
| 26     : zone_(zone), | 26     : zone_(zone), | 
| 27       linkage_(linkage), | 27       linkage_(linkage), | 
| 28       sequence_(sequence), | 28       sequence_(sequence), | 
| 29       source_positions_(source_positions), | 29       source_positions_(source_positions), | 
| 30       source_position_mode_(source_position_mode), | 30       source_position_mode_(source_position_mode), | 
| 31       features_(features), | 31       features_(features), | 
| 32       schedule_(schedule), | 32       schedule_(schedule), | 
| 33       current_block_(nullptr), | 33       current_block_(nullptr), | 
| 34       instructions_(zone), | 34       instructions_(zone), | 
| 35       defined_(node_count, false, zone), | 35       defined_(node_count, false, zone), | 
| 36       used_(node_count, false, zone), | 36       used_(node_count, false, zone), | 
| 37       virtual_registers_(node_count, | 37       virtual_registers_(node_count, | 
| 38                          InstructionOperand::kInvalidVirtualRegister, zone), | 38                          InstructionOperand::kInvalidVirtualRegister, zone), | 
| 39       scheduler_(nullptr) { | 39       scheduler_(nullptr), | 
|  | 40       frame_(frame) { | 
| 40   instructions_.reserve(node_count); | 41   instructions_.reserve(node_count); | 
| 41 } | 42 } | 
| 42 | 43 | 
| 43 | 44 | 
| 44 void InstructionSelector::SelectInstructions() { | 45 void InstructionSelector::SelectInstructions() { | 
| 45   // Mark the inputs of all phis in loop headers as used. | 46   // Mark the inputs of all phis in loop headers as used. | 
| 46   BasicBlockVector* blocks = schedule()->rpo_order(); | 47   BasicBlockVector* blocks = schedule()->rpo_order(); | 
| 47   for (auto const block : *blocks) { | 48   for (auto const block : *blocks) { | 
| 48     if (!block->IsLoopHeader()) continue; | 49     if (!block->IsLoopHeader()) continue; | 
| 49     DCHECK_LE(2u, block->PredecessorCount()); | 50     DCHECK_LE(2u, block->PredecessorCount()); | 
| (...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1059     case IrOpcode::kFloat64RoundTiesEven: | 1060     case IrOpcode::kFloat64RoundTiesEven: | 
| 1060       return MarkAsFloat64(node), VisitFloat64RoundTiesEven(node); | 1061       return MarkAsFloat64(node), VisitFloat64RoundTiesEven(node); | 
| 1061     case IrOpcode::kFloat64ExtractLowWord32: | 1062     case IrOpcode::kFloat64ExtractLowWord32: | 
| 1062       return MarkAsWord32(node), VisitFloat64ExtractLowWord32(node); | 1063       return MarkAsWord32(node), VisitFloat64ExtractLowWord32(node); | 
| 1063     case IrOpcode::kFloat64ExtractHighWord32: | 1064     case IrOpcode::kFloat64ExtractHighWord32: | 
| 1064       return MarkAsWord32(node), VisitFloat64ExtractHighWord32(node); | 1065       return MarkAsWord32(node), VisitFloat64ExtractHighWord32(node); | 
| 1065     case IrOpcode::kFloat64InsertLowWord32: | 1066     case IrOpcode::kFloat64InsertLowWord32: | 
| 1066       return MarkAsFloat64(node), VisitFloat64InsertLowWord32(node); | 1067       return MarkAsFloat64(node), VisitFloat64InsertLowWord32(node); | 
| 1067     case IrOpcode::kFloat64InsertHighWord32: | 1068     case IrOpcode::kFloat64InsertHighWord32: | 
| 1068       return MarkAsFloat64(node), VisitFloat64InsertHighWord32(node); | 1069       return MarkAsFloat64(node), VisitFloat64InsertHighWord32(node); | 
|  | 1070     case IrOpcode::kStackSlot: | 
|  | 1071       return VisitStackSlot(node); | 
| 1069     case IrOpcode::kLoadStackPointer: | 1072     case IrOpcode::kLoadStackPointer: | 
| 1070       return VisitLoadStackPointer(node); | 1073       return VisitLoadStackPointer(node); | 
| 1071     case IrOpcode::kLoadFramePointer: | 1074     case IrOpcode::kLoadFramePointer: | 
| 1072       return VisitLoadFramePointer(node); | 1075       return VisitLoadFramePointer(node); | 
| 1073     case IrOpcode::kCheckedLoad: { | 1076     case IrOpcode::kCheckedLoad: { | 
| 1074       MachineRepresentation rep = | 1077       MachineRepresentation rep = | 
| 1075           CheckedLoadRepresentationOf(node->op()).representation(); | 1078           CheckedLoadRepresentationOf(node->op()).representation(); | 
| 1076       MarkAsRepresentation(rep, node); | 1079       MarkAsRepresentation(rep, node); | 
| 1077       return VisitCheckedLoad(node); | 1080       return VisitCheckedLoad(node); | 
| 1078     } | 1081     } | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1126   inputs[1] = g.Label(sw.default_branch); | 1129   inputs[1] = g.Label(sw.default_branch); | 
| 1127   for (size_t index = 0; index < sw.case_count; ++index) { | 1130   for (size_t index = 0; index < sw.case_count; ++index) { | 
| 1128     int32_t value = sw.case_values[index]; | 1131     int32_t value = sw.case_values[index]; | 
| 1129     BasicBlock* branch = sw.case_branches[index]; | 1132     BasicBlock* branch = sw.case_branches[index]; | 
| 1130     inputs[index * 2 + 2 + 0] = g.TempImmediate(value); | 1133     inputs[index * 2 + 2 + 0] = g.TempImmediate(value); | 
| 1131     inputs[index * 2 + 2 + 1] = g.Label(branch); | 1134     inputs[index * 2 + 2 + 1] = g.Label(branch); | 
| 1132   } | 1135   } | 
| 1133   Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr); | 1136   Emit(kArchLookupSwitch, 0, nullptr, input_count, inputs, 0, nullptr); | 
| 1134 } | 1137 } | 
| 1135 | 1138 | 
|  | 1139 void InstructionSelector::VisitStackSlot(Node* node) { | 
|  | 1140   int size = 1 << ElementSizeLog2Of(StackSlotRepresentationOf(node->op())); | 
|  | 1141   int slot = frame_->AllocateSpillSlot(size); | 
|  | 1142   OperandGenerator g(this); | 
|  | 1143 | 
|  | 1144   Emit(kArchStackSlot, g.DefineAsRegister(node), | 
|  | 1145        sequence()->AddImmediate(Constant(slot)), 0, nullptr); | 
|  | 1146 } | 
| 1136 | 1147 | 
| 1137 // 32 bit targets do not implement the following instructions. | 1148 // 32 bit targets do not implement the following instructions. | 
| 1138 #if V8_TARGET_ARCH_32_BIT | 1149 #if V8_TARGET_ARCH_32_BIT | 
| 1139 | 1150 | 
| 1140 void InstructionSelector::VisitWord64And(Node* node) { UNIMPLEMENTED(); } | 1151 void InstructionSelector::VisitWord64And(Node* node) { UNIMPLEMENTED(); } | 
| 1141 | 1152 | 
| 1142 | 1153 | 
| 1143 void InstructionSelector::VisitWord64Or(Node* node) { UNIMPLEMENTED(); } | 1154 void InstructionSelector::VisitWord64Or(Node* node) { UNIMPLEMENTED(); } | 
| 1144 | 1155 | 
| 1145 | 1156 | 
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1625   return new (instruction_zone()) FrameStateDescriptor( | 1636   return new (instruction_zone()) FrameStateDescriptor( | 
| 1626       instruction_zone(), state_info.type(), state_info.bailout_id(), | 1637       instruction_zone(), state_info.type(), state_info.bailout_id(), | 
| 1627       state_info.state_combine(), parameters, locals, stack, | 1638       state_info.state_combine(), parameters, locals, stack, | 
| 1628       state_info.shared_info(), outer_state); | 1639       state_info.shared_info(), outer_state); | 
| 1629 } | 1640 } | 
| 1630 | 1641 | 
| 1631 | 1642 | 
| 1632 }  // namespace compiler | 1643 }  // namespace compiler | 
| 1633 }  // namespace internal | 1644 }  // namespace internal | 
| 1634 }  // namespace v8 | 1645 }  // namespace v8 | 
| OLD | NEW | 
|---|