blob: 3d513fedbee8042a126e25e4e361566233849aa2 [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:
13 explicit ArmManagedRuntimeCallingConvention(Method* method) :
14 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:
32 explicit ArmJniCallingConvention(Method* method);
33 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 Rogers67375ac2011-09-14 00:55:44 -070045 virtual uint32_t CoreSpillMask() const;
Ian Rogersbdb03912011-09-14 00:55:44 -070046 virtual uint32_t FpSpillMask() const {
Ian Rogers67375ac2011-09-14 00:55:44 -070047 return 0; // Floats aren't spilled in JNI down call
Ian Rogersbdb03912011-09-14 00:55:44 -070048 }
Ian Rogersad42e132011-09-17 20:23:33 -070049 virtual bool IsMethodRegisterClobberedPreCall();
Ian Rogers2c8f6532011-09-02 17:16:34 -070050 virtual bool IsCurrentParamInRegister();
51 virtual bool IsCurrentParamOnStack();
52 virtual ManagedRegister CurrentParamRegister();
53 virtual FrameOffset CurrentParamStackOffset();
54
55 protected:
56 virtual size_t NumberOfOutgoingStackArgs();
57
58 private:
Ian Rogersbdb03912011-09-14 00:55:44 -070059 // TODO: these values aren't unique and can be shared amongst instances
60 std::vector<ManagedRegister> callee_save_regs_;
61
Ian Rogers67375ac2011-09-14 00:55:44 -070062 // Padding to ensure longs and doubles are not split in AAPCS
63 size_t padding_;
64
Ian Rogers2c8f6532011-09-02 17:16:34 -070065 DISALLOW_COPY_AND_ASSIGN(ArmJniCallingConvention);
66};
67
68} // namespace arm
69} // namespace art
70
71#endif // ART_SRC_CALLING_CONVENTION_ARM_H_