blob: 2d9b07fd545b1eb1aec3687cc6ef0ff26e6ef6a1 [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() {
Shih-wei Liao5381cf92011-07-27 00:28:04 -070046 return FrameOffset(displacement_.Int32Value() + (itr_slots_ * kPointerSize));
Ian Rogersb033c752011-07-20 12:22:35 -070047}
48
49// JNI calling convention
50
Carl Shapiroe2d373e2011-07-25 15:20:06 -070051bool JniCallingConvention::IsOutArgRegister(ManagedRegister) {
52 return false; // Everything is passed by stack
53}
54
Ian Rogersb033c752011-07-20 12:22:35 -070055bool JniCallingConvention::IsCurrentParamInRegister() {
56 return false; // Everything is passed by stack
57}
58
59bool JniCallingConvention::IsCurrentParamOnStack() {
60 return true; // Everything is passed by stack
61}
62
63ManagedRegister JniCallingConvention::CurrentParamRegister() {
64 LOG(FATAL) << "Should not reach here";
65 return ManagedRegister::NoRegister();
66}
67
68FrameOffset JniCallingConvention::CurrentParamStackOffset() {
Ian Rogersb033c752011-07-20 12:22:35 -070069 return FrameOffset(displacement_.Int32Value() - OutArgSize() +
Shih-wei Liao5381cf92011-07-27 00:28:04 -070070 (itr_slots_ * kPointerSize));
Ian Rogersb033c752011-07-20 12:22:35 -070071}
72
73size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
74 return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs();
75}
76
77} // namespace art