blob: d245d81833d1c5913363f7994c8e6dd1b3a0e5f1 [file] [log] [blame]
Ian Rogersb033c752011-07-20 12:22:35 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2// Author: irogers@google.com (Ian Rogers)
3
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07004#include "calling_convention.h"
5#include "logging.h"
6#include "utils.h"
Ian Rogersb033c752011-07-20 12:22:35 -07007
8namespace art {
9
10ManagedRegister CallingConvention::MethodRegister() {
11 return ManagedRegister::FromCpuRegister(EDI);
12}
13
14ManagedRegister CallingConvention::InterproceduralScratchRegister() {
15 return ManagedRegister::FromCpuRegister(ECX);
16}
17
18ManagedRegister CallingConvention::ReturnRegister() {
Ian Rogers45a76cb2011-07-21 22:00:15 -070019 const Method *method = GetMethod();
20 if (method->IsReturnAFloatOrDouble()) {
Ian Rogersb033c752011-07-20 12:22:35 -070021 return ManagedRegister::FromX87Register(ST0);
Ian Rogers45a76cb2011-07-21 22:00:15 -070022 } else if (method->IsReturnALong()) {
Ian Rogersb033c752011-07-20 12:22:35 -070023 return ManagedRegister::FromRegisterPair(EAX_EDX);
Ian Rogers45a76cb2011-07-21 22:00:15 -070024 } else if (method->IsReturnVoid()) {
25 return ManagedRegister::NoRegister();
Ian Rogersb033c752011-07-20 12:22:35 -070026 } else {
27 return ManagedRegister::FromCpuRegister(EAX);
28 }
29}
30
31// Managed runtime calling convention
32
33bool ManagedRuntimeCallingConvention::IsCurrentParamInRegister() {
34 return false; // Everything is passed by stack
35}
36
37bool ManagedRuntimeCallingConvention::IsCurrentParamOnStack() {
38 return true; // Everything is passed by stack
39}
40
41ManagedRegister ManagedRuntimeCallingConvention::CurrentParamRegister() {
42 LOG(FATAL) << "Should not reach here";
43 return ManagedRegister::NoRegister();
44}
45
46FrameOffset ManagedRuntimeCallingConvention::CurrentParamStackOffset() {
Shih-wei Liao5381cf92011-07-27 00:28:04 -070047 return FrameOffset(displacement_.Int32Value() + (itr_slots_ * kPointerSize));
Ian Rogersb033c752011-07-20 12:22:35 -070048}
49
50// JNI calling convention
51
Carl Shapiroe2d373e2011-07-25 15:20:06 -070052bool JniCallingConvention::IsOutArgRegister(ManagedRegister) {
53 return false; // Everything is passed by stack
54}
55
Ian Rogersb033c752011-07-20 12:22:35 -070056bool JniCallingConvention::IsCurrentParamInRegister() {
57 return false; // Everything is passed by stack
58}
59
60bool JniCallingConvention::IsCurrentParamOnStack() {
61 return true; // Everything is passed by stack
62}
63
64ManagedRegister JniCallingConvention::CurrentParamRegister() {
65 LOG(FATAL) << "Should not reach here";
66 return ManagedRegister::NoRegister();
67}
68
69FrameOffset JniCallingConvention::CurrentParamStackOffset() {
Ian Rogersb033c752011-07-20 12:22:35 -070070 return FrameOffset(displacement_.Int32Value() - OutArgSize() +
Shih-wei Liao5381cf92011-07-27 00:28:04 -070071 (itr_slots_ * kPointerSize));
Ian Rogersb033c752011-07-20 12:22:35 -070072}
73
74size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
75 return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs();
76}
77
78} // namespace art