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