OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 return false; | 145 return false; |
146 } | 146 } |
147 | 147 |
148 | 148 |
149 #endif | 149 #endif |
150 | 150 |
151 | 151 |
152 LiveRange::LiveRange(int id) | 152 LiveRange::LiveRange(int id) |
153 : id_(id), | 153 : id_(id), |
154 spilled_(false), | 154 spilled_(false), |
| 155 is_double_(false), |
155 assigned_register_(kInvalidAssignment), | 156 assigned_register_(kInvalidAssignment), |
156 assigned_register_kind_(NONE), | |
157 last_interval_(NULL), | 157 last_interval_(NULL), |
158 first_interval_(NULL), | 158 first_interval_(NULL), |
159 first_pos_(NULL), | 159 first_pos_(NULL), |
160 parent_(NULL), | 160 parent_(NULL), |
161 next_(NULL), | 161 next_(NULL), |
162 current_interval_(NULL), | 162 current_interval_(NULL), |
163 last_processed_use_(NULL), | 163 last_processed_use_(NULL), |
164 spill_start_index_(kMaxInt) { | 164 spill_start_index_(kMaxInt) { |
165 spill_operand_ = new LUnallocated(LUnallocated::IGNORE); | 165 spill_operand_ = new LUnallocated(LUnallocated::IGNORE); |
166 } | 166 } |
167 | 167 |
168 | 168 |
169 void LiveRange::set_assigned_register(int reg, RegisterKind register_kind) { | 169 void LiveRange::set_assigned_register(int reg, RegisterKind register_kind) { |
170 ASSERT(!HasRegisterAssigned() && !IsSpilled()); | 170 ASSERT(!HasRegisterAssigned() && !IsSpilled()); |
171 assigned_register_ = reg; | 171 assigned_register_ = reg; |
172 assigned_register_kind_ = register_kind; | 172 is_double_ = (register_kind == DOUBLE_REGISTERS); |
173 ConvertOperands(); | 173 ConvertOperands(); |
174 } | 174 } |
175 | 175 |
176 | 176 |
177 void LiveRange::MakeSpilled() { | 177 void LiveRange::MakeSpilled() { |
178 ASSERT(!IsSpilled()); | 178 ASSERT(!IsSpilled()); |
179 ASSERT(TopLevel()->HasAllocatedSpillOperand()); | 179 ASSERT(TopLevel()->HasAllocatedSpillOperand()); |
180 spilled_ = true; | 180 spilled_ = true; |
181 assigned_register_ = kInvalidAssignment; | 181 assigned_register_ = kInvalidAssignment; |
182 ConvertOperands(); | 182 ConvertOperands(); |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 live_in_sets_(graph->blocks()->length()), | 548 live_in_sets_(graph->blocks()->length()), |
549 live_ranges_(num_values * 2), | 549 live_ranges_(num_values * 2), |
550 fixed_live_ranges_(NULL), | 550 fixed_live_ranges_(NULL), |
551 fixed_double_live_ranges_(NULL), | 551 fixed_double_live_ranges_(NULL), |
552 unhandled_live_ranges_(num_values * 2), | 552 unhandled_live_ranges_(num_values * 2), |
553 active_live_ranges_(8), | 553 active_live_ranges_(8), |
554 inactive_live_ranges_(8), | 554 inactive_live_ranges_(8), |
555 reusable_slots_(8), | 555 reusable_slots_(8), |
556 next_virtual_register_(num_values), | 556 next_virtual_register_(num_values), |
557 first_artificial_register_(num_values), | 557 first_artificial_register_(num_values), |
558 mode_(NONE), | 558 mode_(GENERAL_REGISTERS), |
559 num_registers_(-1), | 559 num_registers_(-1), |
560 graph_(graph), | 560 graph_(graph), |
561 has_osr_entry_(false) {} | 561 has_osr_entry_(false) {} |
562 | 562 |
563 | 563 |
564 void LAllocator::InitializeLivenessAnalysis() { | 564 void LAllocator::InitializeLivenessAnalysis() { |
565 // Initialize the live_in sets for each block to NULL. | 565 // Initialize the live_in sets for each block to NULL. |
566 int block_count = graph_->blocks()->length(); | 566 int block_count = graph_->blocks()->length(); |
567 live_in_sets_.Initialize(block_count); | 567 live_in_sets_.Initialize(block_count); |
568 live_in_sets_.AddBlock(NULL, block_count); | 568 live_in_sets_.AddBlock(NULL, block_count); |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 } | 1459 } |
1460 } | 1460 } |
1461 } | 1461 } |
1462 } | 1462 } |
1463 } | 1463 } |
1464 | 1464 |
1465 | 1465 |
1466 void LAllocator::AllocateGeneralRegisters() { | 1466 void LAllocator::AllocateGeneralRegisters() { |
1467 HPhase phase("Allocate general registers", this); | 1467 HPhase phase("Allocate general registers", this); |
1468 num_registers_ = Register::kNumAllocatableRegisters; | 1468 num_registers_ = Register::kNumAllocatableRegisters; |
1469 mode_ = GENERAL_REGISTERS; | |
1470 AllocateRegisters(); | 1469 AllocateRegisters(); |
1471 } | 1470 } |
1472 | 1471 |
1473 | 1472 |
1474 void LAllocator::AllocateDoubleRegisters() { | 1473 void LAllocator::AllocateDoubleRegisters() { |
1475 HPhase phase("Allocate double registers", this); | 1474 HPhase phase("Allocate double registers", this); |
1476 num_registers_ = DoubleRegister::kNumAllocatableRegisters; | 1475 num_registers_ = DoubleRegister::kNumAllocatableRegisters; |
1477 mode_ = DOUBLE_REGISTERS; | 1476 mode_ = DOUBLE_REGISTERS; |
1478 AllocateRegisters(); | 1477 AllocateRegisters(); |
1479 } | 1478 } |
1480 | 1479 |
1481 | 1480 |
1482 void LAllocator::AllocateRegisters() { | 1481 void LAllocator::AllocateRegisters() { |
1483 ASSERT(mode_ != NONE); | |
1484 ASSERT(unhandled_live_ranges_.is_empty()); | 1482 ASSERT(unhandled_live_ranges_.is_empty()); |
1485 | 1483 |
1486 for (int i = 0; i < live_ranges_.length(); ++i) { | 1484 for (int i = 0; i < live_ranges_.length(); ++i) { |
1487 if (live_ranges_[i] != NULL) { | 1485 if (live_ranges_[i] != NULL) { |
1488 if (RequiredRegisterKind(live_ranges_[i]->id()) == mode_) { | 1486 if (RequiredRegisterKind(live_ranges_[i]->id()) == mode_) { |
1489 AddToUnhandledUnsorted(live_ranges_[i]); | 1487 AddToUnhandledUnsorted(live_ranges_[i]); |
1490 } | 1488 } |
1491 } | 1489 } |
1492 } | 1490 } |
1493 SortUnhandled(); | 1491 SortUnhandled(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 } | 1576 } |
1579 } | 1577 } |
1580 | 1578 |
1581 reusable_slots_.Rewind(0); | 1579 reusable_slots_.Rewind(0); |
1582 active_live_ranges_.Rewind(0); | 1580 active_live_ranges_.Rewind(0); |
1583 inactive_live_ranges_.Rewind(0); | 1581 inactive_live_ranges_.Rewind(0); |
1584 } | 1582 } |
1585 | 1583 |
1586 | 1584 |
1587 const char* LAllocator::RegisterName(int allocation_index) { | 1585 const char* LAllocator::RegisterName(int allocation_index) { |
1588 ASSERT(mode_ != NONE); | |
1589 if (mode_ == GENERAL_REGISTERS) { | 1586 if (mode_ == GENERAL_REGISTERS) { |
1590 return Register::AllocationIndexToString(allocation_index); | 1587 return Register::AllocationIndexToString(allocation_index); |
1591 } else { | 1588 } else { |
1592 return DoubleRegister::AllocationIndexToString(allocation_index); | 1589 return DoubleRegister::AllocationIndexToString(allocation_index); |
1593 } | 1590 } |
1594 } | 1591 } |
1595 | 1592 |
1596 | 1593 |
1597 void LAllocator::TraceAlloc(const char* msg, ...) { | 1594 void LAllocator::TraceAlloc(const char* msg, ...) { |
1598 if (FLAG_trace_alloc) { | 1595 if (FLAG_trace_alloc) { |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2124 LiveRange* current = live_ranges()->at(i); | 2121 LiveRange* current = live_ranges()->at(i); |
2125 if (current != NULL) current->Verify(); | 2122 if (current != NULL) current->Verify(); |
2126 } | 2123 } |
2127 } | 2124 } |
2128 | 2125 |
2129 | 2126 |
2130 #endif | 2127 #endif |
2131 | 2128 |
2132 | 2129 |
2133 } } // namespace v8::internal | 2130 } } // namespace v8::internal |
OLD | NEW |