| 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/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/compiler/instruction.h" | 9 #include "src/compiler/instruction.h" |
| 10 #include "src/compiler/node.h" | 10 #include "src/compiler/node.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 static LifetimePosition FromInstructionIndex(int index) { | 42 static LifetimePosition FromInstructionIndex(int index) { |
| 43 return LifetimePosition(index * kStep); | 43 return LifetimePosition(index * kStep); |
| 44 } | 44 } |
| 45 | 45 |
| 46 // Returns a numeric representation of this lifetime position. | 46 // Returns a numeric representation of this lifetime position. |
| 47 int Value() const { return value_; } | 47 int Value() const { return value_; } |
| 48 | 48 |
| 49 // Returns the index of the instruction to which this lifetime position | 49 // Returns the index of the instruction to which this lifetime position |
| 50 // corresponds. | 50 // corresponds. |
| 51 int InstructionIndex() const { | 51 int InstructionIndex() const { |
| 52 ASSERT(IsValid()); | 52 DCHECK(IsValid()); |
| 53 return value_ / kStep; | 53 return value_ / kStep; |
| 54 } | 54 } |
| 55 | 55 |
| 56 // Returns true if this lifetime position corresponds to the instruction | 56 // Returns true if this lifetime position corresponds to the instruction |
| 57 // start. | 57 // start. |
| 58 bool IsInstructionStart() const { return (value_ & (kStep - 1)) == 0; } | 58 bool IsInstructionStart() const { return (value_ & (kStep - 1)) == 0; } |
| 59 | 59 |
| 60 // Returns the lifetime position for the start of the instruction which | 60 // Returns the lifetime position for the start of the instruction which |
| 61 // corresponds to this lifetime position. | 61 // corresponds to this lifetime position. |
| 62 LifetimePosition InstructionStart() const { | 62 LifetimePosition InstructionStart() const { |
| 63 ASSERT(IsValid()); | 63 DCHECK(IsValid()); |
| 64 return LifetimePosition(value_ & ~(kStep - 1)); | 64 return LifetimePosition(value_ & ~(kStep - 1)); |
| 65 } | 65 } |
| 66 | 66 |
| 67 // Returns the lifetime position for the end of the instruction which | 67 // Returns the lifetime position for the end of the instruction which |
| 68 // corresponds to this lifetime position. | 68 // corresponds to this lifetime position. |
| 69 LifetimePosition InstructionEnd() const { | 69 LifetimePosition InstructionEnd() const { |
| 70 ASSERT(IsValid()); | 70 DCHECK(IsValid()); |
| 71 return LifetimePosition(InstructionStart().Value() + kStep / 2); | 71 return LifetimePosition(InstructionStart().Value() + kStep / 2); |
| 72 } | 72 } |
| 73 | 73 |
| 74 // Returns the lifetime position for the beginning of the next instruction. | 74 // Returns the lifetime position for the beginning of the next instruction. |
| 75 LifetimePosition NextInstruction() const { | 75 LifetimePosition NextInstruction() const { |
| 76 ASSERT(IsValid()); | 76 DCHECK(IsValid()); |
| 77 return LifetimePosition(InstructionStart().Value() + kStep); | 77 return LifetimePosition(InstructionStart().Value() + kStep); |
| 78 } | 78 } |
| 79 | 79 |
| 80 // Returns the lifetime position for the beginning of the previous | 80 // Returns the lifetime position for the beginning of the previous |
| 81 // instruction. | 81 // instruction. |
| 82 LifetimePosition PrevInstruction() const { | 82 LifetimePosition PrevInstruction() const { |
| 83 ASSERT(IsValid()); | 83 DCHECK(IsValid()); |
| 84 ASSERT(value_ > 1); | 84 DCHECK(value_ > 1); |
| 85 return LifetimePosition(InstructionStart().Value() - kStep); | 85 return LifetimePosition(InstructionStart().Value() - kStep); |
| 86 } | 86 } |
| 87 | 87 |
| 88 // Constructs the lifetime position which does not correspond to any | 88 // Constructs the lifetime position which does not correspond to any |
| 89 // instruction. | 89 // instruction. |
| 90 LifetimePosition() : value_(-1) {} | 90 LifetimePosition() : value_(-1) {} |
| 91 | 91 |
| 92 // Returns true if this lifetime positions corrensponds to some | 92 // Returns true if this lifetime positions corrensponds to some |
| 93 // instruction. | 93 // instruction. |
| 94 bool IsValid() const { return value_ != -1; } | 94 bool IsValid() const { return value_ != -1; } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 111 | 111 |
| 112 int value_; | 112 int value_; |
| 113 }; | 113 }; |
| 114 | 114 |
| 115 | 115 |
| 116 // Representation of the non-empty interval [start,end[. | 116 // Representation of the non-empty interval [start,end[. |
| 117 class UseInterval : public ZoneObject { | 117 class UseInterval : public ZoneObject { |
| 118 public: | 118 public: |
| 119 UseInterval(LifetimePosition start, LifetimePosition end) | 119 UseInterval(LifetimePosition start, LifetimePosition end) |
| 120 : start_(start), end_(end), next_(NULL) { | 120 : start_(start), end_(end), next_(NULL) { |
| 121 ASSERT(start.Value() < end.Value()); | 121 DCHECK(start.Value() < end.Value()); |
| 122 } | 122 } |
| 123 | 123 |
| 124 LifetimePosition start() const { return start_; } | 124 LifetimePosition start() const { return start_; } |
| 125 LifetimePosition end() const { return end_; } | 125 LifetimePosition end() const { return end_; } |
| 126 UseInterval* next() const { return next_; } | 126 UseInterval* next() const { return next_; } |
| 127 | 127 |
| 128 // Split this interval at the given position without effecting the | 128 // Split this interval at the given position without effecting the |
| 129 // live range that owns it. The interval must contain the position. | 129 // live range that owns it. The interval must contain the position. |
| 130 void SplitAt(LifetimePosition pos, Zone* zone); | 130 void SplitAt(LifetimePosition pos, Zone* zone); |
| 131 | 131 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 // live range to the result live range. | 233 // live range to the result live range. |
| 234 void SplitAt(LifetimePosition position, LiveRange* result, Zone* zone); | 234 void SplitAt(LifetimePosition position, LiveRange* result, Zone* zone); |
| 235 | 235 |
| 236 RegisterKind Kind() const { return kind_; } | 236 RegisterKind Kind() const { return kind_; } |
| 237 bool HasRegisterAssigned() const { | 237 bool HasRegisterAssigned() const { |
| 238 return assigned_register_ != kInvalidAssignment; | 238 return assigned_register_ != kInvalidAssignment; |
| 239 } | 239 } |
| 240 bool IsSpilled() const { return spilled_; } | 240 bool IsSpilled() const { return spilled_; } |
| 241 | 241 |
| 242 InstructionOperand* current_hint_operand() const { | 242 InstructionOperand* current_hint_operand() const { |
| 243 ASSERT(current_hint_operand_ == FirstHint()); | 243 DCHECK(current_hint_operand_ == FirstHint()); |
| 244 return current_hint_operand_; | 244 return current_hint_operand_; |
| 245 } | 245 } |
| 246 InstructionOperand* FirstHint() const { | 246 InstructionOperand* FirstHint() const { |
| 247 UsePosition* pos = first_pos_; | 247 UsePosition* pos = first_pos_; |
| 248 while (pos != NULL && !pos->HasHint()) pos = pos->next(); | 248 while (pos != NULL && !pos->HasHint()) pos = pos->next(); |
| 249 if (pos != NULL) return pos->hint(); | 249 if (pos != NULL) return pos->hint(); |
| 250 return NULL; | 250 return NULL; |
| 251 } | 251 } |
| 252 | 252 |
| 253 LifetimePosition Start() const { | 253 LifetimePosition Start() const { |
| 254 ASSERT(!IsEmpty()); | 254 DCHECK(!IsEmpty()); |
| 255 return first_interval()->start(); | 255 return first_interval()->start(); |
| 256 } | 256 } |
| 257 | 257 |
| 258 LifetimePosition End() const { | 258 LifetimePosition End() const { |
| 259 ASSERT(!IsEmpty()); | 259 DCHECK(!IsEmpty()); |
| 260 return last_interval_->end(); | 260 return last_interval_->end(); |
| 261 } | 261 } |
| 262 | 262 |
| 263 bool HasAllocatedSpillOperand() const; | 263 bool HasAllocatedSpillOperand() const; |
| 264 InstructionOperand* GetSpillOperand() const { return spill_operand_; } | 264 InstructionOperand* GetSpillOperand() const { return spill_operand_; } |
| 265 void SetSpillOperand(InstructionOperand* operand); | 265 void SetSpillOperand(InstructionOperand* operand); |
| 266 | 266 |
| 267 void SetSpillStartIndex(int start) { | 267 void SetSpillStartIndex(int start) { |
| 268 spill_start_index_ = Min(start, spill_start_index_); | 268 spill_start_index_ = Min(start, spill_start_index_); |
| 269 } | 269 } |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 RegisterAllocator* allocator_; | 538 RegisterAllocator* allocator_; |
| 539 unsigned allocator_zone_start_allocation_size_; | 539 unsigned allocator_zone_start_allocation_size_; |
| 540 | 540 |
| 541 DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorPhase); | 541 DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorPhase); |
| 542 }; | 542 }; |
| 543 } | 543 } |
| 544 } | 544 } |
| 545 } // namespace v8::internal::compiler | 545 } // namespace v8::internal::compiler |
| 546 | 546 |
| 547 #endif // V8_REGISTER_ALLOCATOR_H_ | 547 #endif // V8_REGISTER_ALLOCATOR_H_ |
| OLD | NEW |