summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator.h
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-04-03 10:38:37 +0100
committerNicolas Geoffray <ngeoffray@google.com>2014-04-03 17:09:22 +0100
commit4a34a428c6a2588e0857ef6baf88f1b73ce65958 (patch)
treea9f025c17752a175c4e6a203c01e935cb438efb1 /compiler/optimizing/code_generator.h
parent8549cf9d83688f7decbbea2a8de761ce29e95f3c (diff)
downloadart-4a34a428c6a2588e0857ef6baf88f1b73ce65958.zip
art-4a34a428c6a2588e0857ef6baf88f1b73ce65958.tar.gz
art-4a34a428c6a2588e0857ef6baf88f1b73ce65958.tar.bz2
Support passing arguments to invoke-static* instructions.
- Stop using the frame pointer for accessing locals. - Stop emulating a stack when doing code generation. Instead, rely on dex register model, where instructions only reference registers. Change-Id: Id51bd7d33ac430cb87a53c9f4b0c864eeb1006f9
Diffstat (limited to 'compiler/optimizing/code_generator.h')
-rw-r--r--compiler/optimizing/code_generator.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index 24dcab6..01bbcc0 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -141,8 +141,7 @@ class CodeGenerator : public ArenaObject {
virtual void GenerateFrameEntry() = 0;
virtual void GenerateFrameExit() = 0;
virtual void Bind(Label* label) = 0;
- virtual void Move(HInstruction* instruction, Location location) = 0;
- virtual void Push(HInstruction* instruction, Location location) = 0;
+ virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) = 0;
virtual HGraphVisitor* GetLocationBuilder() = 0;
virtual HGraphVisitor* GetInstructionVisitor() = 0;
virtual Assembler* GetAssembler() = 0;
@@ -191,6 +190,33 @@ class CodeGenerator : public ArenaObject {
DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
};
+template <typename T>
+class CallingConvention {
+ public:
+ CallingConvention(const T* registers, int number_of_registers)
+ : registers_(registers), number_of_registers_(number_of_registers) {}
+
+ size_t GetNumberOfRegisters() const { return number_of_registers_; }
+
+ T GetRegisterAt(size_t index) const {
+ DCHECK_LT(index, number_of_registers_);
+ return registers_[index];
+ }
+
+ uint8_t GetStackOffsetOf(size_t index) const {
+ DCHECK_GE(index, number_of_registers_);
+ // We still reserve the space for parameters passed by registers.
+ // Add kWordSize for the method pointer.
+ return index * kWordSize + kWordSize;
+ }
+
+ private:
+ const T* registers_;
+ const size_t number_of_registers_;
+
+ DISALLOW_COPY_AND_ASSIGN(CallingConvention);
+};
+
} // namespace art
#endif // ART_COMPILER_OPTIMIZING_CODE_GENERATOR_H_