summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator.h
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-10-06 09:12:41 +0100
committerNicolas Geoffray <ngeoffray@google.com>2014-10-07 20:19:47 +0100
commit7fb49da8ec62e8a10ed9419ade9f32c6b1174687 (patch)
tree8b1bec67452b84809cecd5645543e1f885ccbd44 /compiler/optimizing/code_generator.h
parent4a1b4679cda2f0d2893b8e3f910c21231849291c (diff)
downloadart-7fb49da8ec62e8a10ed9419ade9f32c6b1174687.tar.gz
art-7fb49da8ec62e8a10ed9419ade9f32c6b1174687.tar.bz2
art-7fb49da8ec62e8a10ed9419ade9f32c6b1174687.zip
Add support for floats and doubles.
- Follows Quick conventions. - Currently only works with baseline register allocator. Change-Id: Ie4b8e298f4f5e1cd82364da83e4344d4fc3621a3
Diffstat (limited to 'compiler/optimizing/code_generator.h')
-rw-r--r--compiler/optimizing/code_generator.h26
1 files changed, 20 insertions, 6 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index b58f3b3efc..c7623fe895 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -203,28 +203,42 @@ class CodeGenerator : public ArenaObject {
DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
};
-template <typename T>
+template <typename C, typename F>
class CallingConvention {
public:
- CallingConvention(const T* registers, int number_of_registers)
- : registers_(registers), number_of_registers_(number_of_registers) {}
+ CallingConvention(const C* registers,
+ size_t number_of_registers,
+ const F* fpu_registers,
+ size_t number_of_fpu_registers)
+ : registers_(registers),
+ number_of_registers_(number_of_registers),
+ fpu_registers_(fpu_registers),
+ number_of_fpu_registers_(number_of_fpu_registers) {}
size_t GetNumberOfRegisters() const { return number_of_registers_; }
+ size_t GetNumberOfFpuRegisters() const { return number_of_fpu_registers_; }
- T GetRegisterAt(size_t index) const {
+ C GetRegisterAt(size_t index) const {
DCHECK_LT(index, number_of_registers_);
return registers_[index];
}
- uint8_t GetStackOffsetOf(size_t index) const {
+ F GetFpuRegisterAt(size_t index) const {
+ DCHECK_LT(index, number_of_fpu_registers_);
+ return fpu_registers_[index];
+ }
+
+ size_t GetStackOffsetOf(size_t index) const {
// We still reserve the space for parameters passed by registers.
// Add one for the method pointer.
return (index + 1) * kVRegSize;
}
private:
- const T* registers_;
+ const C* registers_;
const size_t number_of_registers_;
+ const F* fpu_registers_;
+ const size_t number_of_fpu_registers_;
DISALLOW_COPY_AND_ASSIGN(CallingConvention);
};