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/base/adapters.h" | 5 #include "src/base/adapters.h" |
6 #include "src/compiler/linkage.h" | 6 #include "src/compiler/linkage.h" |
7 #include "src/compiler/register-allocator.h" | 7 #include "src/compiler/register-allocator.h" |
8 #include "src/string-stream.h" | 8 #include "src/string-stream.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
11 namespace internal { | 11 namespace internal { |
12 namespace compiler { | 12 namespace compiler { |
13 | 13 |
14 #define TRACE(...) \ | 14 #define TRACE(...) \ |
15 do { \ | 15 do { \ |
16 if (FLAG_trace_alloc) PrintF(__VA_ARGS__); \ | 16 if (FLAG_trace_alloc) PrintF(__VA_ARGS__); \ |
17 } while (false) | 17 } while (false) |
18 | 18 |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 void RemoveElement(ZoneVector<LiveRange*>* v, LiveRange* range) { | 22 void RemoveElement(ZoneVector<LiveRange*>* v, LiveRange* range) { |
23 auto it = std::find(v->begin(), v->end(), range); | 23 auto it = std::find(v->begin(), v->end(), range); |
24 DCHECK(it != v->end()); | 24 DCHECK(it != v->end()); |
25 v->erase(it); | 25 v->erase(it); |
26 } | 26 } |
27 | 27 |
28 int GetRegisterCount(const RegisterConfiguration* cfg, RegisterKind kind) { | 28 int GetRegisterCount(const RegisterConfiguration* cfg, RegisterKind kind) { |
29 return kind == DOUBLE_REGISTERS ? cfg->num_double_registers() | 29 return kind == FP_REGISTERS ? cfg->num_double_registers() |
30 : cfg->num_general_registers(); | 30 : cfg->num_general_registers(); |
31 } | 31 } |
32 | 32 |
33 | 33 |
34 int GetAllocatableRegisterCount(const RegisterConfiguration* cfg, | 34 int GetAllocatableRegisterCount(const RegisterConfiguration* cfg, |
35 RegisterKind kind) { | 35 RegisterKind kind) { |
36 return kind == DOUBLE_REGISTERS | 36 return kind == FP_REGISTERS ? cfg->num_allocatable_aliased_double_registers() |
37 ? cfg->num_allocatable_aliased_double_registers() | 37 : cfg->num_allocatable_general_registers(); |
38 : cfg->num_allocatable_general_registers(); | |
39 } | 38 } |
40 | 39 |
41 | 40 |
42 const int* GetAllocatableRegisterCodes(const RegisterConfiguration* cfg, | 41 const int* GetAllocatableRegisterCodes(const RegisterConfiguration* cfg, |
43 RegisterKind kind) { | 42 RegisterKind kind) { |
44 return kind == DOUBLE_REGISTERS ? cfg->allocatable_double_codes() | 43 return kind == FP_REGISTERS ? cfg->allocatable_double_codes() |
45 : cfg->allocatable_general_codes(); | 44 : cfg->allocatable_general_codes(); |
46 } | 45 } |
47 | 46 |
48 | 47 |
49 const InstructionBlock* GetContainingLoop(const InstructionSequence* sequence, | 48 const InstructionBlock* GetContainingLoop(const InstructionSequence* sequence, |
50 const InstructionBlock* block) { | 49 const InstructionBlock* block) { |
51 RpoNumber index = block->loop_header(); | 50 RpoNumber index = block->loop_header(); |
52 if (!index.IsValid()) return nullptr; | 51 if (!index.IsValid()) return nullptr; |
53 return sequence->InstructionBlockAt(index); | 52 return sequence->InstructionBlockAt(index); |
54 } | 53 } |
55 | 54 |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 | 481 |
483 void LiveRange::Spill() { | 482 void LiveRange::Spill() { |
484 DCHECK(!spilled()); | 483 DCHECK(!spilled()); |
485 DCHECK(!TopLevel()->HasNoSpillType()); | 484 DCHECK(!TopLevel()->HasNoSpillType()); |
486 set_spilled(true); | 485 set_spilled(true); |
487 bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister); | 486 bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister); |
488 } | 487 } |
489 | 488 |
490 | 489 |
491 RegisterKind LiveRange::kind() const { | 490 RegisterKind LiveRange::kind() const { |
492 return IsFloatingPoint(representation()) ? DOUBLE_REGISTERS | 491 return IsFloatingPoint(representation()) ? FP_REGISTERS : GENERAL_REGISTERS; |
493 : GENERAL_REGISTERS; | |
494 } | 492 } |
495 | 493 |
496 | 494 |
497 UsePosition* LiveRange::FirstHintPosition(int* register_index) const { | 495 UsePosition* LiveRange::FirstHintPosition(int* register_index) const { |
498 for (UsePosition* pos = first_pos_; pos != nullptr; pos = pos->next()) { | 496 for (UsePosition* pos = first_pos_; pos != nullptr; pos = pos->next()) { |
499 if (pos->HintRegister(register_index)) return pos; | 497 if (pos->HintRegister(register_index)) return pos; |
500 } | 498 } |
501 return nullptr; | 499 return nullptr; |
502 } | 500 } |
503 | 501 |
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 TopLevelLiveRange* range) { | 1574 TopLevelLiveRange* range) { |
1577 DCHECK(!range->HasSpillOperand()); | 1575 DCHECK(!range->HasSpillOperand()); |
1578 DCHECK(!range->IsSplinter()); | 1576 DCHECK(!range->IsSplinter()); |
1579 SpillRange* spill_range = | 1577 SpillRange* spill_range = |
1580 new (allocation_zone()) SpillRange(range, allocation_zone()); | 1578 new (allocation_zone()) SpillRange(range, allocation_zone()); |
1581 return spill_range; | 1579 return spill_range; |
1582 } | 1580 } |
1583 | 1581 |
1584 | 1582 |
1585 void RegisterAllocationData::MarkAllocated(RegisterKind kind, int index) { | 1583 void RegisterAllocationData::MarkAllocated(RegisterKind kind, int index) { |
1586 if (kind == DOUBLE_REGISTERS) { | 1584 if (kind == FP_REGISTERS) { |
1587 assigned_double_registers_->Add(index); | 1585 assigned_double_registers_->Add(index); |
1588 } else { | 1586 } else { |
1589 DCHECK(kind == GENERAL_REGISTERS); | 1587 DCHECK(kind == GENERAL_REGISTERS); |
1590 assigned_registers_->Add(index); | 1588 assigned_registers_->Add(index); |
1591 } | 1589 } |
1592 } | 1590 } |
1593 | 1591 |
1594 | 1592 |
1595 bool RegisterAllocationData::IsBlockBoundary(LifetimePosition pos) const { | 1593 bool RegisterAllocationData::IsBlockBoundary(LifetimePosition pos) const { |
1596 return pos.IsFullStart() && | 1594 return pos.IsFullStart() && |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1927 | 1925 |
1928 | 1926 |
1929 TopLevelLiveRange* LiveRangeBuilder::FixedDoubleLiveRangeFor(int index) { | 1927 TopLevelLiveRange* LiveRangeBuilder::FixedDoubleLiveRangeFor(int index) { |
1930 DCHECK(index < config()->num_double_registers()); | 1928 DCHECK(index < config()->num_double_registers()); |
1931 TopLevelLiveRange* result = data()->fixed_double_live_ranges()[index]; | 1929 TopLevelLiveRange* result = data()->fixed_double_live_ranges()[index]; |
1932 if (result == nullptr) { | 1930 if (result == nullptr) { |
1933 result = data()->NewLiveRange(FixedDoubleLiveRangeID(index), | 1931 result = data()->NewLiveRange(FixedDoubleLiveRangeID(index), |
1934 MachineRepresentation::kFloat64); | 1932 MachineRepresentation::kFloat64); |
1935 DCHECK(result->IsFixed()); | 1933 DCHECK(result->IsFixed()); |
1936 result->set_assigned_register(index); | 1934 result->set_assigned_register(index); |
1937 data()->MarkAllocated(DOUBLE_REGISTERS, index); | 1935 data()->MarkAllocated(FP_REGISTERS, index); |
1938 data()->fixed_double_live_ranges()[index] = result; | 1936 data()->fixed_double_live_ranges()[index] = result; |
1939 } | 1937 } |
1940 return result; | 1938 return result; |
1941 } | 1939 } |
1942 | 1940 |
1943 | 1941 |
1944 TopLevelLiveRange* LiveRangeBuilder::LiveRangeFor(InstructionOperand* operand) { | 1942 TopLevelLiveRange* LiveRangeBuilder::LiveRangeFor(InstructionOperand* operand) { |
1945 if (operand->IsUnallocated()) { | 1943 if (operand->IsUnallocated()) { |
1946 return data()->GetOrCreateLiveRangeFor( | 1944 return data()->GetOrCreateLiveRangeFor( |
1947 UnallocatedOperand::cast(operand)->virtual_register()); | 1945 UnallocatedOperand::cast(operand)->virtual_register()); |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2575 | 2573 |
2576 if (first->HasNoSpillType()) { | 2574 if (first->HasNoSpillType()) { |
2577 data()->AssignSpillRangeToLiveRange(first); | 2575 data()->AssignSpillRangeToLiveRange(first); |
2578 } | 2576 } |
2579 range->Spill(); | 2577 range->Spill(); |
2580 } | 2578 } |
2581 | 2579 |
2582 | 2580 |
2583 const ZoneVector<TopLevelLiveRange*>& RegisterAllocator::GetFixedRegisters() | 2581 const ZoneVector<TopLevelLiveRange*>& RegisterAllocator::GetFixedRegisters() |
2584 const { | 2582 const { |
2585 return mode() == DOUBLE_REGISTERS ? data()->fixed_double_live_ranges() | 2583 return mode() == FP_REGISTERS ? data()->fixed_double_live_ranges() |
2586 : data()->fixed_live_ranges(); | 2584 : data()->fixed_live_ranges(); |
2587 } | 2585 } |
2588 | 2586 |
2589 | 2587 |
2590 const char* RegisterAllocator::RegisterName(int register_code) const { | 2588 const char* RegisterAllocator::RegisterName(int register_code) const { |
2591 if (mode() == GENERAL_REGISTERS) { | 2589 if (mode() == GENERAL_REGISTERS) { |
2592 return data()->config()->GetGeneralRegisterName(register_code); | 2590 return data()->config()->GetGeneralRegisterName(register_code); |
2593 } else { | 2591 } else { |
2594 return data()->config()->GetDoubleRegisterName(register_code); | 2592 return data()->config()->GetDoubleRegisterName(register_code); |
2595 } | 2593 } |
2596 } | 2594 } |
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3659 } | 3657 } |
3660 } | 3658 } |
3661 } | 3659 } |
3662 } | 3660 } |
3663 } | 3661 } |
3664 | 3662 |
3665 | 3663 |
3666 } // namespace compiler | 3664 } // namespace compiler |
3667 } // namespace internal | 3665 } // namespace internal |
3668 } // namespace v8 | 3666 } // namespace v8 |
OLD | NEW |