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 2967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2978 LiveRange* range, Vector<LifetimePosition> positions) { | 2978 LiveRange* range, Vector<LifetimePosition> positions) { |
2979 int num_regs = num_registers(); | 2979 int num_regs = num_registers(); |
2980 int num_codes = num_allocatable_registers(); | 2980 int num_codes = num_allocatable_registers(); |
2981 const int* codes = allocatable_register_codes(); | 2981 const int* codes = allocatable_register_codes(); |
2982 MachineRepresentation rep = range->representation(); | 2982 MachineRepresentation rep = range->representation(); |
2983 if (!kSimpleFPAliasing && (rep == MachineRepresentation::kFloat32 || | 2983 if (!kSimpleFPAliasing && (rep == MachineRepresentation::kFloat32 || |
2984 rep == MachineRepresentation::kSimd128)) | 2984 rep == MachineRepresentation::kSimd128)) |
2985 GetFPRegisterSet(rep, &num_regs, &num_codes, &codes); | 2985 GetFPRegisterSet(rep, &num_regs, &num_codes, &codes); |
2986 DCHECK_GE(positions.length(), num_regs); | 2986 DCHECK_GE(positions.length(), num_regs); |
2987 | 2987 |
2988 for (int i = 0; i < num_regs; i++) { | 2988 for (int i = 0; i < num_regs; ++i) { |
2989 positions[i] = LifetimePosition::MaxPosition(); | 2989 positions[i] = LifetimePosition::MaxPosition(); |
2990 } | 2990 } |
2991 | 2991 |
2992 for (LiveRange* cur_active : active_live_ranges()) { | 2992 for (LiveRange* cur_active : active_live_ranges()) { |
2993 int cur_reg = cur_active->assigned_register(); | 2993 int cur_reg = cur_active->assigned_register(); |
2994 if (kSimpleFPAliasing || !check_fp_aliasing()) { | 2994 if (kSimpleFPAliasing || !check_fp_aliasing()) { |
2995 positions[cur_reg] = LifetimePosition::GapFromInstructionIndex(0); | 2995 positions[cur_reg] = LifetimePosition::GapFromInstructionIndex(0); |
2996 TRACE("Register %s is free until pos %d (1)\n", RegisterName(cur_reg), | 2996 TRACE("Register %s is free until pos %d (1)\n", RegisterName(cur_reg), |
2997 LifetimePosition::GapFromInstructionIndex(0).value()); | 2997 LifetimePosition::GapFromInstructionIndex(0).value()); |
2998 } else { | 2998 } else { |
2999 int alias_base_index = -1; | 2999 int alias_base_index = -1; |
3000 int aliases = data()->config()->GetAliases( | 3000 int aliases = data()->config()->GetAliases( |
3001 cur_active->representation(), cur_reg, rep, &alias_base_index); | 3001 cur_active->representation(), cur_reg, rep, &alias_base_index); |
3002 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 3002 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
3003 while (aliases--) { | 3003 while (aliases--) { |
3004 int aliased_reg = alias_base_index + aliases; | 3004 int aliased_reg = alias_base_index + aliases; |
3005 positions[aliased_reg] = LifetimePosition::GapFromInstructionIndex(0); | 3005 positions[aliased_reg] = LifetimePosition::GapFromInstructionIndex(0); |
3006 } | 3006 } |
3007 } | 3007 } |
3008 } | 3008 } |
3009 | 3009 |
3010 for (LiveRange* cur_inactive : inactive_live_ranges()) { | 3010 for (LiveRange* cur_inactive : inactive_live_ranges()) { |
3011 DCHECK(cur_inactive->End() > range->Start()); | 3011 DCHECK(cur_inactive->End() > range->Start()); |
| 3012 int cur_reg = cur_inactive->assigned_register(); |
| 3013 // No need to carry out intersections, when this register won't be |
| 3014 // interesting to this range anyway. |
| 3015 if (positions[cur_reg] < range->Start()) continue; |
| 3016 |
3012 LifetimePosition next_intersection = cur_inactive->FirstIntersection(range); | 3017 LifetimePosition next_intersection = cur_inactive->FirstIntersection(range); |
3013 if (!next_intersection.IsValid()) continue; | 3018 if (!next_intersection.IsValid()) continue; |
3014 int cur_reg = cur_inactive->assigned_register(); | |
3015 if (kSimpleFPAliasing || !check_fp_aliasing()) { | 3019 if (kSimpleFPAliasing || !check_fp_aliasing()) { |
3016 positions[cur_reg] = Min(positions[cur_reg], next_intersection); | 3020 positions[cur_reg] = Min(positions[cur_reg], next_intersection); |
3017 TRACE("Register %s is free until pos %d (2)\n", RegisterName(cur_reg), | 3021 TRACE("Register %s is free until pos %d (2)\n", RegisterName(cur_reg), |
3018 Min(positions[cur_reg], next_intersection).value()); | 3022 Min(positions[cur_reg], next_intersection).value()); |
3019 } else { | 3023 } else { |
3020 int alias_base_index = -1; | 3024 int alias_base_index = -1; |
3021 int aliases = data()->config()->GetAliases( | 3025 int aliases = data()->config()->GetAliases( |
3022 cur_inactive->representation(), cur_reg, rep, &alias_base_index); | 3026 cur_inactive->representation(), cur_reg, rep, &alias_base_index); |
3023 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); | 3027 DCHECK(aliases > 0 || (aliases == 0 && alias_base_index == -1)); |
3024 while (aliases--) { | 3028 while (aliases--) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3104 return false; | 3108 return false; |
3105 } | 3109 } |
3106 | 3110 |
3107 bool LinearScanAllocator::TryAllocateFreeReg( | 3111 bool LinearScanAllocator::TryAllocateFreeReg( |
3108 LiveRange* current, const Vector<LifetimePosition>& free_until_pos) { | 3112 LiveRange* current, const Vector<LifetimePosition>& free_until_pos) { |
3109 int num_regs = 0; // used only for the call to GetFPRegisterSet. | 3113 int num_regs = 0; // used only for the call to GetFPRegisterSet. |
3110 int num_codes = num_allocatable_registers(); | 3114 int num_codes = num_allocatable_registers(); |
3111 const int* codes = allocatable_register_codes(); | 3115 const int* codes = allocatable_register_codes(); |
3112 MachineRepresentation rep = current->representation(); | 3116 MachineRepresentation rep = current->representation(); |
3113 if (!kSimpleFPAliasing && (rep == MachineRepresentation::kFloat32 || | 3117 if (!kSimpleFPAliasing && (rep == MachineRepresentation::kFloat32 || |
3114 rep == MachineRepresentation::kSimd128)) | 3118 rep == MachineRepresentation::kSimd128)) { |
3115 GetFPRegisterSet(rep, &num_regs, &num_codes, &codes); | 3119 GetFPRegisterSet(rep, &num_regs, &num_codes, &codes); |
| 3120 } |
3116 | 3121 |
3117 DCHECK_GE(free_until_pos.length(), num_codes); | 3122 DCHECK_GE(free_until_pos.length(), num_codes); |
3118 | 3123 |
3119 // Find the register which stays free for the longest time. | 3124 // Find the register which stays free for the longest time. |
3120 int reg = codes[0]; | 3125 int reg = codes[0]; |
3121 for (int i = 1; i < num_codes; ++i) { | 3126 for (int i = 1; i < num_codes; ++i) { |
3122 int code = codes[i]; | 3127 int code = codes[i]; |
3123 if (free_until_pos[code] > free_until_pos[reg]) { | 3128 if (free_until_pos[code] > free_until_pos[reg]) { |
3124 reg = code; | 3129 reg = code; |
3125 } | 3130 } |
(...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3978 } | 3983 } |
3979 } | 3984 } |
3980 } | 3985 } |
3981 } | 3986 } |
3982 } | 3987 } |
3983 | 3988 |
3984 | 3989 |
3985 } // namespace compiler | 3990 } // namespace compiler |
3986 } // namespace internal | 3991 } // namespace internal |
3987 } // namespace v8 | 3992 } // namespace v8 |
OLD | NEW |