blob: 148eee2b728c7993ccd1adb56fe16d92a95d1393 [file] [log] [blame]
Ian Rogersb033c752011-07-20 12:22:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
Ian Rogersb033c752011-07-20 12:22:35 -07002
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07003#include "calling_convention.h"
4#include "logging.h"
5#include "utils.h"
Ian Rogersb033c752011-07-20 12:22:35 -07006
7namespace art {
8
9ManagedRegister CallingConvention::MethodRegister() {
10 return ManagedRegister::FromCpuRegister(EDI);
11}
12
13ManagedRegister CallingConvention::InterproceduralScratchRegister() {
14 return ManagedRegister::FromCpuRegister(ECX);
15}
16
17ManagedRegister CallingConvention::ReturnRegister() {
Ian Rogers45a76cb2011-07-21 22:00:15 -070018 const Method *method = GetMethod();
19 if (method->IsReturnAFloatOrDouble()) {
Ian Rogersb033c752011-07-20 12:22:35 -070020 return ManagedRegister::FromX87Register(ST0);
Ian Rogers45a76cb2011-07-21 22:00:15 -070021 } else if (method->IsReturnALong()) {
Ian Rogersb033c752011-07-20 12:22:35 -070022 return ManagedRegister::FromRegisterPair(EAX_EDX);
Ian Rogers45a76cb2011-07-21 22:00:15 -070023 } else if (method->IsReturnVoid()) {
24 return ManagedRegister::NoRegister();
Ian Rogersb033c752011-07-20 12:22:35 -070025 } else {
26 return ManagedRegister::FromCpuRegister(EAX);
27 }
28}
29
30// Managed runtime calling convention
31
32bool ManagedRuntimeCallingConvention::IsCurrentParamInRegister() {
33 return false; // Everything is passed by stack
34}
35
36bool ManagedRuntimeCallingConvention::IsCurrentParamOnStack() {
37 return true; // Everything is passed by stack
38}
39
40ManagedRegister ManagedRuntimeCallingConvention::CurrentParamRegister() {
41 LOG(FATAL) << "Should not reach here";
42 return ManagedRegister::NoRegister();
43}
44
45FrameOffset ManagedRuntimeCallingConvention::CurrentParamStackOffset() {
Ian Rogerscdd1d2d2011-08-18 09:58:17 -070046 return FrameOffset(displacement_.Int32Value() + // displacement
47 kPointerSize + // Method*
48 (itr_slots_ * kPointerSize)); // offset into in args
Ian Rogersb033c752011-07-20 12:22:35 -070049}
50
51// JNI calling convention
52
Ian Rogers0d666d82011-08-14 16:03:46 -070053size_t JniCallingConvention::FrameSize() {
54 // Return address and Method*
55 size_t frame_data_size = 2 * kPointerSize;
Ian Rogers408f79a2011-08-23 18:22:33 -070056 // References plus 2 words for SIRT header
57 size_t sirt_size = (ReferenceCount() + 2) * kPointerSize;
Ian Rogers0d666d82011-08-14 16:03:46 -070058 // Plus return value spill area size
Ian Rogers408f79a2011-08-23 18:22:33 -070059 return RoundUp(frame_data_size + sirt_size + SizeOfReturnValue(),
60 kStackAlignment);
Ian Rogers0d666d82011-08-14 16:03:46 -070061}
62
Ian Rogers762400c2011-08-23 12:14:16 -070063size_t JniCallingConvention::ReturnPcOffset() {
64 // Return PC is pushed at the top of the frame by the call into the method
65 return FrameSize() - kPointerSize;
66}
67
68
Ian Rogers0d666d82011-08-14 16:03:46 -070069size_t JniCallingConvention::SpillAreaSize() {
70 // No spills, return address was pushed at the top of the frame
71 return 0;
72}
73
74std::vector<ManagedRegister>* JniCallingConvention::ComputeRegsToSpillPreCall()
75{
76 // No live values in registers (everything is on the stack) so never anything
77 // to preserve.
78 return new std::vector<ManagedRegister>();
79}
80
Carl Shapiroe2d373e2011-07-25 15:20:06 -070081bool JniCallingConvention::IsOutArgRegister(ManagedRegister) {
82 return false; // Everything is passed by stack
83}
84
Ian Rogersb033c752011-07-20 12:22:35 -070085bool JniCallingConvention::IsCurrentParamInRegister() {
86 return false; // Everything is passed by stack
87}
88
89bool JniCallingConvention::IsCurrentParamOnStack() {
90 return true; // Everything is passed by stack
91}
92
93ManagedRegister JniCallingConvention::CurrentParamRegister() {
94 LOG(FATAL) << "Should not reach here";
95 return ManagedRegister::NoRegister();
96}
97
98FrameOffset JniCallingConvention::CurrentParamStackOffset() {
Ian Rogersb033c752011-07-20 12:22:35 -070099 return FrameOffset(displacement_.Int32Value() - OutArgSize() +
Shih-wei Liao5381cf92011-07-27 00:28:04 -0700100 (itr_slots_ * kPointerSize));
Ian Rogersb033c752011-07-20 12:22:35 -0700101}
102
103size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
104 return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs();
105}
106
107} // namespace art