1f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic/* 2f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * Copyright (C) 2015 The Android Open Source Project 3f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * 4f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * Licensed under the Apache License, Version 2.0 (the "License"); 5f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * you may not use this file except in compliance with the License. 6f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * You may obtain a copy of the License at 7f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * 8f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * http://www.apache.org/licenses/LICENSE-2.0 9f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * 10f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * Unless required by applicable law or agreed to in writing, software 11f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * distributed under the License is distributed on an "AS IS" BASIS, 12f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * See the License for the specific language governing permissions and 14f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic * limitations under the License. 15f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic */ 16f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 17f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#ifndef ART_COMPILER_OPTIMIZING_CODE_GENERATOR_MIPS_H_ 18f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#define ART_COMPILER_OPTIMIZING_CODE_GENERATOR_MIPS_H_ 19f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 20f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "code_generator.h" 21f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "dex/compiler_enums.h" 22f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "driver/compiler_options.h" 23f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "nodes.h" 24f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "parallel_move_resolver.h" 25f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#include "utils/mips/assembler_mips.h" 26f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 27f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicnamespace art { 28f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicnamespace mips { 29f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 30f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic// InvokeDexCallingConvention registers 31f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 32f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr Register kParameterCoreRegisters[] = 33f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { A1, A2, A3 }; 34f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr size_t kParameterCoreRegistersLength = arraysize(kParameterCoreRegisters); 35f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 36f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr FRegister kParameterFpuRegisters[] = 37f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { F12, F14 }; 38f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr size_t kParameterFpuRegistersLength = arraysize(kParameterFpuRegisters); 39f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 40f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 41f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic// InvokeRuntimeCallingConvention registers 42f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 43f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr Register kRuntimeParameterCoreRegisters[] = 44f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { A0, A1, A2, A3 }; 45f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr size_t kRuntimeParameterCoreRegistersLength = 46f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic arraysize(kRuntimeParameterCoreRegisters); 47f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 48f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr FRegister kRuntimeParameterFpuRegisters[] = 49f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { F12, F14}; 50f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr size_t kRuntimeParameterFpuRegistersLength = 51f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic arraysize(kRuntimeParameterFpuRegisters); 52f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 53f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 54f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr Register kCoreCalleeSaves[] = 55f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { S0, S1, S2, S3, S4, S5, S6, S7, FP, RA }; 56f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicstatic constexpr FRegister kFpuCalleeSaves[] = 57f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic { F20, F22, F24, F26, F28, F30 }; 58f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 59f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 60f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass CodeGeneratorMIPS; 61f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 62f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass InvokeDexCallingConvention : public CallingConvention<Register, FRegister> { 63f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 64f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InvokeDexCallingConvention() 65f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : CallingConvention(kParameterCoreRegisters, 66f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kParameterCoreRegistersLength, 67f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kParameterFpuRegisters, 68f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kParameterFpuRegistersLength, 69f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kMipsPointerSize) {} 70f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 71f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 72f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConvention); 73f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 74f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 75f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass InvokeDexCallingConventionVisitorMIPS : public InvokeDexCallingConventionVisitor { 76f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 77f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InvokeDexCallingConventionVisitorMIPS() {} 78f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic virtual ~InvokeDexCallingConventionVisitorMIPS() {} 79f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 80f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetNextLocation(Primitive::Type type) OVERRIDE; 81f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetReturnLocation(Primitive::Type type) const OVERRIDE; 82f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetMethodLocation() const OVERRIDE; 83f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 84f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 85f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InvokeDexCallingConvention calling_convention; 86f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 87f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitorMIPS); 88f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 89f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 90f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass InvokeRuntimeCallingConvention : public CallingConvention<Register, FRegister> { 91f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 92f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InvokeRuntimeCallingConvention() 93f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : CallingConvention(kRuntimeParameterCoreRegisters, 94f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kRuntimeParameterCoreRegistersLength, 95f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kRuntimeParameterFpuRegisters, 96f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kRuntimeParameterFpuRegistersLength, 97f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic kMipsPointerSize) {} 98f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 99f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetReturnLocation(Primitive::Type return_type); 100f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 101f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 102f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(InvokeRuntimeCallingConvention); 103f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 104f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 105f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass FieldAccessCallingConventionMIPS : public FieldAccessCallingConvention { 106f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 107f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic FieldAccessCallingConventionMIPS() {} 108f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 109f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetObjectLocation() const OVERRIDE { 110f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return Location::RegisterLocation(A1); 111f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 112f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetFieldIndexLocation() const OVERRIDE { 113f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return Location::RegisterLocation(A0); 114f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 115f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetReturnLocation(Primitive::Type type) const OVERRIDE { 116f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return Primitive::Is64BitType(type) 117f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic ? Location::RegisterPairLocation(V0, V1) 118f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : Location::RegisterLocation(V0); 119f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 120f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetSetValueLocation(Primitive::Type type, bool is_instance) const OVERRIDE { 121f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return Primitive::Is64BitType(type) 122f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic ? Location::RegisterPairLocation(A2, A3) 123f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : (is_instance ? Location::RegisterLocation(A2) : Location::RegisterLocation(A1)); 124f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 125f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Location GetFpuLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE { 126f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return Location::FpuRegisterLocation(F0); 127f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 128f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 129f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 130f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConventionMIPS); 131f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 132f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 133f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass ParallelMoveResolverMIPS : public ParallelMoveResolverWithSwap { 134f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 135f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic ParallelMoveResolverMIPS(ArenaAllocator* allocator, CodeGeneratorMIPS* codegen) 136f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : ParallelMoveResolverWithSwap(allocator), codegen_(codegen) {} 137f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 138f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void EmitMove(size_t index) OVERRIDE; 139f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void EmitSwap(size_t index) OVERRIDE; 140f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void SpillScratch(int reg) OVERRIDE; 141f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void RestoreScratch(int reg) OVERRIDE; 142f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 143f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Exchange(int index1, int index2, bool double_slot); 144f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 145f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsAssembler* GetAssembler() const; 146f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 147f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 148f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic CodeGeneratorMIPS* const codegen_; 149f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 150f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(ParallelMoveResolverMIPS); 151f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 152f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 153f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass SlowPathCodeMIPS : public SlowPathCode { 154f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 1559cd6d378bd573cdc14d049d32bdd22a97fa4d84aDavid Srbecky explicit SlowPathCodeMIPS(HInstruction* instruction) 1569cd6d378bd573cdc14d049d32bdd22a97fa4d84aDavid Srbecky : SlowPathCode(instruction), entry_label_(), exit_label_() {} 157f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 158f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel* GetEntryLabel() { return &entry_label_; } 159f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel* GetExitLabel() { return &exit_label_; } 160f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 161f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 162f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel entry_label_; 163f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel exit_label_; 164f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 165f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(SlowPathCodeMIPS); 166f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 167f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 168f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass LocationsBuilderMIPS : public HGraphVisitor { 169f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 170f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic LocationsBuilderMIPS(HGraph* graph, CodeGeneratorMIPS* codegen) 171f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic : HGraphVisitor(graph), codegen_(codegen) {} 172f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 173f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#define DECLARE_VISIT_INSTRUCTION(name, super) \ 174f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Visit##name(H##name* instr) OVERRIDE; 175f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 176f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic FOR_EACH_CONCRETE_INSTRUCTION_COMMON(DECLARE_VISIT_INSTRUCTION) 177f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic FOR_EACH_CONCRETE_INSTRUCTION_MIPS(DECLARE_VISIT_INSTRUCTION) 178f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 179f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#undef DECLARE_VISIT_INSTRUCTION 180f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 181f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void VisitInstruction(HInstruction* instruction) OVERRIDE { 182f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic LOG(FATAL) << "Unreachable instruction " << instruction->DebugName() 183f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic << " (id " << instruction->GetId() << ")"; 184f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 185f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 186f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 187f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleInvoke(HInvoke* invoke); 188f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleBinaryOp(HBinaryOperation* operation); 1895f7b58ea1adfc0639dd605b65f59198d3763f801Vladimir Marko void HandleCondition(HCondition* instruction); 190f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleShift(HBinaryOperation* operation); 191f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleFieldSet(HInstruction* instruction, const FieldInfo& field_info); 192f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info); 193f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 194f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InvokeDexCallingConventionVisitorMIPS parameter_visitor_; 195f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 196f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic CodeGeneratorMIPS* const codegen_; 197f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 198f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(LocationsBuilderMIPS); 199f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 200f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 20142249c3602c3d0243396ee3627ffb5906aa77c1eAart Bikclass InstructionCodeGeneratorMIPS : public InstructionCodeGenerator { 202f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 203f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InstructionCodeGeneratorMIPS(HGraph* graph, CodeGeneratorMIPS* codegen); 204f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 205f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#define DECLARE_VISIT_INSTRUCTION(name, super) \ 206f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Visit##name(H##name* instr) OVERRIDE; 207f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 208f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic FOR_EACH_CONCRETE_INSTRUCTION_COMMON(DECLARE_VISIT_INSTRUCTION) 209f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic FOR_EACH_CONCRETE_INSTRUCTION_MIPS(DECLARE_VISIT_INSTRUCTION) 210f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 211f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#undef DECLARE_VISIT_INSTRUCTION 212f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 213f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void VisitInstruction(HInstruction* instruction) OVERRIDE { 214f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic LOG(FATAL) << "Unreachable instruction " << instruction->DebugName() 215f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic << " (id " << instruction->GetId() << ")"; 216f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 217f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 218f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsAssembler* GetAssembler() const { return assembler_; } 219f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 220f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 221f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateClassInitializationCheck(SlowPathCodeMIPS* slow_path, Register class_reg); 222f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateMemoryBarrier(MemBarrierKind kind); 223f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateSuspendCheck(HSuspendCheck* check, HBasicBlock* successor); 224f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleBinaryOp(HBinaryOperation* operation); 2255f7b58ea1adfc0639dd605b65f59198d3763f801Vladimir Marko void HandleCondition(HCondition* instruction); 226f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleShift(HBinaryOperation* operation); 227f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleFieldSet(HInstruction* instruction, const FieldInfo& field_info, uint32_t dex_pc); 228f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info, uint32_t dex_pc); 229cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze void GenerateIntCompare(IfCondition cond, LocationSummary* locations); 230cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze void GenerateIntCompareAndBranch(IfCondition cond, 231cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze LocationSummary* locations, 232cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze MipsLabel* label); 233cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze void GenerateLongCompareAndBranch(IfCondition cond, 234cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze LocationSummary* locations, 235cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze MipsLabel* label); 236cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze void GenerateFpCompareAndBranch(IfCondition cond, 237cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze bool gt_bias, 238cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze Primitive::Type type, 239cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze LocationSummary* locations, 240cd7b0ee296b0462961c63e51d99c9c323e2690dfAlexey Frunze MipsLabel* label); 241f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateTestAndBranch(HInstruction* instruction, 2420debae7bc89eb05f7a2bf7dccd223318fad7c88dDavid Brazdil size_t condition_input_index, 243f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel* true_target, 2440debae7bc89eb05f7a2bf7dccd223318fad7c88dDavid Brazdil MipsLabel* false_target); 2457e99e054d023af878d6632bc8c8ba07357ded294Alexey Frunze void DivRemOneOrMinusOne(HBinaryOperation* instruction); 2467e99e054d023af878d6632bc8c8ba07357ded294Alexey Frunze void DivRemByPowerOfTwo(HBinaryOperation* instruction); 2477e99e054d023af878d6632bc8c8ba07357ded294Alexey Frunze void GenerateDivRemWithAnyConstant(HBinaryOperation* instruction); 2487e99e054d023af878d6632bc8c8ba07357ded294Alexey Frunze void GenerateDivRemIntegral(HBinaryOperation* instruction); 249f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void HandleGoto(HInstruction* got, HBasicBlock* successor); 250f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 251f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsAssembler* const assembler_; 252f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic CodeGeneratorMIPS* const codegen_; 253f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 254f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(InstructionCodeGeneratorMIPS); 255f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 256f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 257f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevicclass CodeGeneratorMIPS : public CodeGenerator { 258f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic public: 259f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic CodeGeneratorMIPS(HGraph* graph, 260f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic const MipsInstructionSetFeatures& isa_features, 261f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic const CompilerOptions& compiler_options, 262f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic OptimizingCompilerStats* stats = nullptr); 263f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic virtual ~CodeGeneratorMIPS() {} 264f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 265f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateFrameEntry() OVERRIDE; 266f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateFrameExit() OVERRIDE; 267f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 268f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Bind(HBasicBlock* block) OVERRIDE; 269f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 270f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Move32(Location destination, Location source); 271f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Move64(Location destination, Location source); 272f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void MoveConstant(Location location, HConstant* c); 273f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 274f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t GetWordSize() const OVERRIDE { return kMipsWordSize; } 275f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 276f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t GetFloatingPointSpillSlotSize() const OVERRIDE { return kMipsDoublewordSize; } 277f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 278c393d63aa2b8f6984672fdd4de631bbeff14b6a2Alexandre Rames uintptr_t GetAddressOf(HBasicBlock* block) OVERRIDE { 279f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return assembler_.GetLabelLocation(GetLabelOf(block)); 280f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 281f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 282f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic HGraphVisitor* GetLocationBuilder() OVERRIDE { return &location_builder_; } 283f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic HGraphVisitor* GetInstructionVisitor() OVERRIDE { return &instruction_visitor_; } 284f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsAssembler* GetAssembler() OVERRIDE { return &assembler_; } 285f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic const MipsAssembler& GetAssembler() const OVERRIDE { return assembler_; } 286f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 287f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void MarkGCCard(Register object, Register value); 288f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 289f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic // Register allocation. 290f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 29158282f4510961317b8d5a364a6f740a78926716fDavid Brazdil void SetupBlockedRegisters() const OVERRIDE; 292f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 293f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t SaveCoreRegister(size_t stack_index, uint32_t reg_id); 294f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t RestoreCoreRegister(size_t stack_index, uint32_t reg_id); 295f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t SaveFloatingPointRegister(size_t stack_index, uint32_t reg_id); 296f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic size_t RestoreFloatingPointRegister(size_t stack_index, uint32_t reg_id); 297f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 298f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void DumpCoreRegister(std::ostream& stream, int reg) const OVERRIDE; 299f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void DumpFloatingPointRegister(std::ostream& stream, int reg) const OVERRIDE; 300f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 301f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic // Blocks all register pairs made out of blocked core registers. 302f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void UpdateBlockedPairRegisters() const; 303f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 304f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InstructionSet GetInstructionSet() const OVERRIDE { return InstructionSet::kMips; } 305f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 306f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic const MipsInstructionSetFeatures& GetInstructionSetFeatures() const { 307f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return isa_features_; 308f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 309f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 310f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel* GetLabelOf(HBasicBlock* block) const { 311f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return CommonGetLabelOf<MipsLabel>(block_labels_, block); 312f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 313f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 314f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Initialize() OVERRIDE { 315f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic block_labels_ = CommonInitializeLabels<MipsLabel>(); 316f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 317f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 318f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void Finalize(CodeAllocator* allocator) OVERRIDE; 319f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 320f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic // Code generation helpers. 321f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 322f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void MoveLocation(Location dst, Location src, Primitive::Type dst_type) OVERRIDE; 323f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 324f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void MoveConstant(Location destination, int32_t value); 325f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 326f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE; 327f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 328f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic // Generate code to invoke a runtime entry point. 329f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void InvokeRuntime(QuickEntrypointEnum entrypoint, 330f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic HInstruction* instruction, 331f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic uint32_t dex_pc, 332f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic SlowPathCode* slow_path) OVERRIDE; 333f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 334f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void InvokeRuntime(int32_t offset, 335f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic HInstruction* instruction, 336f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic uint32_t dex_pc, 337f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic SlowPathCode* slow_path, 338f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic bool is_direct_entrypoint); 339f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 340f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic ParallelMoveResolver* GetMoveResolver() OVERRIDE { return &move_resolver_; } 341f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 342f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic bool NeedsTwoRegisters(Primitive::Type type) const { 343f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic return type == Primitive::kPrimLong; 344f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 345f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 346cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // Check if the desired_string_load_kind is supported. If it is, return it, 347cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko // otherwise return a fall-back kind that should be used instead. 348cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko HLoadString::LoadKind GetSupportedLoadStringKind( 349cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko HLoadString::LoadKind desired_string_load_kind) OVERRIDE; 350cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko 351dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko // Check if the desired_dispatch_info is supported. If it is, return it, 352dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko // otherwise return a fall-back info that should be used instead. 353dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko HInvokeStaticOrDirect::DispatchInfo GetSupportedInvokeStaticOrDirectDispatch( 354dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko const HInvokeStaticOrDirect::DispatchInfo& desired_dispatch_info, 355dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko MethodReference target_method) OVERRIDE; 356dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko 357f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void GenerateStaticOrDirectCall(HInvokeStaticOrDirect* invoke, Location temp); 3583acee732f9475fbfc6b046e0044b764e7ff5ac01Chris Larsen void GenerateVirtualCall(HInvokeVirtual* invoke, Location temp) OVERRIDE; 359f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 360f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic void MoveFromReturnRegister(Location trg ATTRIBUTE_UNUSED, 361f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic Primitive::Type type ATTRIBUTE_UNUSED) OVERRIDE { 362f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic UNIMPLEMENTED(FATAL) << "Not implemented on MIPS"; 363f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic } 364f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 365c7098ff991bb4e00a800d315d1c36f52a9cb0149David Srbecky void GenerateNop(); 3662ae48182573da7087bffc2873730bc758ec29696Calin Juravle void GenerateImplicitNullCheck(HNullCheck* instruction); 3672ae48182573da7087bffc2873730bc758ec29696Calin Juravle void GenerateExplicitNullCheck(HNullCheck* instruction); 368c7098ff991bb4e00a800d315d1c36f52a9cb0149David Srbecky 369f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic private: 370f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic // Labels for each block that will be compiled. 371f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel* block_labels_; 372f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsLabel frame_entry_label_; 373f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic LocationsBuilderMIPS location_builder_; 374f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic InstructionCodeGeneratorMIPS instruction_visitor_; 375f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic ParallelMoveResolverMIPS move_resolver_; 376f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic MipsAssembler assembler_; 377f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic const MipsInstructionSetFeatures& isa_features_; 378f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 379f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic DISALLOW_COPY_AND_ASSIGN(CodeGeneratorMIPS); 380f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic}; 381f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 382f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic} // namespace mips 383f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic} // namespace art 384f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic 385f652cecb984c104d44a0223c3c98400ef8ed8ce2Goran Jakovljevic#endif // ART_COMPILER_OPTIMIZING_CODE_GENERATOR_MIPS_H_ 386