| 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/bit-vector.h" | 5 #include "src/bit-vector.h" |
| 6 #include "src/compiler/instruction.h" | 6 #include "src/compiler/instruction.h" |
| 7 #include "src/compiler/register-allocator-verifier.h" | 7 #include "src/compiler/register-allocator-verifier.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 constraint->virtual_register_ = vreg; | 156 constraint->virtual_register_ = vreg; |
| 157 if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) { | 157 if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) { |
| 158 constraint->type_ = kFixedSlot; | 158 constraint->type_ = kFixedSlot; |
| 159 constraint->value_ = unallocated->fixed_slot_index(); | 159 constraint->value_ = unallocated->fixed_slot_index(); |
| 160 } else { | 160 } else { |
| 161 switch (unallocated->extended_policy()) { | 161 switch (unallocated->extended_policy()) { |
| 162 case UnallocatedOperand::ANY: | 162 case UnallocatedOperand::ANY: |
| 163 CHECK(false); | 163 CHECK(false); |
| 164 break; | 164 break; |
| 165 case UnallocatedOperand::NONE: | 165 case UnallocatedOperand::NONE: |
| 166 if (sequence()->IsDouble(vreg)) { | 166 if (sequence()->IsFloat(vreg)) { |
| 167 constraint->type_ = kNoneDouble; | 167 constraint->type_ = kNoneDouble; |
| 168 } else { | 168 } else { |
| 169 constraint->type_ = kNone; | 169 constraint->type_ = kNone; |
| 170 } | 170 } |
| 171 break; | 171 break; |
| 172 case UnallocatedOperand::FIXED_REGISTER: | 172 case UnallocatedOperand::FIXED_REGISTER: |
| 173 constraint->type_ = kFixedRegister; | 173 constraint->type_ = kFixedRegister; |
| 174 constraint->value_ = unallocated->fixed_register_index(); | 174 constraint->value_ = unallocated->fixed_register_index(); |
| 175 break; | 175 break; |
| 176 case UnallocatedOperand::FIXED_DOUBLE_REGISTER: | 176 case UnallocatedOperand::FIXED_DOUBLE_REGISTER: |
| 177 constraint->type_ = kFixedDoubleRegister; | 177 constraint->type_ = kFixedDoubleRegister; |
| 178 constraint->value_ = unallocated->fixed_register_index(); | 178 constraint->value_ = unallocated->fixed_register_index(); |
| 179 break; | 179 break; |
| 180 case UnallocatedOperand::MUST_HAVE_REGISTER: | 180 case UnallocatedOperand::MUST_HAVE_REGISTER: |
| 181 if (sequence()->IsDouble(vreg)) { | 181 if (sequence()->IsFloat(vreg)) { |
| 182 constraint->type_ = kDoubleRegister; | 182 constraint->type_ = kDoubleRegister; |
| 183 } else { | 183 } else { |
| 184 constraint->type_ = kRegister; | 184 constraint->type_ = kRegister; |
| 185 } | 185 } |
| 186 break; | 186 break; |
| 187 case UnallocatedOperand::MUST_HAVE_SLOT: | 187 case UnallocatedOperand::MUST_HAVE_SLOT: |
| 188 if (sequence()->IsDouble(vreg)) { | 188 if (sequence()->IsFloat(vreg)) { |
| 189 constraint->type_ = kDoubleSlot; | 189 constraint->type_ = kDoubleSlot; |
| 190 } else { | 190 } else { |
| 191 constraint->type_ = kSlot; | 191 constraint->type_ = kSlot; |
| 192 } | 192 } |
| 193 break; | 193 break; |
| 194 case UnallocatedOperand::SAME_AS_FIRST_INPUT: | 194 case UnallocatedOperand::SAME_AS_FIRST_INPUT: |
| 195 constraint->type_ = kSameAsFirst; | 195 constraint->type_ = kSameAsFirst; |
| 196 break; | 196 break; |
| 197 } | 197 } |
| 198 } | 198 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 }; | 279 }; |
| 280 | 280 |
| 281 class PhiMap : public ZoneMap<int, PhiData*>, public ZoneObject { | 281 class PhiMap : public ZoneMap<int, PhiData*>, public ZoneObject { |
| 282 public: | 282 public: |
| 283 explicit PhiMap(Zone* zone) : ZoneMap<int, PhiData*>(zone) {} | 283 explicit PhiMap(Zone* zone) : ZoneMap<int, PhiData*>(zone) {} |
| 284 }; | 284 }; |
| 285 | 285 |
| 286 struct OperandLess { | 286 struct OperandLess { |
| 287 bool operator()(const InstructionOperand* a, | 287 bool operator()(const InstructionOperand* a, |
| 288 const InstructionOperand* b) const { | 288 const InstructionOperand* b) const { |
| 289 return *a < *b; | 289 return a->CompareModuloType(*b); |
| 290 } | 290 } |
| 291 }; | 291 }; |
| 292 | 292 |
| 293 class OperandMap : public ZoneObject { | 293 class OperandMap : public ZoneObject { |
| 294 public: | 294 public: |
| 295 struct MapValue : public ZoneObject { | 295 struct MapValue : public ZoneObject { |
| 296 MapValue() | 296 MapValue() |
| 297 : incoming(nullptr), | 297 : incoming(nullptr), |
| 298 define_vreg(kInvalidVreg), | 298 define_vreg(kInvalidVreg), |
| 299 use_vreg(kInvalidVreg), | 299 use_vreg(kInvalidVreg), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 313 // Remove all entries with keys not in other. | 313 // Remove all entries with keys not in other. |
| 314 void Intersect(const Map& other) { | 314 void Intersect(const Map& other) { |
| 315 if (this->empty()) return; | 315 if (this->empty()) return; |
| 316 auto it = this->begin(); | 316 auto it = this->begin(); |
| 317 OperandLess less; | 317 OperandLess less; |
| 318 for (const auto& o : other) { | 318 for (const auto& o : other) { |
| 319 while (less(it->first, o.first)) { | 319 while (less(it->first, o.first)) { |
| 320 this->erase(it++); | 320 this->erase(it++); |
| 321 if (it == this->end()) return; | 321 if (it == this->end()) return; |
| 322 } | 322 } |
| 323 if (*it->first == *o.first) { | 323 if (it->first->EqualsModuloType(*o.first)) { |
| 324 ++it; | 324 ++it; |
| 325 if (it == this->end()) return; | 325 if (it == this->end()) return; |
| 326 } else { | 326 } else { |
| 327 CHECK(less(o.first, it->first)); | 327 CHECK(less(o.first, it->first)); |
| 328 } | 328 } |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 }; | 331 }; |
| 332 | 332 |
| 333 explicit OperandMap(Zone* zone) : map_(zone) {} | 333 explicit OperandMap(Zone* zone) : map_(zone) {} |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 RunParallelMoves(zone, move); | 365 RunParallelMoves(zone, move); |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 | 368 |
| 369 void Drop(const InstructionOperand* op) { | 369 void Drop(const InstructionOperand* op) { |
| 370 auto it = map().find(op); | 370 auto it = map().find(op); |
| 371 if (it != map().end()) map().erase(it); | 371 if (it != map().end()) map().erase(it); |
| 372 } | 372 } |
| 373 | 373 |
| 374 void DropRegisters(const RegisterConfiguration* config) { | 374 void DropRegisters(const RegisterConfiguration* config) { |
| 375 for (int i = 0; i < config->num_general_registers(); ++i) { | 375 // TODO(dcarney): sort map by kind and drop range. |
| 376 RegisterOperand op(i); | 376 for (auto it = map().begin(); it != map().end();) { |
| 377 Drop(&op); | 377 auto op = it->first; |
| 378 } | 378 if (op->IsRegister() || op->IsDoubleRegister()) { |
| 379 for (int i = 0; i < config->num_double_registers(); ++i) { | 379 map().erase(it++); |
| 380 DoubleRegisterOperand op(i); | 380 } else { |
| 381 Drop(&op); | 381 ++it; |
| 382 } |
| 382 } | 383 } |
| 383 } | 384 } |
| 384 | 385 |
| 385 void Define(Zone* zone, const InstructionOperand* op, int virtual_register) { | 386 void Define(Zone* zone, const InstructionOperand* op, int virtual_register) { |
| 386 auto value = new (zone) MapValue(); | 387 auto value = new (zone) MapValue(); |
| 387 value->define_vreg = virtual_register; | 388 value->define_vreg = virtual_register; |
| 388 auto res = map().insert(std::make_pair(op, value)); | 389 auto res = map().insert(std::make_pair(op, value)); |
| 389 if (!res.second) res.first->second = value; | 390 if (!res.second) res.first->second = value; |
| 390 } | 391 } |
| 391 | 392 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 int virtual_register = op_constraints[count].virtual_register_; | 700 int virtual_register = op_constraints[count].virtual_register_; |
| 700 current->Define(zone(), instr->OutputAt(i), virtual_register); | 701 current->Define(zone(), instr->OutputAt(i), virtual_register); |
| 701 } | 702 } |
| 702 } | 703 } |
| 703 } | 704 } |
| 704 } | 705 } |
| 705 | 706 |
| 706 } // namespace compiler | 707 } // namespace compiler |
| 707 } // namespace internal | 708 } // namespace internal |
| 708 } // namespace v8 | 709 } // namespace v8 |
| OLD | NEW |