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