diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-03-13 16:36:36 +0000 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2015-03-13 16:47:44 +0000 |
commit | a8ac9130b872c080299afacf5dcaab513d13ea87 (patch) | |
tree | 2bd0a2a88cbb6e7a3ae79dff84c466bed9189eb5 /compiler/optimizing/code_generator.cc | |
parent | cc22e3946baf035c8732e9417ab132bfe663aa45 (diff) | |
download | art-a8ac9130b872c080299afacf5dcaab513d13ea87.tar.gz art-a8ac9130b872c080299afacf5dcaab513d13ea87.tar.bz2 art-a8ac9130b872c080299afacf5dcaab513d13ea87.zip |
Refactor code in preparation of correct stack maps in slow path.
Move the logic of saving/restoring live registers in slow path
in the SlowPathCode method. Also add a RecordPcInfo helper to
SlowPathCode, that will act as the placeholder of saving correct
stack maps.
Change-Id: I25c2bc7a642ef854bbc8a3eb570e5c8c8d2d030c
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r-- | compiler/optimizing/code_generator.cc | 96 |
1 files changed, 50 insertions, 46 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index a6ab20812e..742d83e093 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -750,78 +750,82 @@ void CodeGenerator::MaybeRecordImplicitNullCheck(HInstruction* instr) { } } -void CodeGenerator::SaveLiveRegisters(LocationSummary* locations) { +void CodeGenerator::ClearSpillSlotsFromLoopPhisInStackMap(HSuspendCheck* suspend_check) const { + LocationSummary* locations = suspend_check->GetLocations(); + HBasicBlock* block = suspend_check->GetBlock(); + DCHECK(block->GetLoopInformation()->GetSuspendCheck() == suspend_check); + DCHECK(block->IsLoopHeader()); + + for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) { + HInstruction* current = it.Current(); + LiveInterval* interval = current->GetLiveInterval(); + // We only need to clear bits of loop phis containing objects and allocated in register. + // Loop phis allocated on stack already have the object in the stack. + if (current->GetType() == Primitive::kPrimNot + && interval->HasRegister() + && interval->HasSpillSlot()) { + locations->ClearStackBit(interval->GetSpillSlot() / kVRegSize); + } + } +} + +void CodeGenerator::EmitParallelMoves(Location from1, Location to1, Location from2, Location to2) { + HParallelMove parallel_move(GetGraph()->GetArena()); + parallel_move.AddMove(from1, to1, nullptr); + parallel_move.AddMove(from2, to2, nullptr); + GetMoveResolver()->EmitNativeCode(¶llel_move); +} + +void SlowPathCode::RecordPcInfo(CodeGenerator* codegen, HInstruction* instruction, uint32_t dex_pc) { + codegen->RecordPcInfo(instruction, dex_pc); +} + +void SlowPathCode::SaveLiveRegisters(CodeGenerator* codegen, LocationSummary* locations) { RegisterSet* register_set = locations->GetLiveRegisters(); - size_t stack_offset = first_register_slot_in_slow_path_; - for (size_t i = 0, e = GetNumberOfCoreRegisters(); i < e; ++i) { - if (!IsCoreCalleeSaveRegister(i)) { + size_t stack_offset = codegen->GetFirstRegisterSlotInSlowPath(); + for (size_t i = 0, e = codegen->GetNumberOfCoreRegisters(); i < e; ++i) { + if (!codegen->IsCoreCalleeSaveRegister(i)) { if (register_set->ContainsCoreRegister(i)) { // If the register holds an object, update the stack mask. if (locations->RegisterContainsObject(i)) { locations->SetStackBit(stack_offset / kVRegSize); } - DCHECK_LT(stack_offset, GetFrameSize() - FrameEntrySpillSize()); - stack_offset += SaveCoreRegister(stack_offset, i); + DCHECK_LT(stack_offset, codegen->GetFrameSize() - codegen->FrameEntrySpillSize()); + stack_offset += codegen->SaveCoreRegister(stack_offset, i); } } } - for (size_t i = 0, e = GetNumberOfFloatingPointRegisters(); i < e; ++i) { - if (!IsFloatingPointCalleeSaveRegister(i)) { + for (size_t i = 0, e = codegen->GetNumberOfFloatingPointRegisters(); i < e; ++i) { + if (!codegen->IsFloatingPointCalleeSaveRegister(i)) { if (register_set->ContainsFloatingPointRegister(i)) { - DCHECK_LT(stack_offset, GetFrameSize() - FrameEntrySpillSize()); - stack_offset += SaveFloatingPointRegister(stack_offset, i); + DCHECK_LT(stack_offset, codegen->GetFrameSize() - codegen->FrameEntrySpillSize()); + stack_offset += codegen->SaveFloatingPointRegister(stack_offset, i); } } } } -void CodeGenerator::RestoreLiveRegisters(LocationSummary* locations) { +void SlowPathCode::RestoreLiveRegisters(CodeGenerator* codegen, LocationSummary* locations) { RegisterSet* register_set = locations->GetLiveRegisters(); - size_t stack_offset = first_register_slot_in_slow_path_; - for (size_t i = 0, e = GetNumberOfCoreRegisters(); i < e; ++i) { - if (!IsCoreCalleeSaveRegister(i)) { + size_t stack_offset = codegen->GetFirstRegisterSlotInSlowPath(); + for (size_t i = 0, e = codegen->GetNumberOfCoreRegisters(); i < e; ++i) { + if (!codegen->IsCoreCalleeSaveRegister(i)) { if (register_set->ContainsCoreRegister(i)) { - DCHECK_LT(stack_offset, GetFrameSize() - FrameEntrySpillSize()); - stack_offset += RestoreCoreRegister(stack_offset, i); + DCHECK_LT(stack_offset, codegen->GetFrameSize() - codegen->FrameEntrySpillSize()); + stack_offset += codegen->RestoreCoreRegister(stack_offset, i); } } } - for (size_t i = 0, e = GetNumberOfFloatingPointRegisters(); i < e; ++i) { - if (!IsFloatingPointCalleeSaveRegister(i)) { + for (size_t i = 0, e = codegen->GetNumberOfFloatingPointRegisters(); i < e; ++i) { + if (!codegen->IsFloatingPointCalleeSaveRegister(i)) { if (register_set->ContainsFloatingPointRegister(i)) { - DCHECK_LT(stack_offset, GetFrameSize() - FrameEntrySpillSize()); - stack_offset += RestoreFloatingPointRegister(stack_offset, i); + DCHECK_LT(stack_offset, codegen->GetFrameSize() - codegen->FrameEntrySpillSize()); + stack_offset += codegen->RestoreFloatingPointRegister(stack_offset, i); } } } } -void CodeGenerator::ClearSpillSlotsFromLoopPhisInStackMap(HSuspendCheck* suspend_check) const { - LocationSummary* locations = suspend_check->GetLocations(); - HBasicBlock* block = suspend_check->GetBlock(); - DCHECK(block->GetLoopInformation()->GetSuspendCheck() == suspend_check); - DCHECK(block->IsLoopHeader()); - - for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) { - HInstruction* current = it.Current(); - LiveInterval* interval = current->GetLiveInterval(); - // We only need to clear bits of loop phis containing objects and allocated in register. - // Loop phis allocated on stack already have the object in the stack. - if (current->GetType() == Primitive::kPrimNot - && interval->HasRegister() - && interval->HasSpillSlot()) { - locations->ClearStackBit(interval->GetSpillSlot() / kVRegSize); - } - } -} - -void CodeGenerator::EmitParallelMoves(Location from1, Location to1, Location from2, Location to2) { - HParallelMove parallel_move(GetGraph()->GetArena()); - parallel_move.AddMove(from1, to1, nullptr); - parallel_move.AddMove(from2, to2, nullptr); - GetMoveResolver()->EmitNativeCode(¶llel_move); -} - } // namespace art |