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 #ifndef V8_REGISTER_ALLOCATOR_H_ | 5 #ifndef V8_REGISTER_ALLOCATOR_H_ |
6 #define V8_REGISTER_ALLOCATOR_H_ | 6 #define V8_REGISTER_ALLOCATOR_H_ |
7 | 7 |
8 #include "src/compiler/instruction.h" | 8 #include "src/compiler/instruction.h" |
9 #include "src/ostreams.h" | 9 #include "src/ostreams.h" |
10 #include "src/register-configuration.h" | 10 #include "src/register-configuration.h" |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 bool IsTopLevel() const; | 308 bool IsTopLevel() const; |
309 | 309 |
310 LiveRange* next() const { return next_; } | 310 LiveRange* next() const { return next_; } |
311 | 311 |
312 int relative_id() const { return relative_id_; } | 312 int relative_id() const { return relative_id_; } |
313 | 313 |
314 bool IsEmpty() const { return first_interval() == nullptr; } | 314 bool IsEmpty() const { return first_interval() == nullptr; } |
315 | 315 |
316 InstructionOperand GetAssignedOperand() const; | 316 InstructionOperand GetAssignedOperand() const; |
317 | 317 |
318 MachineType machine_type() const { return MachineTypeField::decode(bits_); } | 318 MachineRepresentation representation() const { |
| 319 return RepresentationField::decode(bits_); |
| 320 } |
319 | 321 |
320 int assigned_register() const { return AssignedRegisterField::decode(bits_); } | 322 int assigned_register() const { return AssignedRegisterField::decode(bits_); } |
321 bool HasRegisterAssigned() const { | 323 bool HasRegisterAssigned() const { |
322 return assigned_register() != kUnassignedRegister; | 324 return assigned_register() != kUnassignedRegister; |
323 } | 325 } |
324 void set_assigned_register(int reg); | 326 void set_assigned_register(int reg); |
325 void UnsetAssignedRegister(); | 327 void UnsetAssignedRegister(); |
326 | 328 |
327 bool spilled() const { return SpilledField::decode(bits_); } | 329 bool spilled() const { return SpilledField::decode(bits_); } |
328 void Spill(); | 330 void Spill(); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 void set_weight(float weight) { weight_ = weight; } | 409 void set_weight(float weight) { weight_ = weight; } |
408 LiveRangeGroup* group() const { return group_; } | 410 LiveRangeGroup* group() const { return group_; } |
409 void set_group(LiveRangeGroup* group) { group_ = group; } | 411 void set_group(LiveRangeGroup* group) { group_ = group; } |
410 | 412 |
411 static const int kInvalidSize = -1; | 413 static const int kInvalidSize = -1; |
412 static const float kInvalidWeight; | 414 static const float kInvalidWeight; |
413 static const float kMaxWeight; | 415 static const float kMaxWeight; |
414 | 416 |
415 private: | 417 private: |
416 friend class TopLevelLiveRange; | 418 friend class TopLevelLiveRange; |
417 explicit LiveRange(int relative_id, MachineType machine_type, | 419 explicit LiveRange(int relative_id, MachineRepresentation rep, |
418 TopLevelLiveRange* top_level); | 420 TopLevelLiveRange* top_level); |
419 | 421 |
420 void AppendAsChild(TopLevelLiveRange* other); | 422 void AppendAsChild(TopLevelLiveRange* other); |
421 void UpdateParentForAllChildren(TopLevelLiveRange* new_top_level); | 423 void UpdateParentForAllChildren(TopLevelLiveRange* new_top_level); |
422 | 424 |
423 void set_spilled(bool value) { bits_ = SpilledField::update(bits_, value); } | 425 void set_spilled(bool value) { bits_ = SpilledField::update(bits_, value); } |
424 | 426 |
425 UseInterval* FirstSearchIntervalForPosition(LifetimePosition position) const; | 427 UseInterval* FirstSearchIntervalForPosition(LifetimePosition position) const; |
426 void AdvanceLastProcessedMarker(UseInterval* to_start_of, | 428 void AdvanceLastProcessedMarker(UseInterval* to_start_of, |
427 LifetimePosition but_not_past) const; | 429 LifetimePosition but_not_past) const; |
428 | 430 |
429 typedef BitField<bool, 0, 1> SpilledField; | 431 typedef BitField<bool, 0, 1> SpilledField; |
430 typedef BitField<int32_t, 6, 6> AssignedRegisterField; | 432 typedef BitField<int32_t, 6, 6> AssignedRegisterField; |
431 typedef BitField<MachineType, 12, 15> MachineTypeField; | 433 typedef BitField<MachineRepresentation, 12, 15> RepresentationField; |
432 | 434 |
433 // Unique among children and splinters of the same virtual register. | 435 // Unique among children and splinters of the same virtual register. |
434 int relative_id_; | 436 int relative_id_; |
435 uint32_t bits_; | 437 uint32_t bits_; |
436 UseInterval* last_interval_; | 438 UseInterval* last_interval_; |
437 UseInterval* first_interval_; | 439 UseInterval* first_interval_; |
438 UsePosition* first_pos_; | 440 UsePosition* first_pos_; |
439 TopLevelLiveRange* top_level_; | 441 TopLevelLiveRange* top_level_; |
440 LiveRange* next_; | 442 LiveRange* next_; |
441 // This is used as a cache, it doesn't affect correctness. | 443 // This is used as a cache, it doesn't affect correctness. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 | 476 |
475 private: | 477 private: |
476 ZoneVector<LiveRange*> ranges_; | 478 ZoneVector<LiveRange*> ranges_; |
477 int assigned_register_; | 479 int assigned_register_; |
478 DISALLOW_COPY_AND_ASSIGN(LiveRangeGroup); | 480 DISALLOW_COPY_AND_ASSIGN(LiveRangeGroup); |
479 }; | 481 }; |
480 | 482 |
481 | 483 |
482 class TopLevelLiveRange final : public LiveRange { | 484 class TopLevelLiveRange final : public LiveRange { |
483 public: | 485 public: |
484 explicit TopLevelLiveRange(int vreg, MachineType machine_type); | 486 explicit TopLevelLiveRange(int vreg, MachineRepresentation rep); |
485 int spill_start_index() const { return spill_start_index_; } | 487 int spill_start_index() const { return spill_start_index_; } |
486 | 488 |
487 bool IsFixed() const { return vreg_ < 0; } | 489 bool IsFixed() const { return vreg_ < 0; } |
488 | 490 |
489 bool is_phi() const { return IsPhiField::decode(bits_); } | 491 bool is_phi() const { return IsPhiField::decode(bits_); } |
490 void set_is_phi(bool value) { bits_ = IsPhiField::update(bits_, value); } | 492 void set_is_phi(bool value) { bits_ = IsPhiField::update(bits_, value); } |
491 | 493 |
492 bool is_non_loop_phi() const { return IsNonLoopPhiField::decode(bits_); } | 494 bool is_non_loop_phi() const { return IsNonLoopPhiField::decode(bits_); } |
493 void set_is_non_loop_phi(bool value) { | 495 void set_is_non_loop_phi(bool value) { |
494 bits_ = IsNonLoopPhiField::update(bits_, value); | 496 bits_ = IsNonLoopPhiField::update(bits_, value); |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 // This zone is for datastructures only needed during register allocation | 768 // This zone is for datastructures only needed during register allocation |
767 // phases. | 769 // phases. |
768 Zone* allocation_zone() const { return allocation_zone_; } | 770 Zone* allocation_zone() const { return allocation_zone_; } |
769 // This zone is for InstructionOperands and moves that live beyond register | 771 // This zone is for InstructionOperands and moves that live beyond register |
770 // allocation. | 772 // allocation. |
771 Zone* code_zone() const { return code()->zone(); } | 773 Zone* code_zone() const { return code()->zone(); } |
772 Frame* frame() const { return frame_; } | 774 Frame* frame() const { return frame_; } |
773 const char* debug_name() const { return debug_name_; } | 775 const char* debug_name() const { return debug_name_; } |
774 const RegisterConfiguration* config() const { return config_; } | 776 const RegisterConfiguration* config() const { return config_; } |
775 | 777 |
776 MachineType MachineTypeFor(int virtual_register); | 778 MachineRepresentation RepresentationFor(int virtual_register); |
777 | 779 |
778 TopLevelLiveRange* GetOrCreateLiveRangeFor(int index); | 780 TopLevelLiveRange* GetOrCreateLiveRangeFor(int index); |
779 // Creates a new live range. | 781 // Creates a new live range. |
780 TopLevelLiveRange* NewLiveRange(int index, MachineType machine_type); | 782 TopLevelLiveRange* NewLiveRange(int index, MachineRepresentation rep); |
781 TopLevelLiveRange* NextLiveRange(MachineType machine_type); | 783 TopLevelLiveRange* NextLiveRange(MachineRepresentation rep); |
782 | 784 |
783 SpillRange* AssignSpillRangeToLiveRange(TopLevelLiveRange* range); | 785 SpillRange* AssignSpillRangeToLiveRange(TopLevelLiveRange* range); |
784 SpillRange* CreateSpillRangeForLiveRange(TopLevelLiveRange* range); | 786 SpillRange* CreateSpillRangeForLiveRange(TopLevelLiveRange* range); |
785 | 787 |
786 MoveOperands* AddGapMove(int index, Instruction::GapPosition position, | 788 MoveOperands* AddGapMove(int index, Instruction::GapPosition position, |
787 const InstructionOperand& from, | 789 const InstructionOperand& from, |
788 const InstructionOperand& to); | 790 const InstructionOperand& to); |
789 | 791 |
790 bool IsReference(TopLevelLiveRange* top_range) const { | 792 bool IsReference(TopLevelLiveRange* top_range) const { |
791 return code()->IsReference(top_range->vreg()); | 793 return code()->IsReference(top_range->vreg()); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 RegisterAllocationData* const data_; | 1147 RegisterAllocationData* const data_; |
1146 | 1148 |
1147 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); | 1149 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); |
1148 }; | 1150 }; |
1149 | 1151 |
1150 } // namespace compiler | 1152 } // namespace compiler |
1151 } // namespace internal | 1153 } // namespace internal |
1152 } // namespace v8 | 1154 } // namespace v8 |
1153 | 1155 |
1154 #endif // V8_REGISTER_ALLOCATOR_H_ | 1156 #endif // V8_REGISTER_ALLOCATOR_H_ |
OLD | NEW |