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