blob: 2a056a82c38f008073afb002b0003ad0f308c428 [file] [log] [blame]
Ian Rogers2c8f6532011-09-02 17:16:34 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_CALLING_CONVENTION_ARM_H_
4#define ART_SRC_CALLING_CONVENTION_ARM_H_
5
6#include "calling_convention.h"
7
8namespace art {
9namespace arm {
10
11class ArmManagedRuntimeCallingConvention : public ManagedRuntimeCallingConvention {
12 public:
Brian Carlstrom3320cf42011-10-04 14:58:28 -070013 explicit ArmManagedRuntimeCallingConvention(const Method* method) :
Ian Rogers2c8f6532011-09-02 17:16:34 -070014 ManagedRuntimeCallingConvention(method) {}
15 virtual ~ArmManagedRuntimeCallingConvention() {}
16 // Calling convention
17 virtual ManagedRegister ReturnRegister();
18 virtual ManagedRegister InterproceduralScratchRegister();
19 // Managed runtime calling convention
20 virtual ManagedRegister MethodRegister();
21 virtual bool IsCurrentParamInRegister();
22 virtual bool IsCurrentParamOnStack();
23 virtual ManagedRegister CurrentParamRegister();
24 virtual FrameOffset CurrentParamStackOffset();
25
26 private:
27 DISALLOW_COPY_AND_ASSIGN(ArmManagedRuntimeCallingConvention);
28};
29
30class ArmJniCallingConvention : public JniCallingConvention {
31 public:
Brian Carlstrom3320cf42011-10-04 14:58:28 -070032 explicit ArmJniCallingConvention(const Method* method);
Ian Rogers2c8f6532011-09-02 17:16:34 -070033 virtual ~ArmJniCallingConvention() {}
34 // Calling convention
35 virtual ManagedRegister ReturnRegister();
36 virtual ManagedRegister InterproceduralScratchRegister();
37 // JNI calling convention
Ian Rogers67375ac2011-09-14 00:55:44 -070038 virtual void Next(); // Override default behavior for AAPCS
Ian Rogers2c8f6532011-09-02 17:16:34 -070039 virtual size_t FrameSize();
40 virtual size_t ReturnPcOffset();
41 virtual size_t OutArgSize();
Ian Rogersbdb03912011-09-14 00:55:44 -070042 virtual const std::vector<ManagedRegister>& CalleeSaveRegisters() const {
43 return callee_save_regs_;
44 }
Ian Rogersdc51b792011-09-22 20:41:37 -070045 virtual ManagedRegister ReturnScratchRegister() const;
Ian Rogers67375ac2011-09-14 00:55:44 -070046 virtual uint32_t CoreSpillMask() const;
Ian Rogersbdb03912011-09-14 00:55:44 -070047 virtual uint32_t FpSpillMask() const {
Ian Rogers67375ac2011-09-14 00:55:44 -070048 return 0; // Floats aren't spilled in JNI down call
Ian Rogersbdb03912011-09-14 00:55:44 -070049 }
Ian Rogersad42e132011-09-17 20:23:33 -070050 virtual bool IsMethodRegisterClobberedPreCall();
Ian Rogers2c8f6532011-09-02 17:16:34 -070051 virtual bool IsCurrentParamInRegister();
52 virtual bool IsCurrentParamOnStack();
53 virtual ManagedRegister CurrentParamRegister();
54 virtual FrameOffset CurrentParamStackOffset();
55
56 protected:
57 virtual size_t NumberOfOutgoingStackArgs();
58
59 private:
Ian Rogersbdb03912011-09-14 00:55:44 -070060 // TODO: these values aren't unique and can be shared amongst instances
61 std::vector<ManagedRegister> callee_save_regs_;
62
Ian Rogers67375ac2011-09-14 00:55:44 -070063 // Padding to ensure longs and doubles are not split in AAPCS
64 size_t padding_;
65
Ian Rogers2c8f6532011-09-02 17:16:34 -070066 DISALLOW_COPY_AND_ASSIGN(ArmJniCallingConvention);
67};
68
69} // namespace arm
70} // namespace art
71
72#endif // ART_SRC_CALLING_CONVENTION_ARM_H_