blob: f1b96a64f25ebbcf62d64219c1a312497c604f42 [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() {
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() {
47 int num_slots = itr_position_ + itr_longs_and_doubles_;
48 return FrameOffset(displacement_.Int32Value() + (num_slots * kPointerSize));
49}
50
51// JNI calling convention
52
53bool JniCallingConvention::IsCurrentParamInRegister() {
54 return false; // Everything is passed by stack
55}
56
57bool JniCallingConvention::IsCurrentParamOnStack() {
58 return true; // Everything is passed by stack
59}
60
61ManagedRegister JniCallingConvention::CurrentParamRegister() {
62 LOG(FATAL) << "Should not reach here";
63 return ManagedRegister::NoRegister();
64}
65
66FrameOffset JniCallingConvention::CurrentParamStackOffset() {
67 int num_slots = itr_position_ + itr_longs_and_doubles_;
68 return FrameOffset(displacement_.Int32Value() - OutArgSize() +
69 (num_slots * kPointerSize));
70}
71
72size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
73 return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs();
74}
75
76} // namespace art