summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator.cc
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2015-03-13 16:36:36 +0000
committerNicolas Geoffray <ngeoffray@google.com>2015-03-13 16:47:44 +0000
commita8ac9130b872c080299afacf5dcaab513d13ea87 (patch)
tree2bd0a2a88cbb6e7a3ae79dff84c466bed9189eb5 /compiler/optimizing/code_generator.cc
parentcc22e3946baf035c8732e9417ab132bfe663aa45 (diff)
downloadart-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.cc96
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(&parallel_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(&parallel_move);
-}
-
} // namespace art