17fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao/* 27fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Copyright (C) 2011 The Android Open Source Project 37fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 47fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 57fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * you may not use this file except in compliance with the License. 67fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * You may obtain a copy of the License at 77fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 87fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * http://www.apache.org/licenses/LICENSE-2.0 97fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * 107fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * Unless required by applicable law or agreed to in writing, software 117fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * distributed under the License is distributed on an "AS IS" BASIS, 127fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * See the License for the specific language governing permissions and 147fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao * limitations under the License. 157fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao */ 167fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_COMPILER_JNI_QUICK_MIPS_CALLING_CONVENTION_MIPS_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_COMPILER_JNI_QUICK_MIPS_CALLING_CONVENTION_MIPS_H_ 197fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 207940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "jni/quick/calling_convention.h" 217fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 227fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace art { 237fbee0731b14b5bf392a4254f5cd84685ab517dajeffhaonamespace mips { 24790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 25790a6b7312979513710c366b411ba6791ddf78c2Ian Rogersconstexpr size_t kFramePointerSize = 4; 26790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers 2725ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampeclass MipsManagedRuntimeCallingConvention FINAL : public ManagedRuntimeCallingConvention { 287fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 297fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao MipsManagedRuntimeCallingConvention(bool is_static, bool is_synchronized, const char* shorty) 30790a6b7312979513710c366b411ba6791ddf78c2Ian Rogers : ManagedRuntimeCallingConvention(is_static, is_synchronized, shorty, kFramePointerSize) {} 3125ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ~MipsManagedRuntimeCallingConvention() OVERRIDE {} 327fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Calling convention 3325ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister ReturnRegister() OVERRIDE; 3425ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister InterproceduralScratchRegister() OVERRIDE; 357fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Managed runtime calling convention 3625ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister MethodRegister() OVERRIDE; 3725ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe bool IsCurrentParamInRegister() OVERRIDE; 3825ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe bool IsCurrentParamOnStack() OVERRIDE; 3925ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister CurrentParamRegister() OVERRIDE; 4025ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe FrameOffset CurrentParamStackOffset() OVERRIDE; 41fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko const ManagedRegisterEntrySpills& EntrySpills() OVERRIDE; 427fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 437fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 44fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko ManagedRegisterEntrySpills entry_spills_; 457fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 467fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DISALLOW_COPY_AND_ASSIGN(MipsManagedRuntimeCallingConvention); 477fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 487fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 4925ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampeclass MipsJniCallingConvention FINAL : public JniCallingConvention { 507fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao public: 513887c468d731420e929e6ad3acf190d5431e94fcRoland Levillain MipsJniCallingConvention(bool is_static, bool is_synchronized, const char* shorty); 5225ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ~MipsJniCallingConvention() OVERRIDE {} 537fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Calling convention 5425ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister ReturnRegister() OVERRIDE; 5525ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister IntReturnRegister() OVERRIDE; 5625ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister InterproceduralScratchRegister() OVERRIDE; 577fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // JNI calling convention 5825ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe void Next() OVERRIDE; // Override default behavior for AAPCS 5925ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe size_t FrameSize() OVERRIDE; 6025ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe size_t OutArgSize() OVERRIDE; 6125ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe const std::vector<ManagedRegister>& CalleeSaveRegisters() const OVERRIDE { 627fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return callee_save_regs_; 637fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 6425ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister ReturnScratchRegister() const OVERRIDE; 6525ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe uint32_t CoreSpillMask() const OVERRIDE; 6625ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe uint32_t FpSpillMask() const OVERRIDE { 677fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao return 0; // Floats aren't spilled in JNI down call 687fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao } 6925ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe bool IsCurrentParamInRegister() OVERRIDE; 7025ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe bool IsCurrentParamOnStack() OVERRIDE; 7125ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe ManagedRegister CurrentParamRegister() OVERRIDE; 7225ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe FrameOffset CurrentParamStackOffset() OVERRIDE; 737fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 74d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe // Mips does not need to extend small return types. 75d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe bool RequiresSmallResultTypeExtension() const OVERRIDE { 76d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe return false; 77d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe } 78d1104322e5156669767e8b2c3b843ffaff173381Andreas Gampe 797fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao protected: 8025ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe size_t NumberOfOutgoingStackArgs() OVERRIDE; 817fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 827fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao private: 837fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // TODO: these values aren't unique and can be shared amongst instances 847fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao std::vector<ManagedRegister> callee_save_regs_; 857fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 867fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao // Padding to ensure longs and doubles are not split in AAPCS 877fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao size_t padding_; 887fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 897fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao DISALLOW_COPY_AND_ASSIGN(MipsJniCallingConvention); 907fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao}; 9125ff0048a70c79272884d5d0f8e9b9861a451afeAndreas Gampe 927fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace mips 937fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao} // namespace art 947fbee0731b14b5bf392a4254f5cd84685ab517dajeffhao 95fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_COMPILER_JNI_QUICK_MIPS_CALLING_CONVENTION_MIPS_H_ 96