| 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/graph.h" | 6 #include "src/compiler/graph.h" |
| 7 #include "src/compiler/instruction.h" | 7 #include "src/compiler/instruction.h" |
| 8 #include "src/compiler/schedule.h" | 8 #include "src/compiler/schedule.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 << "]"; | 98 << "]"; |
| 99 case InstructionOperand::IMMEDIATE: { | 99 case InstructionOperand::IMMEDIATE: { |
| 100 auto imm = ImmediateOperand::cast(op); | 100 auto imm = ImmediateOperand::cast(op); |
| 101 switch (imm.type()) { | 101 switch (imm.type()) { |
| 102 case ImmediateOperand::INLINE: | 102 case ImmediateOperand::INLINE: |
| 103 return os << "#" << imm.inline_value(); | 103 return os << "#" << imm.inline_value(); |
| 104 case ImmediateOperand::INDEXED: | 104 case ImmediateOperand::INDEXED: |
| 105 return os << "[immediate:" << imm.indexed_value() << "]"; | 105 return os << "[immediate:" << imm.indexed_value() << "]"; |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 case InstructionOperand::EXPLICIT: |
| 108 case InstructionOperand::ALLOCATED: { | 109 case InstructionOperand::ALLOCATED: { |
| 109 auto allocated = AllocatedOperand::cast(op); | 110 auto allocated = LocationOperand::cast(op); |
| 110 switch (allocated.allocated_kind()) { | 111 if (op.IsStackSlot()) { |
| 111 case AllocatedOperand::STACK_SLOT: | 112 os << "[stack:" << LocationOperand::cast(op).index(); |
| 112 os << "[stack:" << StackSlotOperand::cast(op).index(); | 113 } else if (op.IsDoubleStackSlot()) { |
| 113 break; | 114 os << "[double_stack:" << LocationOperand::cast(op).index(); |
| 114 case AllocatedOperand::DOUBLE_STACK_SLOT: | 115 } else if (op.IsRegister()) { |
| 115 os << "[double_stack:" << DoubleStackSlotOperand::cast(op).index(); | 116 os << "[" << LocationOperand::cast(op).GetRegister().ToString() << "|R"; |
| 116 break; | 117 } else { |
| 117 case AllocatedOperand::REGISTER: | 118 DCHECK(op.IsDoubleRegister()); |
| 118 os << "[" << RegisterOperand::cast(op).GetRegister().ToString() | 119 os << "[" << LocationOperand::cast(op).GetDoubleRegister().ToString() |
| 119 << "|R"; | 120 << "|R"; |
| 120 break; | 121 } |
| 121 case AllocatedOperand::DOUBLE_REGISTER: | 122 if (allocated.IsExplicit()) { |
| 122 os << "[" | 123 os << "|E"; |
| 123 << DoubleRegisterOperand::cast(op).GetDoubleRegister().ToString() | |
| 124 << "|R"; | |
| 125 break; | |
| 126 } | 124 } |
| 127 switch (allocated.machine_type()) { | 125 switch (allocated.machine_type()) { |
| 128 case kRepWord32: | 126 case kRepWord32: |
| 129 os << "|w32"; | 127 os << "|w32"; |
| 130 break; | 128 break; |
| 131 case kRepWord64: | 129 case kRepWord64: |
| 132 os << "|w64"; | 130 os << "|w64"; |
| 133 break; | 131 break; |
| 134 case kRepFloat32: | 132 case kRepFloat32: |
| 135 os << "|f32"; | 133 os << "|f32"; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 } | 172 } |
| 175 return true; | 173 return true; |
| 176 } | 174 } |
| 177 | 175 |
| 178 | 176 |
| 179 MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const { | 177 MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const { |
| 180 MoveOperands* replacement = nullptr; | 178 MoveOperands* replacement = nullptr; |
| 181 MoveOperands* to_eliminate = nullptr; | 179 MoveOperands* to_eliminate = nullptr; |
| 182 for (auto curr : *this) { | 180 for (auto curr : *this) { |
| 183 if (curr->IsEliminated()) continue; | 181 if (curr->IsEliminated()) continue; |
| 184 if (curr->destination().EqualsModuloType(move->source())) { | 182 if (curr->destination().EqualsCanonicalized(move->source())) { |
| 185 DCHECK(!replacement); | 183 DCHECK(!replacement); |
| 186 replacement = curr; | 184 replacement = curr; |
| 187 if (to_eliminate != nullptr) break; | 185 if (to_eliminate != nullptr) break; |
| 188 } else if (curr->destination().EqualsModuloType(move->destination())) { | 186 } else if (curr->destination().EqualsCanonicalized(move->destination())) { |
| 189 DCHECK(!to_eliminate); | 187 DCHECK(!to_eliminate); |
| 190 to_eliminate = curr; | 188 to_eliminate = curr; |
| 191 if (replacement != nullptr) break; | 189 if (replacement != nullptr) break; |
| 192 } | 190 } |
| 193 } | 191 } |
| 194 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr); | 192 DCHECK_IMPLIES(replacement == to_eliminate, replacement == nullptr); |
| 195 if (replacement != nullptr) move->set_source(replacement->source()); | 193 if (replacement != nullptr) move->set_source(replacement->source()); |
| 196 return to_eliminate; | 194 return to_eliminate; |
| 197 } | 195 } |
| 198 | 196 |
| 199 | 197 |
| 198 ExplicitOperand::ExplicitOperand(LocationKind kind, MachineType machine_type, |
| 199 int index) |
| 200 : LocationOperand(EXPLICIT, kind, machine_type, index) { |
| 201 DCHECK_IMPLIES(kind == REGISTER && !IsFloatingPoint(machine_type), |
| 202 Register::from_code(index).IsAllocatable()); |
| 203 DCHECK_IMPLIES(kind == REGISTER && IsFloatingPoint(machine_type), |
| 204 DoubleRegister::from_code(index).IsAllocatable()); |
| 205 } |
| 206 |
| 207 |
| 200 Instruction::Instruction(InstructionCode opcode) | 208 Instruction::Instruction(InstructionCode opcode) |
| 201 : opcode_(opcode), | 209 : opcode_(opcode), |
| 202 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | | 210 bit_field_(OutputCountField::encode(0) | InputCountField::encode(0) | |
| 203 TempCountField::encode(0) | IsCallField::encode(false)), | 211 TempCountField::encode(0) | IsCallField::encode(false)), |
| 204 reference_map_(NULL) { | 212 reference_map_(NULL) { |
| 205 parallel_moves_[0] = nullptr; | 213 parallel_moves_[0] = nullptr; |
| 206 parallel_moves_[1] = nullptr; | 214 parallel_moves_[1] = nullptr; |
| 207 } | 215 } |
| 208 | 216 |
| 209 | 217 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 first = false; | 264 first = false; |
| 257 PrintableMoveOperands pmo = {printable.register_configuration_, move}; | 265 PrintableMoveOperands pmo = {printable.register_configuration_, move}; |
| 258 os << pmo; | 266 os << pmo; |
| 259 } | 267 } |
| 260 return os; | 268 return os; |
| 261 } | 269 } |
| 262 | 270 |
| 263 | 271 |
| 264 void ReferenceMap::RecordReference(const AllocatedOperand& op) { | 272 void ReferenceMap::RecordReference(const AllocatedOperand& op) { |
| 265 // Do not record arguments as pointers. | 273 // Do not record arguments as pointers. |
| 266 if (op.IsStackSlot() && StackSlotOperand::cast(op).index() < 0) return; | 274 if (op.IsStackSlot() && LocationOperand::cast(op).index() < 0) return; |
| 267 DCHECK(!op.IsDoubleRegister() && !op.IsDoubleStackSlot()); | 275 DCHECK(!op.IsDoubleRegister() && !op.IsDoubleStackSlot()); |
| 268 reference_operands_.push_back(op); | 276 reference_operands_.push_back(op); |
| 269 } | 277 } |
| 270 | 278 |
| 271 | 279 |
| 272 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) { | 280 std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm) { |
| 273 os << "{"; | 281 os << "{"; |
| 274 bool first = true; | 282 bool first = true; |
| 275 PrintableInstructionOperand poi = { | 283 PrintableInstructionOperand poi = { |
| 276 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN), | 284 RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN), |
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 os << " B" << succ.ToInt(); | 885 os << " B" << succ.ToInt(); |
| 878 } | 886 } |
| 879 os << "\n"; | 887 os << "\n"; |
| 880 } | 888 } |
| 881 return os; | 889 return os; |
| 882 } | 890 } |
| 883 | 891 |
| 884 } // namespace compiler | 892 } // namespace compiler |
| 885 } // namespace internal | 893 } // namespace internal |
| 886 } // namespace v8 | 894 } // namespace v8 |
| OLD | NEW |