| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/crankshaft/lithium-allocator.h" | 5 #include "src/crankshaft/lithium-allocator.h" |
| 6 | 6 |
| 7 #include "src/crankshaft/hydrogen.h" | 7 #include "src/crankshaft/hydrogen.h" |
| 8 #include "src/crankshaft/lithium-inl.h" | 8 #include "src/crankshaft/lithium-inl.h" |
| 9 #include "src/crankshaft/lithium-allocator-inl.h" | 9 #include "src/crankshaft/lithium-allocator-inl.h" |
| 10 #include "src/register-configuration.h" | 10 #include "src/register-configuration.h" |
| 11 #include "src/string-stream.h" | 11 #include "src/string-stream.h" |
| 12 | 12 |
| 13 namespace v8 { | 13 namespace v8 { |
| 14 namespace internal { | 14 namespace internal { |
| 15 | 15 |
| 16 const auto GetRegConfig = RegisterConfiguration::Crankshaft; |
| 17 |
| 16 static inline LifetimePosition Min(LifetimePosition a, LifetimePosition b) { | 18 static inline LifetimePosition Min(LifetimePosition a, LifetimePosition b) { |
| 17 return a.Value() < b.Value() ? a : b; | 19 return a.Value() < b.Value() ? a : b; |
| 18 } | 20 } |
| 19 | 21 |
| 20 | 22 |
| 21 static inline LifetimePosition Max(LifetimePosition a, LifetimePosition b) { | 23 static inline LifetimePosition Max(LifetimePosition a, LifetimePosition b) { |
| 22 return a.Value() > b.Value() ? a : b; | 24 return a.Value() > b.Value() ? a : b; |
| 23 } | 25 } |
| 24 | 26 |
| 25 | 27 |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 933 LOperand* output = instr->Output(); | 935 LOperand* output = instr->Output(); |
| 934 if (output != NULL) { | 936 if (output != NULL) { |
| 935 if (output->IsUnallocated()) { | 937 if (output->IsUnallocated()) { |
| 936 live->Remove(LUnallocated::cast(output)->virtual_register()); | 938 live->Remove(LUnallocated::cast(output)->virtual_register()); |
| 937 } | 939 } |
| 938 Define(curr_position, output, NULL); | 940 Define(curr_position, output, NULL); |
| 939 } | 941 } |
| 940 | 942 |
| 941 if (instr->ClobbersRegisters()) { | 943 if (instr->ClobbersRegisters()) { |
| 942 for (int i = 0; i < Register::kNumRegisters; ++i) { | 944 for (int i = 0; i < Register::kNumRegisters; ++i) { |
| 943 if (Register::from_code(i).IsAllocatable()) { | 945 if (GetRegConfig()->IsAllocatableGeneralCode(i)) { |
| 944 if (output == NULL || !output->IsRegister() || | 946 if (output == NULL || !output->IsRegister() || |
| 945 output->index() != i) { | 947 output->index() != i) { |
| 946 LiveRange* range = FixedLiveRangeFor(i); | 948 LiveRange* range = FixedLiveRangeFor(i); |
| 947 range->AddUseInterval(curr_position, | 949 range->AddUseInterval(curr_position, |
| 948 curr_position.InstructionEnd(), zone()); | 950 curr_position.InstructionEnd(), zone()); |
| 949 } | 951 } |
| 950 } | 952 } |
| 951 } | 953 } |
| 952 } | 954 } |
| 953 | 955 |
| 954 if (instr->ClobbersDoubleRegisters(isolate())) { | 956 if (instr->ClobbersDoubleRegisters(isolate())) { |
| 955 for (int i = 0; i < DoubleRegister::kMaxNumRegisters; ++i) { | 957 for (int i = 0; i < DoubleRegister::kMaxNumRegisters; ++i) { |
| 956 if (DoubleRegister::from_code(i).IsAllocatable()) { | 958 if (GetRegConfig()->IsAllocatableDoubleCode(i)) { |
| 957 if (output == NULL || !output->IsDoubleRegister() || | 959 if (output == NULL || !output->IsDoubleRegister() || |
| 958 output->index() != i) { | 960 output->index() != i) { |
| 959 LiveRange* range = FixedDoubleLiveRangeFor(i); | 961 LiveRange* range = FixedDoubleLiveRangeFor(i); |
| 960 range->AddUseInterval(curr_position, | 962 range->AddUseInterval(curr_position, |
| 961 curr_position.InstructionEnd(), zone()); | 963 curr_position.InstructionEnd(), zone()); |
| 962 } | 964 } |
| 963 } | 965 } |
| 964 } | 966 } |
| 965 } | 967 } |
| 966 | 968 |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 DCHECK(!operand->IsStackSlot()); | 1455 DCHECK(!operand->IsStackSlot()); |
| 1454 map->RecordPointer(operand, chunk()->zone()); | 1456 map->RecordPointer(operand, chunk()->zone()); |
| 1455 } | 1457 } |
| 1456 } | 1458 } |
| 1457 } | 1459 } |
| 1458 } | 1460 } |
| 1459 | 1461 |
| 1460 | 1462 |
| 1461 void LAllocator::AllocateGeneralRegisters() { | 1463 void LAllocator::AllocateGeneralRegisters() { |
| 1462 LAllocatorPhase phase("L_Allocate general registers", this); | 1464 LAllocatorPhase phase("L_Allocate general registers", this); |
| 1463 num_registers_ = | 1465 num_registers_ = GetRegConfig()->num_allocatable_general_registers(); |
| 1464 RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT) | 1466 allocatable_register_codes_ = GetRegConfig()->allocatable_general_codes(); |
| 1465 ->num_allocatable_general_registers(); | |
| 1466 allocatable_register_codes_ = | |
| 1467 RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT) | |
| 1468 ->allocatable_general_codes(); | |
| 1469 mode_ = GENERAL_REGISTERS; | 1467 mode_ = GENERAL_REGISTERS; |
| 1470 AllocateRegisters(); | 1468 AllocateRegisters(); |
| 1471 } | 1469 } |
| 1472 | 1470 |
| 1473 | 1471 |
| 1474 void LAllocator::AllocateDoubleRegisters() { | 1472 void LAllocator::AllocateDoubleRegisters() { |
| 1475 LAllocatorPhase phase("L_Allocate double registers", this); | 1473 LAllocatorPhase phase("L_Allocate double registers", this); |
| 1476 num_registers_ = | 1474 num_registers_ = GetRegConfig()->num_allocatable_double_registers(); |
| 1477 RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT) | 1475 allocatable_register_codes_ = GetRegConfig()->allocatable_double_codes(); |
| 1478 ->num_allocatable_double_registers(); | |
| 1479 allocatable_register_codes_ = | |
| 1480 RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT) | |
| 1481 ->allocatable_double_codes(); | |
| 1482 mode_ = DOUBLE_REGISTERS; | 1476 mode_ = DOUBLE_REGISTERS; |
| 1483 AllocateRegisters(); | 1477 AllocateRegisters(); |
| 1484 } | 1478 } |
| 1485 | 1479 |
| 1486 | 1480 |
| 1487 void LAllocator::AllocateRegisters() { | 1481 void LAllocator::AllocateRegisters() { |
| 1488 DCHECK(unhandled_live_ranges_.is_empty()); | 1482 DCHECK(unhandled_live_ranges_.is_empty()); |
| 1489 | 1483 |
| 1490 for (int i = 0; i < live_ranges_.length(); ++i) { | 1484 for (int i = 0; i < live_ranges_.length(); ++i) { |
| 1491 if (live_ranges_[i] != NULL) { | 1485 if (live_ranges_[i] != NULL) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1589 } | 1583 } |
| 1590 | 1584 |
| 1591 reusable_slots_.Rewind(0); | 1585 reusable_slots_.Rewind(0); |
| 1592 active_live_ranges_.Rewind(0); | 1586 active_live_ranges_.Rewind(0); |
| 1593 inactive_live_ranges_.Rewind(0); | 1587 inactive_live_ranges_.Rewind(0); |
| 1594 } | 1588 } |
| 1595 | 1589 |
| 1596 | 1590 |
| 1597 const char* LAllocator::RegisterName(int allocation_index) { | 1591 const char* LAllocator::RegisterName(int allocation_index) { |
| 1598 if (mode_ == GENERAL_REGISTERS) { | 1592 if (mode_ == GENERAL_REGISTERS) { |
| 1599 return Register::from_code(allocation_index).ToString(); | 1593 return GetRegConfig()->GetGeneralRegisterName(allocation_index); |
| 1600 } else { | 1594 } else { |
| 1601 return DoubleRegister::from_code(allocation_index).ToString(); | 1595 return GetRegConfig()->GetDoubleRegisterName(allocation_index); |
| 1602 } | 1596 } |
| 1603 } | 1597 } |
| 1604 | 1598 |
| 1605 | 1599 |
| 1606 void LAllocator::TraceAlloc(const char* msg, ...) { | 1600 void LAllocator::TraceAlloc(const char* msg, ...) { |
| 1607 if (FLAG_trace_alloc) { | 1601 if (FLAG_trace_alloc) { |
| 1608 va_list arguments; | 1602 va_list arguments; |
| 1609 va_start(arguments, msg); | 1603 va_start(arguments, msg); |
| 1610 base::OS::VPrint(msg, arguments); | 1604 base::OS::VPrint(msg, arguments); |
| 1611 va_end(arguments); | 1605 va_end(arguments); |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2188 } | 2182 } |
| 2189 | 2183 |
| 2190 #ifdef DEBUG | 2184 #ifdef DEBUG |
| 2191 if (allocator_ != NULL) allocator_->Verify(); | 2185 if (allocator_ != NULL) allocator_->Verify(); |
| 2192 #endif | 2186 #endif |
| 2193 } | 2187 } |
| 2194 | 2188 |
| 2195 | 2189 |
| 2196 } // namespace internal | 2190 } // namespace internal |
| 2197 } // namespace v8 | 2191 } // namespace v8 |
| OLD | NEW |