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
20542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe#include "base/enums.h"
21fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko#include "jni/quick/calling_convention.h"
22fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
23fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace art {
24fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkonamespace x86_64 {
25fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
26fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoclass X86_64ManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention {
27fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko public:
283887c468d731420e929e6ad3acf190d5431e94fcRoland Levillain  X86_64ManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty)
29542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe      : ManagedRuntimeCallingConvention(is_static,
30542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe                                        is_synchronized,
31542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe                                        shorty,
32542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe                                        PointerSize::k64) {}
33fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ~X86_64ManagedRuntimeCallingConvention() OVERRIDE {}
34fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Calling convention
35fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnRegister() OVERRIDE;
36fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister InterproceduralScratchRegister() OVERRIDE;
37fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Managed runtime calling convention
38fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister MethodRegister() OVERRIDE;
39fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamInRegister() OVERRIDE;
40fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamOnStack() OVERRIDE;
41fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister CurrentParamRegister() OVERRIDE;
42fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  FrameOffset CurrentParamStackOffset() OVERRIDE;
43fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  const ManagedRegisterEntrySpills& EntrySpills() OVERRIDE;
44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko private:
45fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegisterEntrySpills entry_spills_;
46fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  DISALLOW_COPY_AND_ASSIGN(X86_64ManagedRuntimeCallingConvention);
47fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko};
48fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
49fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenkoclass X86_64JniCallingConvention FINAL : public JniCallingConvention {
50fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko public:
51367f3dd32454858b8b25d87feb8f6599d3b4c9ddIgor Murashkin  X86_64JniCallingConvention(bool is_static,
52367f3dd32454858b8b25d87feb8f6599d3b4c9ddIgor Murashkin                             bool is_synchronized,
53367f3dd32454858b8b25d87feb8f6599d3b4c9ddIgor Murashkin                             bool is_critical_native,
54367f3dd32454858b8b25d87feb8f6599d3b4c9ddIgor Murashkin                             const char* shorty);
55fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ~X86_64JniCallingConvention() OVERRIDE {}
56fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // Calling convention
57fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnRegister() OVERRIDE;
58fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister IntReturnRegister() OVERRIDE;
59fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister InterproceduralScratchRegister() OVERRIDE;
60fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  // JNI calling convention
61fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t FrameSize() OVERRIDE;
62fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t OutArgSize() OVERRIDE;
633224838dfe9c95330ad963286f2c47e9546d3b5cVladimir Marko  ArrayRef<const ManagedRegister> CalleeSaveRegisters() const OVERRIDE;
64fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister ReturnScratchRegister() const OVERRIDE;
65fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  uint32_t CoreSpillMask() const OVERRIDE;
66c380191f3048db2a3796d65db8e5d5a5e7b08c65Serguei Katkov  uint32_t FpSpillMask() const OVERRIDE;
67fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamInRegister() OVERRIDE;
68fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  bool IsCurrentParamOnStack() OVERRIDE;
69fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  ManagedRegister CurrentParamRegister() OVERRIDE;
70fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  FrameOffset CurrentParamStackOffset() OVERRIDE;
71fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
72d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  // x86-64 needs to extend small return types.
73d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  bool RequiresSmallResultTypeExtension() const OVERRIDE {
74d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe    return true;
75d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe  }
76d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe
77fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko protected:
78fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko  size_t NumberOfOutgoingStackArgs() OVERRIDE;
79fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko
80fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko private:
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