Index: src/compiler/register-allocator.cc |
diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc |
index 4647938df6293dd052ce1bcc52605b6362e3f74a..72d93957952f6b40f431bd0857c66b772443f0dd 100644 |
--- a/src/compiler/register-allocator.cc |
+++ b/src/compiler/register-allocator.cc |
@@ -81,13 +81,12 @@ bool IsOutputFPRegisterOf(Instruction* instr, MachineRepresentation rep, |
InstructionOperand* output = instr->OutputAt(i); |
if (output->IsFPRegister()) { |
const LocationOperand* op = LocationOperand::cast(output); |
- const RegisterConfiguration* config = |
- RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN); |
- if (config->fp_aliasing_kind() != RegisterConfiguration::COMBINE) { |
+ if (kSimpleFPAliasing) { |
if (op->register_code() == code) return true; |
} else { |
- if (config->AreAliases(op->representation(), op->register_code(), rep, |
- code)) { |
+ if (RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN) |
+ ->AreAliases(op->representation(), op->register_code(), rep, |
+ code)) { |
return true; |
} |
} |
@@ -1556,7 +1555,9 @@ void RegisterAllocationData::MarkAllocated(MachineRepresentation rep, |
int index) { |
switch (rep) { |
case MachineRepresentation::kFloat32: |
- if (config()->fp_aliasing_kind() == RegisterConfiguration::COMBINE) { |
+ if (kSimpleFPAliasing) { |
+ assigned_double_registers_->Add(index); |
+ } else { |
int alias_base_index = -1; |
int aliases = config()->GetAliases( |
rep, index, MachineRepresentation::kFloat64, &alias_base_index); |
@@ -2424,10 +2425,7 @@ RegisterAllocator::RegisterAllocator(RegisterAllocationData* data, |
num_allocatable_registers_( |
GetAllocatableRegisterCount(data->config(), kind)), |
allocatable_register_codes_( |
- GetAllocatableRegisterCodes(data->config(), kind)), |
- no_combining_(kind != FP_REGISTERS || |
- data->config()->fp_aliasing_kind() != |
- RegisterConfiguration::COMBINE) {} |
+ GetAllocatableRegisterCodes(data->config(), kind)) {} |
LifetimePosition RegisterAllocator::GetSplitPositionForInstruction( |
const LiveRange* range, int instruction_index) { |
@@ -2823,7 +2821,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
int num_regs = num_registers(); |
int num_codes = num_allocatable_registers(); |
const int* codes = allocatable_register_codes(); |
- if (!no_combining() && |
+ if (!kSimpleFPAliasing && |
(current->representation() == MachineRepresentation::kFloat32)) { |
num_regs = data()->config()->num_float_registers(); |
num_codes = data()->config()->num_allocatable_float_registers(); |
@@ -2836,7 +2834,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
for (LiveRange* cur_active : active_live_ranges()) { |
int cur_reg = cur_active->assigned_register(); |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
free_until_pos[cur_reg] = LifetimePosition::GapFromInstructionIndex(0); |
TRACE("Register %s is free until pos %d (1)\n", RegisterName(cur_reg), |
LifetimePosition::GapFromInstructionIndex(0).value()); |
@@ -2859,7 +2857,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
cur_inactive->FirstIntersection(current); |
if (!next_intersection.IsValid()) continue; |
int cur_reg = cur_inactive->assigned_register(); |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
free_until_pos[cur_reg] = Min(free_until_pos[cur_reg], next_intersection); |
TRACE("Register %s is free until pos %d (2)\n", RegisterName(cur_reg), |
Min(free_until_pos[cur_reg], next_intersection).value()); |
@@ -2940,7 +2938,7 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
int num_regs = num_registers(); |
int num_codes = num_allocatable_registers(); |
const int* codes = allocatable_register_codes(); |
- if (!no_combining() && |
+ if (!kSimpleFPAliasing && |
(current->representation() == MachineRepresentation::kFloat32)) { |
num_regs = data()->config()->num_float_registers(); |
num_codes = data()->config()->num_allocatable_float_registers(); |
@@ -2957,7 +2955,7 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
int cur_reg = range->assigned_register(); |
bool is_fixed_or_cant_spill = |
range->TopLevel()->IsFixed() || !range->CanBeSpilled(current->Start()); |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
if (is_fixed_or_cant_spill) { |
block_pos[cur_reg] = use_pos[cur_reg] = |
LifetimePosition::GapFromInstructionIndex(0); |
@@ -2999,7 +2997,7 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
if (!next_intersection.IsValid()) continue; |
int cur_reg = range->assigned_register(); |
bool is_fixed = range->TopLevel()->IsFixed(); |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
if (is_fixed) { |
block_pos[cur_reg] = Min(block_pos[cur_reg], next_intersection); |
use_pos[cur_reg] = Min(block_pos[cur_reg], use_pos[cur_reg]); |
@@ -3073,7 +3071,7 @@ void LinearScanAllocator::SplitAndSpillIntersecting(LiveRange* current) { |
LifetimePosition split_pos = current->Start(); |
for (size_t i = 0; i < active_live_ranges().size(); ++i) { |
LiveRange* range = active_live_ranges()[i]; |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
if (range->assigned_register() != reg) continue; |
} else { |
if (!data()->config()->AreAliases(current->representation(), reg, |
@@ -3108,7 +3106,7 @@ void LinearScanAllocator::SplitAndSpillIntersecting(LiveRange* current) { |
LiveRange* range = inactive_live_ranges()[i]; |
DCHECK(range->End() > current->Start()); |
if (range->TopLevel()->IsFixed()) continue; |
- if (no_combining()) { |
+ if (kSimpleFPAliasing || mode() == GENERAL_REGISTERS) { |
if (range->assigned_register() != reg) continue; |
} else { |
if (!data()->config()->AreAliases(current->representation(), reg, |