diff options
Diffstat (limited to 'compiler/optimizing/code_generator.h')
-rw-r--r-- | compiler/optimizing/code_generator.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index a83d703..55f5d8d 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -98,7 +98,9 @@ class CodeGenerator : public ArenaObject { virtual HGraphVisitor* GetInstructionVisitor() = 0; virtual Assembler* GetAssembler() = 0; virtual size_t GetWordSize() const = 0; - void ComputeFrameSize(size_t number_of_spill_slots, size_t number_of_out_slots); + void ComputeFrameSize(size_t number_of_spill_slots, + size_t maximum_number_of_live_registers, + size_t number_of_out_slots); virtual size_t FrameEntrySpillSize() const = 0; int32_t GetStackSlot(HLocal* local) const; Location GetTemporaryLocation(HTemporary* temp) const; @@ -114,6 +116,8 @@ class CodeGenerator : public ArenaObject { virtual void DumpCoreRegister(std::ostream& stream, int reg) const = 0; virtual void DumpFloatingPointRegister(std::ostream& stream, int reg) const = 0; virtual InstructionSet GetInstructionSet() const = 0; + virtual void SaveCoreRegister(Location stack_location, uint32_t reg_id) = 0; + virtual void RestoreCoreRegister(Location stack_location, uint32_t reg_id) = 0; void RecordPcInfo(HInstruction* instruction, uint32_t dex_pc); @@ -128,6 +132,8 @@ class CodeGenerator : public ArenaObject { void BuildNativeGCMap( std::vector<uint8_t>* vector, const DexCompilationUnit& dex_compilation_unit) const; void BuildStackMaps(std::vector<uint8_t>* vector); + void SaveLiveRegisters(LocationSummary* locations); + void RestoreLiveRegisters(LocationSummary* locations); bool IsLeafMethod() const { return is_leaf_; @@ -141,6 +147,7 @@ class CodeGenerator : public ArenaObject { CodeGenerator(HGraph* graph, size_t number_of_registers) : frame_size_(kUninitializedFrameSize), core_spill_mask_(0), + first_register_slot_in_slow_path_(0), graph_(graph), block_labels_(graph->GetArena(), 0), pc_infos_(graph->GetArena(), 32), @@ -166,9 +173,11 @@ class CodeGenerator : public ArenaObject { // Frame size required for this method. uint32_t frame_size_; uint32_t core_spill_mask_; + uint32_t first_register_slot_in_slow_path_; private: void InitLocations(HInstruction* instruction); + size_t GetStackOffsetOfSavedRegister(size_t index); HGraph* const graph_; |