blob: 984250e3c7d4e7b07158db41e3a1664892eceeed [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 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_