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 { |
(...skipping 1326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 live_in_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), | 1337 live_in_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), |
1338 live_out_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), | 1338 live_out_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), |
1339 live_ranges_(code->VirtualRegisterCount() * 2, nullptr, | 1339 live_ranges_(code->VirtualRegisterCount() * 2, nullptr, |
1340 allocation_zone()), | 1340 allocation_zone()), |
1341 fixed_live_ranges_(this->config()->num_general_registers(), nullptr, | 1341 fixed_live_ranges_(this->config()->num_general_registers(), nullptr, |
1342 allocation_zone()), | 1342 allocation_zone()), |
1343 fixed_float_live_ranges_(this->config()->num_float_registers(), nullptr, | 1343 fixed_float_live_ranges_(this->config()->num_float_registers(), nullptr, |
1344 allocation_zone()), | 1344 allocation_zone()), |
1345 fixed_double_live_ranges_(this->config()->num_double_registers(), nullptr, | 1345 fixed_double_live_ranges_(this->config()->num_double_registers(), nullptr, |
1346 allocation_zone()), | 1346 allocation_zone()), |
| 1347 fixed_simd128_live_ranges_(this->config()->num_simd128_registers(), |
| 1348 nullptr, allocation_zone()), |
1347 spill_ranges_(code->VirtualRegisterCount(), nullptr, allocation_zone()), | 1349 spill_ranges_(code->VirtualRegisterCount(), nullptr, allocation_zone()), |
1348 delayed_references_(allocation_zone()), | 1350 delayed_references_(allocation_zone()), |
1349 assigned_registers_(nullptr), | 1351 assigned_registers_(nullptr), |
1350 assigned_double_registers_(nullptr), | 1352 assigned_double_registers_(nullptr), |
1351 virtual_register_count_(code->VirtualRegisterCount()), | 1353 virtual_register_count_(code->VirtualRegisterCount()), |
1352 preassigned_slot_ranges_(zone) { | 1354 preassigned_slot_ranges_(zone) { |
1353 assigned_registers_ = new (code_zone()) | 1355 assigned_registers_ = new (code_zone()) |
1354 BitVector(this->config()->num_general_registers(), code_zone()); | 1356 BitVector(this->config()->num_general_registers(), code_zone()); |
1355 assigned_double_registers_ = new (code_zone()) | 1357 assigned_double_registers_ = new (code_zone()) |
1356 BitVector(this->config()->num_double_registers(), code_zone()); | 1358 BitVector(this->config()->num_double_registers(), code_zone()); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1514 DCHECK(!range->IsSplinter()); | 1516 DCHECK(!range->IsSplinter()); |
1515 SpillRange* spill_range = | 1517 SpillRange* spill_range = |
1516 new (allocation_zone()) SpillRange(range, allocation_zone()); | 1518 new (allocation_zone()) SpillRange(range, allocation_zone()); |
1517 return spill_range; | 1519 return spill_range; |
1518 } | 1520 } |
1519 | 1521 |
1520 void RegisterAllocationData::MarkAllocated(MachineRepresentation rep, | 1522 void RegisterAllocationData::MarkAllocated(MachineRepresentation rep, |
1521 int index) { | 1523 int index) { |
1522 switch (rep) { | 1524 switch (rep) { |
1523 case MachineRepresentation::kFloat32: | 1525 case MachineRepresentation::kFloat32: |
| 1526 case MachineRepresentation::kSimd128: |
1524 if (kSimpleFPAliasing) { | 1527 if (kSimpleFPAliasing) { |
1525 assigned_double_registers_->Add(index); | 1528 assigned_double_registers_->Add(index); |
1526 } else { | 1529 } else { |
1527 int alias_base_index = -1; | 1530 int alias_base_index = -1; |
1528 int aliases = config()->GetAliases( | 1531 int aliases = config()->GetAliases( |
1529 rep, index, MachineRepresentation::kFloat64, &alias_base_index); | 1532 rep, index, MachineRepresentation::kFloat64, &alias_base_index); |
| 1533 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
1530 while (aliases--) { | 1534 while (aliases--) { |
1531 int aliased_reg = alias_base_index + aliases; | 1535 int aliased_reg = alias_base_index + aliases; |
1532 assigned_double_registers_->Add(aliased_reg); | 1536 assigned_double_registers_->Add(aliased_reg); |
1533 } | 1537 } |
1534 } | 1538 } |
1535 break; | 1539 break; |
1536 case MachineRepresentation::kFloat64: | 1540 case MachineRepresentation::kFloat64: |
1537 assigned_double_registers_->Add(index); | 1541 assigned_double_registers_->Add(index); |
1538 break; | 1542 break; |
1539 default: | 1543 default: |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1850 BitVector::Iterator iterator(live_out); | 1854 BitVector::Iterator iterator(live_out); |
1851 while (!iterator.Done()) { | 1855 while (!iterator.Done()) { |
1852 int operand_index = iterator.Current(); | 1856 int operand_index = iterator.Current(); |
1853 TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(operand_index); | 1857 TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(operand_index); |
1854 range->AddUseInterval(start, end, allocation_zone()); | 1858 range->AddUseInterval(start, end, allocation_zone()); |
1855 iterator.Advance(); | 1859 iterator.Advance(); |
1856 } | 1860 } |
1857 } | 1861 } |
1858 | 1862 |
1859 int LiveRangeBuilder::FixedFPLiveRangeID(int index, MachineRepresentation rep) { | 1863 int LiveRangeBuilder::FixedFPLiveRangeID(int index, MachineRepresentation rep) { |
| 1864 int result = -index - 1; |
1860 switch (rep) { | 1865 switch (rep) { |
| 1866 case MachineRepresentation::kSimd128: |
| 1867 result -= config()->num_float_registers(); |
| 1868 // Fall through. |
1861 case MachineRepresentation::kFloat32: | 1869 case MachineRepresentation::kFloat32: |
1862 return -index - 1 - config()->num_general_registers(); | 1870 result -= config()->num_double_registers(); |
| 1871 // Fall through. |
1863 case MachineRepresentation::kFloat64: | 1872 case MachineRepresentation::kFloat64: |
1864 return -index - 1 - config()->num_general_registers() - | 1873 result -= config()->num_general_registers(); |
1865 config()->num_float_registers(); | 1874 break; |
1866 default: | 1875 default: |
| 1876 UNREACHABLE(); |
1867 break; | 1877 break; |
1868 } | 1878 } |
1869 UNREACHABLE(); | 1879 return result; |
1870 return 0; | |
1871 } | 1880 } |
1872 | 1881 |
1873 TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { | 1882 TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { |
1874 DCHECK(index < config()->num_general_registers()); | 1883 DCHECK(index < config()->num_general_registers()); |
1875 TopLevelLiveRange* result = data()->fixed_live_ranges()[index]; | 1884 TopLevelLiveRange* result = data()->fixed_live_ranges()[index]; |
1876 if (result == nullptr) { | 1885 if (result == nullptr) { |
1877 MachineRepresentation rep = InstructionSequence::DefaultRepresentation(); | 1886 MachineRepresentation rep = InstructionSequence::DefaultRepresentation(); |
1878 result = data()->NewLiveRange(FixedLiveRangeID(index), rep); | 1887 result = data()->NewLiveRange(FixedLiveRangeID(index), rep); |
1879 DCHECK(result->IsFixed()); | 1888 DCHECK(result->IsFixed()); |
1880 result->set_assigned_register(index); | 1889 result->set_assigned_register(index); |
1881 data()->MarkAllocated(rep, index); | 1890 data()->MarkAllocated(rep, index); |
1882 data()->fixed_live_ranges()[index] = result; | 1891 data()->fixed_live_ranges()[index] = result; |
1883 } | 1892 } |
1884 return result; | 1893 return result; |
1885 } | 1894 } |
1886 | 1895 |
1887 TopLevelLiveRange* LiveRangeBuilder::FixedFPLiveRangeFor( | 1896 TopLevelLiveRange* LiveRangeBuilder::FixedFPLiveRangeFor( |
1888 int index, MachineRepresentation rep) { | 1897 int index, MachineRepresentation rep) { |
1889 TopLevelLiveRange* result = nullptr; | 1898 TopLevelLiveRange* result = nullptr; |
1890 if (rep == MachineRepresentation::kFloat64) { | 1899 switch (rep) { |
1891 DCHECK(index < config()->num_double_registers()); | 1900 case MachineRepresentation::kFloat32: |
1892 result = data()->fixed_double_live_ranges()[index]; | 1901 DCHECK(rep == MachineRepresentation::kFloat32); |
1893 if (result == nullptr) { | 1902 DCHECK(index < config()->num_float_registers()); |
1894 result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 1903 result = data()->fixed_float_live_ranges()[index]; |
1895 DCHECK(result->IsFixed()); | 1904 if (result == nullptr) { |
1896 result->set_assigned_register(index); | 1905 result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); |
1897 data()->MarkAllocated(rep, index); | 1906 DCHECK(result->IsFixed()); |
1898 data()->fixed_double_live_ranges()[index] = result; | 1907 result->set_assigned_register(index); |
1899 } | 1908 data()->MarkAllocated(rep, index); |
1900 } else { | 1909 data()->fixed_float_live_ranges()[index] = result; |
1901 DCHECK(rep == MachineRepresentation::kFloat32); | 1910 } |
1902 DCHECK(index < config()->num_float_registers()); | 1911 break; |
1903 result = data()->fixed_float_live_ranges()[index]; | 1912 case MachineRepresentation::kFloat64: |
1904 if (result == nullptr) { | 1913 DCHECK(index < config()->num_double_registers()); |
1905 result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); | 1914 result = data()->fixed_double_live_ranges()[index]; |
1906 DCHECK(result->IsFixed()); | 1915 if (result == nullptr) { |
1907 result->set_assigned_register(index); | 1916 result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); |
1908 data()->MarkAllocated(rep, index); | 1917 DCHECK(result->IsFixed()); |
1909 data()->fixed_float_live_ranges()[index] = result; | 1918 result->set_assigned_register(index); |
1910 } | 1919 data()->MarkAllocated(rep, index); |
| 1920 data()->fixed_double_live_ranges()[index] = result; |
| 1921 } |
| 1922 break; |
| 1923 case MachineRepresentation::kSimd128: |
| 1924 DCHECK(index < config()->num_simd128_registers()); |
| 1925 result = data()->fixed_simd128_live_ranges()[index]; |
| 1926 if (result == nullptr) { |
| 1927 result = data()->NewLiveRange(FixedFPLiveRangeID(index, rep), rep); |
| 1928 DCHECK(result->IsFixed()); |
| 1929 result->set_assigned_register(index); |
| 1930 data()->MarkAllocated(rep, index); |
| 1931 data()->fixed_simd128_live_ranges()[index] = result; |
| 1932 } |
| 1933 break; |
| 1934 default: |
| 1935 UNREACHABLE(); |
| 1936 break; |
1911 } | 1937 } |
1912 return result; | 1938 return result; |
1913 } | 1939 } |
1914 | 1940 |
1915 TopLevelLiveRange* LiveRangeBuilder::LiveRangeFor(InstructionOperand* operand) { | 1941 TopLevelLiveRange* LiveRangeBuilder::LiveRangeFor(InstructionOperand* operand) { |
1916 if (operand->IsUnallocated()) { | 1942 if (operand->IsUnallocated()) { |
1917 return data()->GetOrCreateLiveRangeFor( | 1943 return data()->GetOrCreateLiveRangeFor( |
1918 UnallocatedOperand::cast(operand)->virtual_register()); | 1944 UnallocatedOperand::cast(operand)->virtual_register()); |
1919 } else if (operand->IsConstant()) { | 1945 } else if (operand->IsConstant()) { |
1920 return data()->GetOrCreateLiveRangeFor( | 1946 return data()->GetOrCreateLiveRangeFor( |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2044 if (!kSimpleFPAliasing) { | 2070 if (!kSimpleFPAliasing) { |
2045 for (int i = 0; i < config()->num_allocatable_float_registers(); ++i) { | 2071 for (int i = 0; i < config()->num_allocatable_float_registers(); ++i) { |
2046 // Add a UseInterval for all FloatRegisters. See comment above for | 2072 // Add a UseInterval for all FloatRegisters. See comment above for |
2047 // general registers. | 2073 // general registers. |
2048 int code = config()->GetAllocatableFloatCode(i); | 2074 int code = config()->GetAllocatableFloatCode(i); |
2049 TopLevelLiveRange* range = | 2075 TopLevelLiveRange* range = |
2050 FixedFPLiveRangeFor(code, MachineRepresentation::kFloat32); | 2076 FixedFPLiveRangeFor(code, MachineRepresentation::kFloat32); |
2051 range->AddUseInterval(curr_position, curr_position.End(), | 2077 range->AddUseInterval(curr_position, curr_position.End(), |
2052 allocation_zone()); | 2078 allocation_zone()); |
2053 } | 2079 } |
| 2080 for (int i = 0; i < config()->num_allocatable_simd128_registers(); |
| 2081 ++i) { |
| 2082 int code = config()->GetAllocatableSimd128Code(i); |
| 2083 TopLevelLiveRange* range = |
| 2084 FixedFPLiveRangeFor(code, MachineRepresentation::kSimd128); |
| 2085 range->AddUseInterval(curr_position, curr_position.End(), |
| 2086 allocation_zone()); |
| 2087 } |
2054 } | 2088 } |
2055 } | 2089 } |
2056 | 2090 |
2057 for (size_t i = 0; i < instr->InputCount(); i++) { | 2091 for (size_t i = 0; i < instr->InputCount(); i++) { |
2058 InstructionOperand* input = instr->InputAt(i); | 2092 InstructionOperand* input = instr->InputAt(i); |
2059 if (input->IsImmediate() || input->IsExplicit()) { | 2093 if (input->IsImmediate() || input->IsExplicit()) { |
2060 continue; // Ignore immediates and explicitly reserved registers. | 2094 continue; // Ignore immediates and explicitly reserved registers. |
2061 } | 2095 } |
2062 LifetimePosition use_pos; | 2096 LifetimePosition use_pos; |
2063 if (input->IsUnallocated() && | 2097 if (input->IsUnallocated() && |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2780 | 2814 |
2781 void LinearScanAllocator::InactiveToActive(LiveRange* range) { | 2815 void LinearScanAllocator::InactiveToActive(LiveRange* range) { |
2782 RemoveElement(&inactive_live_ranges(), range); | 2816 RemoveElement(&inactive_live_ranges(), range); |
2783 active_live_ranges().push_back(range); | 2817 active_live_ranges().push_back(range); |
2784 TRACE("Moving live range %d:%d from inactive to active\n", | 2818 TRACE("Moving live range %d:%d from inactive to active\n", |
2785 range->TopLevel()->vreg(), range->relative_id()); | 2819 range->TopLevel()->vreg(), range->relative_id()); |
2786 } | 2820 } |
2787 | 2821 |
2788 | 2822 |
2789 bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { | 2823 bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
| 2824 MachineRepresentation rep = current->representation(); |
2790 int num_regs = num_registers(); | 2825 int num_regs = num_registers(); |
2791 int num_codes = num_allocatable_registers(); | 2826 int num_codes = num_allocatable_registers(); |
2792 const int* codes = allocatable_register_codes(); | 2827 const int* codes = allocatable_register_codes(); |
2793 if (!kSimpleFPAliasing && | 2828 if (!kSimpleFPAliasing) { |
2794 (current->representation() == MachineRepresentation::kFloat32)) { | 2829 if (rep == MachineRepresentation::kFloat32) { |
2795 num_regs = data()->config()->num_float_registers(); | 2830 num_regs = data()->config()->num_float_registers(); |
2796 num_codes = data()->config()->num_allocatable_float_registers(); | 2831 num_codes = data()->config()->num_allocatable_float_registers(); |
2797 codes = data()->config()->allocatable_float_codes(); | 2832 codes = data()->config()->allocatable_float_codes(); |
| 2833 } else if (rep == MachineRepresentation::kSimd128) { |
| 2834 num_regs = data()->config()->num_simd128_registers(); |
| 2835 num_codes = data()->config()->num_allocatable_simd128_registers(); |
| 2836 codes = data()->config()->allocatable_simd128_codes(); |
| 2837 } |
2798 } | 2838 } |
| 2839 |
2799 LifetimePosition free_until_pos[RegisterConfiguration::kMaxFPRegisters]; | 2840 LifetimePosition free_until_pos[RegisterConfiguration::kMaxFPRegisters]; |
2800 for (int i = 0; i < num_regs; i++) { | 2841 for (int i = 0; i < num_regs; i++) { |
2801 free_until_pos[i] = LifetimePosition::MaxPosition(); | 2842 free_until_pos[i] = LifetimePosition::MaxPosition(); |
2802 } | 2843 } |
2803 | 2844 |
2804 for (LiveRange* cur_active : active_live_ranges()) { | 2845 for (LiveRange* cur_active : active_live_ranges()) { |
2805 int cur_reg = cur_active->assigned_register(); | 2846 int cur_reg = cur_active->assigned_register(); |
2806 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { | 2847 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
2807 free_until_pos[cur_reg] = LifetimePosition::GapFromInstructionIndex(0); | 2848 free_until_pos[cur_reg] = LifetimePosition::GapFromInstructionIndex(0); |
2808 TRACE("Register %s is free until pos %d (1)\n", RegisterName(cur_reg), | 2849 TRACE("Register %s is free until pos %d (1)\n", RegisterName(cur_reg), |
2809 LifetimePosition::GapFromInstructionIndex(0).value()); | 2850 LifetimePosition::GapFromInstructionIndex(0).value()); |
2810 } else { | 2851 } else { |
2811 int alias_base_index = -1; | 2852 int alias_base_index = -1; |
2812 int aliases = data()->config()->GetAliases( | 2853 int aliases = data()->config()->GetAliases( |
2813 cur_active->representation(), cur_reg, current->representation(), | 2854 cur_active->representation(), cur_reg, rep, &alias_base_index); |
2814 &alias_base_index); | 2855 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
2815 while (aliases--) { | 2856 while (aliases--) { |
2816 int aliased_reg = alias_base_index + aliases; | 2857 int aliased_reg = alias_base_index + aliases; |
2817 free_until_pos[aliased_reg] = | 2858 free_until_pos[aliased_reg] = |
2818 LifetimePosition::GapFromInstructionIndex(0); | 2859 LifetimePosition::GapFromInstructionIndex(0); |
2819 } | 2860 } |
2820 } | 2861 } |
2821 } | 2862 } |
2822 | 2863 |
2823 for (LiveRange* cur_inactive : inactive_live_ranges()) { | 2864 for (LiveRange* cur_inactive : inactive_live_ranges()) { |
2824 DCHECK(cur_inactive->End() > current->Start()); | 2865 DCHECK(cur_inactive->End() > current->Start()); |
2825 LifetimePosition next_intersection = | 2866 LifetimePosition next_intersection = |
2826 cur_inactive->FirstIntersection(current); | 2867 cur_inactive->FirstIntersection(current); |
2827 if (!next_intersection.IsValid()) continue; | 2868 if (!next_intersection.IsValid()) continue; |
2828 int cur_reg = cur_inactive->assigned_register(); | 2869 int cur_reg = cur_inactive->assigned_register(); |
2829 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { | 2870 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
2830 free_until_pos[cur_reg] = Min(free_until_pos[cur_reg], next_intersection); | 2871 free_until_pos[cur_reg] = Min(free_until_pos[cur_reg], next_intersection); |
2831 TRACE("Register %s is free until pos %d (2)\n", RegisterName(cur_reg), | 2872 TRACE("Register %s is free until pos %d (2)\n", RegisterName(cur_reg), |
2832 Min(free_until_pos[cur_reg], next_intersection).value()); | 2873 Min(free_until_pos[cur_reg], next_intersection).value()); |
2833 } else { | 2874 } else { |
2834 int alias_base_index = -1; | 2875 int alias_base_index = -1; |
2835 int aliases = data()->config()->GetAliases( | 2876 int aliases = data()->config()->GetAliases( |
2836 cur_inactive->representation(), cur_reg, current->representation(), | 2877 cur_inactive->representation(), cur_reg, rep, &alias_base_index); |
2837 &alias_base_index); | 2878 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
2838 while (aliases--) { | 2879 while (aliases--) { |
2839 int aliased_reg = alias_base_index + aliases; | 2880 int aliased_reg = alias_base_index + aliases; |
2840 free_until_pos[aliased_reg] = | 2881 free_until_pos[aliased_reg] = |
2841 Min(free_until_pos[aliased_reg], next_intersection); | 2882 Min(free_until_pos[aliased_reg], next_intersection); |
2842 } | 2883 } |
2843 } | 2884 } |
2844 } | 2885 } |
2845 | 2886 |
2846 int hint_register; | 2887 int hint_register; |
2847 if (current->FirstHintPosition(&hint_register) != nullptr) { | 2888 if (current->FirstHintPosition(&hint_register) != nullptr) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2897 | 2938 |
2898 void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { | 2939 void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
2899 UsePosition* register_use = current->NextRegisterPosition(current->Start()); | 2940 UsePosition* register_use = current->NextRegisterPosition(current->Start()); |
2900 if (register_use == nullptr) { | 2941 if (register_use == nullptr) { |
2901 // There is no use in the current live range that requires a register. | 2942 // There is no use in the current live range that requires a register. |
2902 // We can just spill it. | 2943 // We can just spill it. |
2903 Spill(current); | 2944 Spill(current); |
2904 return; | 2945 return; |
2905 } | 2946 } |
2906 | 2947 |
| 2948 MachineRepresentation rep = current->representation(); |
2907 int num_regs = num_registers(); | 2949 int num_regs = num_registers(); |
2908 int num_codes = num_allocatable_registers(); | 2950 int num_codes = num_allocatable_registers(); |
2909 const int* codes = allocatable_register_codes(); | 2951 const int* codes = allocatable_register_codes(); |
2910 if (!kSimpleFPAliasing && | 2952 if (!kSimpleFPAliasing) { |
2911 (current->representation() == MachineRepresentation::kFloat32)) { | 2953 if (rep == MachineRepresentation::kFloat32) { |
2912 num_regs = data()->config()->num_float_registers(); | 2954 num_regs = data()->config()->num_float_registers(); |
2913 num_codes = data()->config()->num_allocatable_float_registers(); | 2955 num_codes = data()->config()->num_allocatable_float_registers(); |
2914 codes = data()->config()->allocatable_float_codes(); | 2956 codes = data()->config()->allocatable_float_codes(); |
| 2957 } else if (rep == MachineRepresentation::kSimd128) { |
| 2958 num_regs = data()->config()->num_simd128_registers(); |
| 2959 num_codes = data()->config()->num_allocatable_simd128_registers(); |
| 2960 codes = data()->config()->allocatable_simd128_codes(); |
| 2961 } |
2915 } | 2962 } |
2916 | 2963 |
2917 LifetimePosition use_pos[RegisterConfiguration::kMaxFPRegisters]; | 2964 LifetimePosition use_pos[RegisterConfiguration::kMaxFPRegisters]; |
2918 LifetimePosition block_pos[RegisterConfiguration::kMaxFPRegisters]; | 2965 LifetimePosition block_pos[RegisterConfiguration::kMaxFPRegisters]; |
2919 for (int i = 0; i < num_regs; i++) { | 2966 for (int i = 0; i < num_regs; i++) { |
2920 use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); | 2967 use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); |
2921 } | 2968 } |
2922 | 2969 |
2923 for (LiveRange* range : active_live_ranges()) { | 2970 for (LiveRange* range : active_live_ranges()) { |
2924 int cur_reg = range->assigned_register(); | 2971 int cur_reg = range->assigned_register(); |
2925 bool is_fixed_or_cant_spill = | 2972 bool is_fixed_or_cant_spill = |
2926 range->TopLevel()->IsFixed() || !range->CanBeSpilled(current->Start()); | 2973 range->TopLevel()->IsFixed() || !range->CanBeSpilled(current->Start()); |
2927 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { | 2974 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
2928 if (is_fixed_or_cant_spill) { | 2975 if (is_fixed_or_cant_spill) { |
2929 block_pos[cur_reg] = use_pos[cur_reg] = | 2976 block_pos[cur_reg] = use_pos[cur_reg] = |
2930 LifetimePosition::GapFromInstructionIndex(0); | 2977 LifetimePosition::GapFromInstructionIndex(0); |
2931 } else { | 2978 } else { |
2932 UsePosition* next_use = | 2979 UsePosition* next_use = |
2933 range->NextUsePositionRegisterIsBeneficial(current->Start()); | 2980 range->NextUsePositionRegisterIsBeneficial(current->Start()); |
2934 if (next_use == nullptr) { | 2981 if (next_use == nullptr) { |
2935 use_pos[cur_reg] = range->End(); | 2982 use_pos[cur_reg] = range->End(); |
2936 } else { | 2983 } else { |
2937 use_pos[cur_reg] = next_use->pos(); | 2984 use_pos[cur_reg] = next_use->pos(); |
2938 } | 2985 } |
2939 } | 2986 } |
2940 } else { | 2987 } else { |
2941 int alias_base_index = -1; | 2988 int alias_base_index = -1; |
2942 int aliases = data()->config()->GetAliases( | 2989 int aliases = data()->config()->GetAliases( |
2943 range->representation(), cur_reg, current->representation(), | 2990 range->representation(), cur_reg, rep, &alias_base_index); |
2944 &alias_base_index); | 2991 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
2945 while (aliases--) { | 2992 while (aliases--) { |
2946 int aliased_reg = alias_base_index + aliases; | 2993 int aliased_reg = alias_base_index + aliases; |
2947 if (is_fixed_or_cant_spill) { | 2994 if (is_fixed_or_cant_spill) { |
2948 block_pos[aliased_reg] = use_pos[aliased_reg] = | 2995 block_pos[aliased_reg] = use_pos[aliased_reg] = |
2949 LifetimePosition::GapFromInstructionIndex(0); | 2996 LifetimePosition::GapFromInstructionIndex(0); |
2950 } else { | 2997 } else { |
2951 UsePosition* next_use = | 2998 UsePosition* next_use = |
2952 range->NextUsePositionRegisterIsBeneficial(current->Start()); | 2999 range->NextUsePositionRegisterIsBeneficial(current->Start()); |
2953 if (next_use == nullptr) { | 3000 if (next_use == nullptr) { |
2954 use_pos[aliased_reg] = range->End(); | 3001 use_pos[aliased_reg] = range->End(); |
(...skipping 14 matching lines...) Expand all Loading... |
2969 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { | 3016 if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
2970 if (is_fixed) { | 3017 if (is_fixed) { |
2971 block_pos[cur_reg] = Min(block_pos[cur_reg], next_intersection); | 3018 block_pos[cur_reg] = Min(block_pos[cur_reg], next_intersection); |
2972 use_pos[cur_reg] = Min(block_pos[cur_reg], use_pos[cur_reg]); | 3019 use_pos[cur_reg] = Min(block_pos[cur_reg], use_pos[cur_reg]); |
2973 } else { | 3020 } else { |
2974 use_pos[cur_reg] = Min(use_pos[cur_reg], next_intersection); | 3021 use_pos[cur_reg] = Min(use_pos[cur_reg], next_intersection); |
2975 } | 3022 } |
2976 } else { | 3023 } else { |
2977 int alias_base_index = -1; | 3024 int alias_base_index = -1; |
2978 int aliases = data()->config()->GetAliases( | 3025 int aliases = data()->config()->GetAliases( |
2979 range->representation(), cur_reg, current->representation(), | 3026 range->representation(), cur_reg, rep, &alias_base_index); |
2980 &alias_base_index); | 3027 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
2981 while (aliases--) { | 3028 while (aliases--) { |
2982 int aliased_reg = alias_base_index + aliases; | 3029 int aliased_reg = alias_base_index + aliases; |
2983 if (is_fixed) { | 3030 if (is_fixed) { |
2984 block_pos[aliased_reg] = | 3031 block_pos[aliased_reg] = |
2985 Min(block_pos[aliased_reg], next_intersection); | 3032 Min(block_pos[aliased_reg], next_intersection); |
2986 use_pos[aliased_reg] = | 3033 use_pos[aliased_reg] = |
2987 Min(block_pos[aliased_reg], use_pos[aliased_reg]); | 3034 Min(block_pos[aliased_reg], use_pos[aliased_reg]); |
2988 } else { | 3035 } else { |
2989 use_pos[aliased_reg] = Min(use_pos[aliased_reg], next_intersection); | 3036 use_pos[aliased_reg] = Min(use_pos[aliased_reg], next_intersection); |
2990 } | 3037 } |
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3738 } | 3785 } |
3739 } | 3786 } |
3740 } | 3787 } |
3741 } | 3788 } |
3742 } | 3789 } |
3743 | 3790 |
3744 | 3791 |
3745 } // namespace compiler | 3792 } // namespace compiler |
3746 } // namespace internal | 3793 } // namespace internal |
3747 } // namespace v8 | 3794 } // namespace v8 |
OLD | NEW |