blob: a72f36115a44152371c92b2128052006a2eee54e [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
4#include "src/calling_convention.h"
5#include "src/logging.h"
6#include "src/utils.h"
7
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() {
19 if (GetMethod()->IsReturnAFloatOrDouble()) {
20 return ManagedRegister::FromX87Register(ST0);
21 } else if (GetMethod()->IsReturnALong()) {
22 return ManagedRegister::FromRegisterPair(EAX_EDX);
23 } else {
24 return ManagedRegister::FromCpuRegister(EAX);
25 }
26}
27
28// Managed runtime calling convention
29
30bool ManagedRuntimeCallingConvention::IsCurrentParamInRegister() {
31 return false; // Everything is passed by stack
32}
33
34bool ManagedRuntimeCallingConvention::IsCurrentParamOnStack() {
35 return true; // Everything is passed by stack
36}
37
38ManagedRegister ManagedRuntimeCallingConvention::CurrentParamRegister() {
39 LOG(FATAL) << "Should not reach here";
40 return ManagedRegister::NoRegister();
41}
42
43FrameOffset ManagedRuntimeCallingConvention::CurrentParamStackOffset() {
44 int num_slots = itr_position_ + itr_longs_and_doubles_;
45 return FrameOffset(displacement_.Int32Value() + (num_slots * kPointerSize));
46}
47
48// JNI calling convention
49
50bool JniCallingConvention::IsCurrentParamInRegister() {
51 return false; // Everything is passed by stack
52}
53
54bool JniCallingConvention::IsCurrentParamOnStack() {
55 return true; // Everything is passed by stack
56}
57
58ManagedRegister JniCallingConvention::CurrentParamRegister() {
59 LOG(FATAL) << "Should not reach here";
60 return ManagedRegister::NoRegister();
61}
62
63FrameOffset JniCallingConvention::CurrentParamStackOffset() {
64 int num_slots = itr_position_ + itr_longs_and_doubles_;
65 return FrameOffset(displacement_.Int32Value() - OutArgSize() +
66 (num_slots * kPointerSize));
67}
68
69size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
70 return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs();
71}
72
73} // namespace art