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