1fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko/*
2fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Copyright (C) 2014 The Android Open Source Project
3fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
4fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Licensed under the Apache License, Version 2.0 (the "License");
5fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * you may not use this file except in compliance with the License.
6fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * You may obtain a copy of the License at
7fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
8fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *      http://www.apache.org/licenses/LICENSE-2.0
9fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko *
10fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * Unless required by applicable law or agreed to in writing, software
11fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * distributed under the License is distributed on an "AS IS" BASIS,
12fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * See the License for the specific language governing permissions and
14fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko * limitations under the License.
15fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko */
16fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
17fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#ifndef ART_COMPILER_JNI_QUICK_X86_64_CALLING_CONVENTION_X86_64_H_
18fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#define ART_COMPILER_JNI_QUICK_X86_64_CALLING_CONVENTION_X86_64_H_
19fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
20fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "jni/quick/calling_convention.h"
21fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
22fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace art {
23fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace x86_64 {
24fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
25790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 8;
26790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers
27fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoclass X86_64ManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention {
28fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko public:
293887c468d731420e929e6ad3acf190d5431e94fcRoland Levillain  X86_64ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty)
30790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers      : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {}
31fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ~X86_64ManagedRuntimeCallingConvention() OVERRIDE {}
32fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Calling convention
33fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnRegister() OVERRIDE;
34fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister InterproceduralScratchRegister() OVERRIDE;
35fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Managed runtime calling convention
36fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister MethodRegister() OVERRIDE;
37fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamInRegister() OVERRIDE;
38fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamOnStack() OVERRIDE;
39fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister CurrentParamRegister() OVERRIDE;
40fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  FrameOffset CurrentParamStackOffset() OVERRIDE;
41fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  const ManagedRegisterEntrySpills& EntrySpills() OVERRIDE;
42fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko private:
43fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegisterEntrySpills entry_spills_;
44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  DISALLOW_COPY_AND_ASSIGN(X86_64ManagedRuntimeCallingConvention);
45fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko};
46fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
47fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoclass X86_64JniCallingConvention FINAL : public JniCallingConvention {
48fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko public:
493887c468d731420e929e6ad3acf190d5431e94fcRoland Levillain  X86_64JniCallingConvention(bool is_static, bool is_synchronized, const char* shorty);
50fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ~X86_64JniCallingConvention() OVERRIDE {}
51fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Calling convention
52fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnRegister() OVERRIDE;
53fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister IntReturnRegister() OVERRIDE;
54fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister InterproceduralScratchRegister() OVERRIDE;
55fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // JNI calling convention
56fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t FrameSize() OVERRIDE;
57fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t OutArgSize() OVERRIDE;
58fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  const std::vector<ManagedRegister>& CalleeSaveRegisters() const OVERRIDE {
59fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko    return callee_save_regs_;
60fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  }
61fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnScratchRegister() const OVERRIDE;
62fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  uint32_t CoreSpillMask() const OVERRIDE;
63c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov  uint32_t FpSpillMask() const OVERRIDE;
64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamInRegister() OVERRIDE;
65fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamOnStack() OVERRIDE;
66fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister CurrentParamRegister() OVERRIDE;
67fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  FrameOffset CurrentParamStackOffset() OVERRIDE;
68fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
69d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // x86-64 needs to extend small return types.
70d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  bool RequiresSmallResultTypeExtension() const OVERRIDE {
71d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    return true;
72d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  }
73d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
74fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko protected:
75fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t NumberOfOutgoingStackArgs() OVERRIDE;
76fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
77fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko private:
78fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // TODO: these values aren't unique and can be shared amongst instances
79fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  std::vector<ManagedRegister> callee_save_regs_;
80fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
81fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  DISALLOW_COPY_AND_ASSIGN(X86_64JniCallingConvention);
82fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko};
83fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
84fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko}  // namespace x86_64
85fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko}  // namespace art
86fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
87fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#endif  // ART_COMPILER_JNI_QUICK_X86_64_CALLING_CONVENTION_X86_64_H_
88