blob: 168b462783d8c7f102e49524c0740934d247703f [file] [log] [blame]
buzbeee3acd072012-02-25 17:03:10 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
buzbee1bc37c62012-11-20 13:35:41 -080017#include "mips_lir.h"
18#include "../codegen_util.h"
19#include "../ralloc_util.h"
20
buzbeee3acd072012-02-25 17:03:10 -080021namespace art {
22
buzbeeb046e162012-10-30 15:48:42 -070023/* This file contains codegen for the MIPS32 ISA. */
buzbeee3acd072012-02-25 17:03:10 -080024
buzbeefa57c472012-11-21 12:06:18 -080025void GenBarrier(CompilationUnit *cu);
26void LoadPair(CompilationUnit *cu, int base, int low_reg, int high_reg);
27LIR *LoadWordDisp(CompilationUnit *cu, int rBase, int displacement,
28 int r_dest);
29LIR *StoreWordDisp(CompilationUnit *cu, int rBase,
30 int displacement, int r_src);
31LIR *LoadConstant(CompilationUnit *cu, int r_dest, int value);
buzbeee3acd072012-02-25 17:03:10 -080032
33#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -080034LIR *FpRegCopy(CompilationUnit *cu, int r_dest, int r_src)
buzbeee3acd072012-02-25 17:03:10 -080035{
Bill Buzbeea114add2012-05-03 15:00:40 -070036 int opcode;
37 /* must be both DOUBLE or both not DOUBLE */
buzbeefa57c472012-11-21 12:06:18 -080038 DCHECK_EQ(MIPS_DOUBLEREG(r_dest),MIPS_DOUBLEREG(r_src));
39 if (MIPS_DOUBLEREG(r_dest)) {
Bill Buzbeea114add2012-05-03 15:00:40 -070040 opcode = kMipsFmovd;
41 } else {
buzbeefa57c472012-11-21 12:06:18 -080042 if (MIPS_SINGLEREG(r_dest)) {
43 if (MIPS_SINGLEREG(r_src)) {
Bill Buzbeea114add2012-05-03 15:00:40 -070044 opcode = kMipsFmovs;
45 } else {
46 /* note the operands are swapped for the mtc1 instr */
buzbeefa57c472012-11-21 12:06:18 -080047 int t_opnd = r_src;
48 r_src = r_dest;
49 r_dest = t_opnd;
Bill Buzbeea114add2012-05-03 15:00:40 -070050 opcode = kMipsMtc1;
51 }
buzbeee3acd072012-02-25 17:03:10 -080052 } else {
buzbeefa57c472012-11-21 12:06:18 -080053 DCHECK(MIPS_SINGLEREG(r_src));
Bill Buzbeea114add2012-05-03 15:00:40 -070054 opcode = kMipsMfc1;
buzbeee3acd072012-02-25 17:03:10 -080055 }
Bill Buzbeea114add2012-05-03 15:00:40 -070056 }
buzbeefa57c472012-11-21 12:06:18 -080057 LIR* res = RawLIR(cu, cu->current_dalvik_offset, opcode, r_src, r_dest);
58 if (!(cu->disable_opt & (1 << kSafeOptimizations)) && r_dest == r_src) {
59 res->flags.is_nop = true;
Bill Buzbeea114add2012-05-03 15:00:40 -070060 }
61 return res;
buzbeee3acd072012-02-25 17:03:10 -080062}
63#endif
64
65/*
66 * Load a immediate using a shortcut if possible; otherwise
67 * grab from the per-translation literal pool. If target is
68 * a high register, build constant into a low register and copy.
69 *
70 * No additional register clobbering operation performed. Use this version when
buzbeefa57c472012-11-21 12:06:18 -080071 * 1) r_dest is freshly returned from AllocTemp or
buzbeee3acd072012-02-25 17:03:10 -080072 * 2) The codegen is under fixed register usage
73 */
buzbeefa57c472012-11-21 12:06:18 -080074LIR *LoadConstantNoClobber(CompilationUnit *cu, int r_dest, int value)
buzbeee3acd072012-02-25 17:03:10 -080075{
Bill Buzbeea114add2012-05-03 15:00:40 -070076 LIR *res;
buzbeee3acd072012-02-25 17:03:10 -080077
78#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -080079 int r_dest_save = r_dest;
80 int is_fp_reg = MIPS_FPREG(r_dest);
81 if (is_fp_reg) {
82 DCHECK(MIPS_SINGLEREG(r_dest));
83 r_dest = AllocTemp(cu);
Bill Buzbeea114add2012-05-03 15:00:40 -070084 }
buzbeee3acd072012-02-25 17:03:10 -080085#endif
86
Bill Buzbeea114add2012-05-03 15:00:40 -070087 /* See if the value can be constructed cheaply */
88 if (value == 0) {
buzbeefa57c472012-11-21 12:06:18 -080089 res = NewLIR2(cu, kMipsMove, r_dest, r_ZERO);
Bill Buzbeea114add2012-05-03 15:00:40 -070090 } else if ((value > 0) && (value <= 65535)) {
buzbeefa57c472012-11-21 12:06:18 -080091 res = NewLIR3(cu, kMipsOri, r_dest, r_ZERO, value);
Bill Buzbeea114add2012-05-03 15:00:40 -070092 } else if ((value < 0) && (value >= -32768)) {
buzbeefa57c472012-11-21 12:06:18 -080093 res = NewLIR3(cu, kMipsAddiu, r_dest, r_ZERO, value);
Bill Buzbeea114add2012-05-03 15:00:40 -070094 } else {
buzbeefa57c472012-11-21 12:06:18 -080095 res = NewLIR2(cu, kMipsLui, r_dest, value>>16);
Bill Buzbeea114add2012-05-03 15:00:40 -070096 if (value & 0xffff)
buzbeefa57c472012-11-21 12:06:18 -080097 NewLIR3(cu, kMipsOri, r_dest, r_dest, value);
Bill Buzbeea114add2012-05-03 15:00:40 -070098 }
buzbeee3acd072012-02-25 17:03:10 -080099
100#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800101 if (is_fp_reg) {
102 NewLIR2(cu, kMipsMtc1, r_dest, r_dest_save);
103 FreeTemp(cu, r_dest);
Bill Buzbeea114add2012-05-03 15:00:40 -0700104 }
buzbeee3acd072012-02-25 17:03:10 -0800105#endif
106
Bill Buzbeea114add2012-05-03 15:00:40 -0700107 return res;
buzbeee3acd072012-02-25 17:03:10 -0800108}
109
buzbeefa57c472012-11-21 12:06:18 -0800110LIR *OpBranchUnconditional(CompilationUnit *cu, OpKind op)
buzbeee3acd072012-02-25 17:03:10 -0800111{
Bill Buzbeea114add2012-05-03 15:00:40 -0700112 DCHECK_EQ(op, kOpUncondBr);
buzbeefa57c472012-11-21 12:06:18 -0800113 return NewLIR1(cu, kMipsB, 0 /* offset to be patched */ );
buzbeee3acd072012-02-25 17:03:10 -0800114}
115
buzbeefa57c472012-11-21 12:06:18 -0800116LIR *LoadMultiple(CompilationUnit *cu, int rBase, int r_mask);
buzbeee3acd072012-02-25 17:03:10 -0800117
buzbeefa57c472012-11-21 12:06:18 -0800118LIR *OpReg(CompilationUnit *cu, OpKind op, int r_dest_src)
buzbeee3acd072012-02-25 17:03:10 -0800119{
Bill Buzbeea114add2012-05-03 15:00:40 -0700120 MipsOpCode opcode = kMipsNop;
121 switch (op) {
122 case kOpBlx:
123 opcode = kMipsJalr;
124 break;
125 case kOpBx:
buzbeefa57c472012-11-21 12:06:18 -0800126 return NewLIR1(cu, kMipsJr, r_dest_src);
Bill Buzbeea114add2012-05-03 15:00:40 -0700127 break;
128 default:
buzbee52a77fc2012-11-20 19:50:46 -0800129 LOG(FATAL) << "Bad case in OpReg";
Bill Buzbeea114add2012-05-03 15:00:40 -0700130 }
buzbeefa57c472012-11-21 12:06:18 -0800131 return NewLIR2(cu, opcode, r_RA, r_dest_src);
buzbeee3acd072012-02-25 17:03:10 -0800132}
133
buzbeefa57c472012-11-21 12:06:18 -0800134LIR *OpRegRegImm(CompilationUnit *cu, OpKind op, int r_dest,
135 int r_src1, int value);
136LIR *OpRegImm(CompilationUnit *cu, OpKind op, int r_dest_src1,
Bill Buzbeea114add2012-05-03 15:00:40 -0700137 int value)
buzbeee3acd072012-02-25 17:03:10 -0800138{
Bill Buzbeea114add2012-05-03 15:00:40 -0700139 LIR *res;
140 bool neg = (value < 0);
buzbeefa57c472012-11-21 12:06:18 -0800141 int abs_value = (neg) ? -value : value;
142 bool short_form = (abs_value & 0xff) == abs_value;
Bill Buzbeea114add2012-05-03 15:00:40 -0700143 MipsOpCode opcode = kMipsNop;
144 switch (op) {
145 case kOpAdd:
buzbeefa57c472012-11-21 12:06:18 -0800146 return OpRegRegImm(cu, op, r_dest_src1, r_dest_src1, value);
Bill Buzbeea114add2012-05-03 15:00:40 -0700147 break;
148 case kOpSub:
buzbeefa57c472012-11-21 12:06:18 -0800149 return OpRegRegImm(cu, op, r_dest_src1, r_dest_src1, value);
Bill Buzbeea114add2012-05-03 15:00:40 -0700150 break;
151 default:
buzbee52a77fc2012-11-20 19:50:46 -0800152 LOG(FATAL) << "Bad case in OpRegImm";
Bill Buzbeea114add2012-05-03 15:00:40 -0700153 break;
154 }
buzbeefa57c472012-11-21 12:06:18 -0800155 if (short_form)
156 res = NewLIR2(cu, opcode, r_dest_src1, abs_value);
Bill Buzbeea114add2012-05-03 15:00:40 -0700157 else {
buzbeefa57c472012-11-21 12:06:18 -0800158 int r_scratch = AllocTemp(cu);
159 res = LoadConstant(cu, r_scratch, value);
Bill Buzbeea114add2012-05-03 15:00:40 -0700160 if (op == kOpCmp)
buzbeefa57c472012-11-21 12:06:18 -0800161 NewLIR2(cu, opcode, r_dest_src1, r_scratch);
Bill Buzbeea114add2012-05-03 15:00:40 -0700162 else
buzbeefa57c472012-11-21 12:06:18 -0800163 NewLIR3(cu, opcode, r_dest_src1, r_dest_src1, r_scratch);
Bill Buzbeea114add2012-05-03 15:00:40 -0700164 }
165 return res;
buzbeee3acd072012-02-25 17:03:10 -0800166}
167
buzbeefa57c472012-11-21 12:06:18 -0800168LIR *OpRegRegReg(CompilationUnit *cu, OpKind op, int r_dest,
169 int r_src1, int r_src2)
buzbeee3acd072012-02-25 17:03:10 -0800170{
Bill Buzbeea114add2012-05-03 15:00:40 -0700171 MipsOpCode opcode = kMipsNop;
172 switch (op) {
173 case kOpAdd:
174 opcode = kMipsAddu;
175 break;
176 case kOpSub:
177 opcode = kMipsSubu;
178 break;
179 case kOpAnd:
180 opcode = kMipsAnd;
181 break;
182 case kOpMul:
183 opcode = kMipsMul;
184 break;
185 case kOpOr:
186 opcode = kMipsOr;
187 break;
188 case kOpXor:
189 opcode = kMipsXor;
190 break;
191 case kOpLsl:
192 opcode = kMipsSllv;
193 break;
194 case kOpLsr:
195 opcode = kMipsSrlv;
196 break;
197 case kOpAsr:
198 opcode = kMipsSrav;
199 break;
200 case kOpAdc:
201 case kOpSbc:
202 LOG(FATAL) << "No carry bit on MIPS";
203 break;
204 default:
buzbee52a77fc2012-11-20 19:50:46 -0800205 LOG(FATAL) << "bad case in OpRegRegReg";
Bill Buzbeea114add2012-05-03 15:00:40 -0700206 break;
207 }
buzbeefa57c472012-11-21 12:06:18 -0800208 return NewLIR3(cu, opcode, r_dest, r_src1, r_src2);
buzbeee3acd072012-02-25 17:03:10 -0800209}
210
buzbeefa57c472012-11-21 12:06:18 -0800211LIR *OpRegRegImm(CompilationUnit *cu, OpKind op, int r_dest,
212 int r_src1, int value)
buzbeee3acd072012-02-25 17:03:10 -0800213{
Bill Buzbeea114add2012-05-03 15:00:40 -0700214 LIR *res;
215 MipsOpCode opcode = kMipsNop;
buzbeefa57c472012-11-21 12:06:18 -0800216 bool short_form = true;
buzbeee3acd072012-02-25 17:03:10 -0800217
Bill Buzbeea114add2012-05-03 15:00:40 -0700218 switch (op) {
219 case kOpAdd:
220 if (IS_SIMM16(value)) {
221 opcode = kMipsAddiu;
222 }
223 else {
buzbeefa57c472012-11-21 12:06:18 -0800224 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700225 opcode = kMipsAddu;
226 }
227 break;
228 case kOpSub:
229 if (IS_SIMM16((-value))) {
230 value = -value;
231 opcode = kMipsAddiu;
232 }
233 else {
buzbeefa57c472012-11-21 12:06:18 -0800234 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700235 opcode = kMipsSubu;
236 }
237 break;
238 case kOpLsl:
239 DCHECK(value >= 0 && value <= 31);
240 opcode = kMipsSll;
241 break;
242 case kOpLsr:
243 DCHECK(value >= 0 && value <= 31);
244 opcode = kMipsSrl;
245 break;
246 case kOpAsr:
247 DCHECK(value >= 0 && value <= 31);
248 opcode = kMipsSra;
249 break;
250 case kOpAnd:
251 if (IS_UIMM16((value))) {
252 opcode = kMipsAndi;
253 }
254 else {
buzbeefa57c472012-11-21 12:06:18 -0800255 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700256 opcode = kMipsAnd;
257 }
258 break;
259 case kOpOr:
260 if (IS_UIMM16((value))) {
261 opcode = kMipsOri;
262 }
263 else {
buzbeefa57c472012-11-21 12:06:18 -0800264 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700265 opcode = kMipsOr;
266 }
267 break;
268 case kOpXor:
269 if (IS_UIMM16((value))) {
270 opcode = kMipsXori;
271 }
272 else {
buzbeefa57c472012-11-21 12:06:18 -0800273 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700274 opcode = kMipsXor;
275 }
276 break;
277 case kOpMul:
buzbeefa57c472012-11-21 12:06:18 -0800278 short_form = false;
Bill Buzbeea114add2012-05-03 15:00:40 -0700279 opcode = kMipsMul;
280 break;
281 default:
buzbee52a77fc2012-11-20 19:50:46 -0800282 LOG(FATAL) << "Bad case in OpRegRegImm";
Bill Buzbeea114add2012-05-03 15:00:40 -0700283 break;
284 }
buzbeee3acd072012-02-25 17:03:10 -0800285
buzbeefa57c472012-11-21 12:06:18 -0800286 if (short_form)
287 res = NewLIR3(cu, opcode, r_dest, r_src1, value);
Bill Buzbeea114add2012-05-03 15:00:40 -0700288 else {
buzbeefa57c472012-11-21 12:06:18 -0800289 if (r_dest != r_src1) {
290 res = LoadConstant(cu, r_dest, value);
291 NewLIR3(cu, opcode, r_dest, r_src1, r_dest);
Bill Buzbeea114add2012-05-03 15:00:40 -0700292 } else {
buzbeefa57c472012-11-21 12:06:18 -0800293 int r_scratch = AllocTemp(cu);
294 res = LoadConstant(cu, r_scratch, value);
295 NewLIR3(cu, opcode, r_dest, r_src1, r_scratch);
buzbeee3acd072012-02-25 17:03:10 -0800296 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700297 }
298 return res;
buzbeee3acd072012-02-25 17:03:10 -0800299}
300
buzbeefa57c472012-11-21 12:06:18 -0800301LIR *OpRegReg(CompilationUnit *cu, OpKind op, int r_dest_src1, int r_src2)
buzbeee3acd072012-02-25 17:03:10 -0800302{
Bill Buzbeea114add2012-05-03 15:00:40 -0700303 MipsOpCode opcode = kMipsNop;
304 LIR *res;
305 switch (op) {
306 case kOpMov:
307 opcode = kMipsMove;
308 break;
309 case kOpMvn:
buzbeefa57c472012-11-21 12:06:18 -0800310 return NewLIR3(cu, kMipsNor, r_dest_src1, r_src2, r_ZERO);
Bill Buzbeea114add2012-05-03 15:00:40 -0700311 case kOpNeg:
buzbeefa57c472012-11-21 12:06:18 -0800312 return NewLIR3(cu, kMipsSubu, r_dest_src1, r_ZERO, r_src2);
Bill Buzbeea114add2012-05-03 15:00:40 -0700313 case kOpAdd:
314 case kOpAnd:
315 case kOpMul:
316 case kOpOr:
317 case kOpSub:
318 case kOpXor:
buzbeefa57c472012-11-21 12:06:18 -0800319 return OpRegRegReg(cu, op, r_dest_src1, r_dest_src1, r_src2);
Bill Buzbeea114add2012-05-03 15:00:40 -0700320 case kOp2Byte:
buzbeee3acd072012-02-25 17:03:10 -0800321#if __mips_isa_rev>=2
buzbeefa57c472012-11-21 12:06:18 -0800322 res = NewLIR2(cu, kMipsSeb, r_dest_src1, r_src2);
buzbeee3acd072012-02-25 17:03:10 -0800323#else
buzbeefa57c472012-11-21 12:06:18 -0800324 res = OpRegRegImm(cu, kOpLsl, r_dest_src1, r_src2, 24);
325 OpRegRegImm(cu, kOpAsr, r_dest_src1, r_dest_src1, 24);
buzbeee3acd072012-02-25 17:03:10 -0800326#endif
Bill Buzbeea114add2012-05-03 15:00:40 -0700327 return res;
328 case kOp2Short:
buzbeee3acd072012-02-25 17:03:10 -0800329#if __mips_isa_rev>=2
buzbeefa57c472012-11-21 12:06:18 -0800330 res = NewLIR2(cu, kMipsSeh, r_dest_src1, r_src2);
buzbeee3acd072012-02-25 17:03:10 -0800331#else
buzbeefa57c472012-11-21 12:06:18 -0800332 res = OpRegRegImm(cu, kOpLsl, r_dest_src1, r_src2, 16);
333 OpRegRegImm(cu, kOpAsr, r_dest_src1, r_dest_src1, 16);
buzbeee3acd072012-02-25 17:03:10 -0800334#endif
Bill Buzbeea114add2012-05-03 15:00:40 -0700335 return res;
336 case kOp2Char:
buzbeefa57c472012-11-21 12:06:18 -0800337 return NewLIR3(cu, kMipsAndi, r_dest_src1, r_src2, 0xFFFF);
Bill Buzbeea114add2012-05-03 15:00:40 -0700338 default:
buzbee52a77fc2012-11-20 19:50:46 -0800339 LOG(FATAL) << "Bad case in OpRegReg";
Bill Buzbeea114add2012-05-03 15:00:40 -0700340 break;
341 }
buzbeefa57c472012-11-21 12:06:18 -0800342 return NewLIR2(cu, opcode, r_dest_src1, r_src2);
buzbeee3acd072012-02-25 17:03:10 -0800343}
344
buzbeefa57c472012-11-21 12:06:18 -0800345LIR *LoadConstantValueWide(CompilationUnit *cu, int r_dest_lo,
346 int r_dest_hi, int val_lo, int val_hi)
buzbeee3acd072012-02-25 17:03:10 -0800347{
Bill Buzbeea114add2012-05-03 15:00:40 -0700348 LIR *res;
buzbeefa57c472012-11-21 12:06:18 -0800349 res = LoadConstantNoClobber(cu, r_dest_lo, val_lo);
350 LoadConstantNoClobber(cu, r_dest_hi, val_hi);
Bill Buzbeea114add2012-05-03 15:00:40 -0700351 return res;
buzbeee3acd072012-02-25 17:03:10 -0800352}
353
354/* Load value from base + scaled index. */
buzbeefa57c472012-11-21 12:06:18 -0800355LIR *LoadBaseIndexed(CompilationUnit *cu, int rBase,
356 int r_index, int r_dest, int scale, OpSize size)
buzbeee3acd072012-02-25 17:03:10 -0800357{
Bill Buzbeea114add2012-05-03 15:00:40 -0700358 LIR *first = NULL;
359 LIR *res;
360 MipsOpCode opcode = kMipsNop;
buzbeefa57c472012-11-21 12:06:18 -0800361 int t_reg = AllocTemp(cu);
buzbeee3acd072012-02-25 17:03:10 -0800362
363#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800364 if (MIPS_FPREG(r_dest)) {
365 DCHECK(MIPS_SINGLEREG(r_dest));
Bill Buzbeea114add2012-05-03 15:00:40 -0700366 DCHECK((size == kWord) || (size == kSingle));
367 size = kSingle;
368 } else {
369 if (size == kSingle)
370 size = kWord;
371 }
buzbeee3acd072012-02-25 17:03:10 -0800372#endif
373
Bill Buzbeea114add2012-05-03 15:00:40 -0700374 if (!scale) {
buzbeefa57c472012-11-21 12:06:18 -0800375 first = NewLIR3(cu, kMipsAddu, t_reg , rBase, r_index);
Bill Buzbeea114add2012-05-03 15:00:40 -0700376 } else {
buzbeefa57c472012-11-21 12:06:18 -0800377 first = OpRegRegImm(cu, kOpLsl, t_reg, r_index, scale);
378 NewLIR3(cu, kMipsAddu, t_reg , rBase, t_reg);
Bill Buzbeea114add2012-05-03 15:00:40 -0700379 }
buzbeee3acd072012-02-25 17:03:10 -0800380
Bill Buzbeea114add2012-05-03 15:00:40 -0700381 switch (size) {
buzbeee3acd072012-02-25 17:03:10 -0800382#ifdef __mips_hard_float
Bill Buzbeea114add2012-05-03 15:00:40 -0700383 case kSingle:
384 opcode = kMipsFlwc1;
385 break;
buzbeee3acd072012-02-25 17:03:10 -0800386#endif
Bill Buzbeea114add2012-05-03 15:00:40 -0700387 case kWord:
388 opcode = kMipsLw;
389 break;
390 case kUnsignedHalf:
391 opcode = kMipsLhu;
392 break;
393 case kSignedHalf:
394 opcode = kMipsLh;
395 break;
396 case kUnsignedByte:
397 opcode = kMipsLbu;
398 break;
399 case kSignedByte:
400 opcode = kMipsLb;
401 break;
402 default:
buzbee52a77fc2012-11-20 19:50:46 -0800403 LOG(FATAL) << "Bad case in LoadBaseIndexed";
Bill Buzbeea114add2012-05-03 15:00:40 -0700404 }
buzbeee3acd072012-02-25 17:03:10 -0800405
buzbeefa57c472012-11-21 12:06:18 -0800406 res = NewLIR3(cu, opcode, r_dest, 0, t_reg);
407 FreeTemp(cu, t_reg);
Bill Buzbeea114add2012-05-03 15:00:40 -0700408 return (first) ? first : res;
buzbeee3acd072012-02-25 17:03:10 -0800409}
410
411/* store value base base + scaled index. */
buzbeefa57c472012-11-21 12:06:18 -0800412LIR *StoreBaseIndexed(CompilationUnit *cu, int rBase,
413 int r_index, int r_src, int scale, OpSize size)
buzbeee3acd072012-02-25 17:03:10 -0800414{
Bill Buzbeea114add2012-05-03 15:00:40 -0700415 LIR *first = NULL;
Bill Buzbeea114add2012-05-03 15:00:40 -0700416 MipsOpCode opcode = kMipsNop;
buzbeefa57c472012-11-21 12:06:18 -0800417 int r_new_index = r_index;
418 int t_reg = AllocTemp(cu);
buzbeee3acd072012-02-25 17:03:10 -0800419
420#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800421 if (MIPS_FPREG(r_src)) {
422 DCHECK(MIPS_SINGLEREG(r_src));
Bill Buzbeea114add2012-05-03 15:00:40 -0700423 DCHECK((size == kWord) || (size == kSingle));
424 size = kSingle;
425 } else {
426 if (size == kSingle)
427 size = kWord;
428 }
buzbeee3acd072012-02-25 17:03:10 -0800429#endif
430
Bill Buzbeea114add2012-05-03 15:00:40 -0700431 if (!scale) {
buzbeefa57c472012-11-21 12:06:18 -0800432 first = NewLIR3(cu, kMipsAddu, t_reg , rBase, r_index);
Bill Buzbeea114add2012-05-03 15:00:40 -0700433 } else {
buzbeefa57c472012-11-21 12:06:18 -0800434 first = OpRegRegImm(cu, kOpLsl, t_reg, r_index, scale);
435 NewLIR3(cu, kMipsAddu, t_reg , rBase, t_reg);
Bill Buzbeea114add2012-05-03 15:00:40 -0700436 }
buzbeee3acd072012-02-25 17:03:10 -0800437
Bill Buzbeea114add2012-05-03 15:00:40 -0700438 switch (size) {
buzbeee3acd072012-02-25 17:03:10 -0800439#ifdef __mips_hard_float
Bill Buzbeea114add2012-05-03 15:00:40 -0700440 case kSingle:
441 opcode = kMipsFswc1;
442 break;
buzbeee3acd072012-02-25 17:03:10 -0800443#endif
Bill Buzbeea114add2012-05-03 15:00:40 -0700444 case kWord:
445 opcode = kMipsSw;
446 break;
447 case kUnsignedHalf:
448 case kSignedHalf:
449 opcode = kMipsSh;
450 break;
451 case kUnsignedByte:
452 case kSignedByte:
453 opcode = kMipsSb;
454 break;
455 default:
buzbee52a77fc2012-11-20 19:50:46 -0800456 LOG(FATAL) << "Bad case in StoreBaseIndexed";
Bill Buzbeea114add2012-05-03 15:00:40 -0700457 }
buzbeefa57c472012-11-21 12:06:18 -0800458 NewLIR3(cu, opcode, r_src, 0, t_reg);
459 FreeTemp(cu, r_new_index);
Bill Buzbeea114add2012-05-03 15:00:40 -0700460 return first;
buzbeee3acd072012-02-25 17:03:10 -0800461}
462
buzbeefa57c472012-11-21 12:06:18 -0800463LIR *LoadMultiple(CompilationUnit *cu, int rBase, int r_mask)
buzbeee3acd072012-02-25 17:03:10 -0800464{
Bill Buzbeea114add2012-05-03 15:00:40 -0700465 int i;
buzbeefa57c472012-11-21 12:06:18 -0800466 int load_cnt = 0;
Bill Buzbeea114add2012-05-03 15:00:40 -0700467 LIR *res = NULL ;
buzbeefa57c472012-11-21 12:06:18 -0800468 GenBarrier(cu);
buzbeee3acd072012-02-25 17:03:10 -0800469
buzbeefa57c472012-11-21 12:06:18 -0800470 for (i = 0; i < 8; i++, r_mask >>= 1) {
471 if (r_mask & 0x1) { /* map r0 to MIPS r_A0 */
472 NewLIR3(cu, kMipsLw, i+r_A0, load_cnt*4, rBase);
473 load_cnt++;
buzbeee3acd072012-02-25 17:03:10 -0800474 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700475 }
buzbeee3acd072012-02-25 17:03:10 -0800476
buzbeefa57c472012-11-21 12:06:18 -0800477 if (load_cnt) {/* increment after */
478 NewLIR3(cu, kMipsAddiu, rBase, rBase, load_cnt*4);
Bill Buzbeea114add2012-05-03 15:00:40 -0700479 }
buzbeee3acd072012-02-25 17:03:10 -0800480
buzbeefa57c472012-11-21 12:06:18 -0800481 GenBarrier(cu);
Bill Buzbeea114add2012-05-03 15:00:40 -0700482 return res; /* NULL always returned which should be ok since no callers use it */
buzbeee3acd072012-02-25 17:03:10 -0800483}
484
buzbeefa57c472012-11-21 12:06:18 -0800485LIR *StoreMultiple(CompilationUnit *cu, int rBase, int r_mask)
buzbeee3acd072012-02-25 17:03:10 -0800486{
Bill Buzbeea114add2012-05-03 15:00:40 -0700487 int i;
buzbeefa57c472012-11-21 12:06:18 -0800488 int store_cnt = 0;
Bill Buzbeea114add2012-05-03 15:00:40 -0700489 LIR *res = NULL ;
buzbeefa57c472012-11-21 12:06:18 -0800490 GenBarrier(cu);
buzbeee3acd072012-02-25 17:03:10 -0800491
buzbeefa57c472012-11-21 12:06:18 -0800492 for (i = 0; i < 8; i++, r_mask >>= 1) {
493 if (r_mask & 0x1) { /* map r0 to MIPS r_A0 */
494 NewLIR3(cu, kMipsSw, i+r_A0, store_cnt*4, rBase);
495 store_cnt++;
buzbeee3acd072012-02-25 17:03:10 -0800496 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700497 }
buzbeee3acd072012-02-25 17:03:10 -0800498
buzbeefa57c472012-11-21 12:06:18 -0800499 if (store_cnt) { /* increment after */
500 NewLIR3(cu, kMipsAddiu, rBase, rBase, store_cnt*4);
Bill Buzbeea114add2012-05-03 15:00:40 -0700501 }
buzbeee3acd072012-02-25 17:03:10 -0800502
buzbeefa57c472012-11-21 12:06:18 -0800503 GenBarrier(cu);
Bill Buzbeea114add2012-05-03 15:00:40 -0700504 return res; /* NULL always returned which should be ok since no callers use it */
buzbeee3acd072012-02-25 17:03:10 -0800505}
506
buzbeefa57c472012-11-21 12:06:18 -0800507LIR *LoadBaseDispBody(CompilationUnit *cu, int rBase,
508 int displacement, int r_dest, int r_dest_hi,
509 OpSize size, int s_reg)
buzbeee3acd072012-02-25 17:03:10 -0800510/*
511 * Load value from base + displacement. Optionally perform null check
buzbeefa57c472012-11-21 12:06:18 -0800512 * on base (which must have an associated s_reg and MIR). If not
buzbeee3acd072012-02-25 17:03:10 -0800513 * performing null check, incoming MIR can be null. IMPORTANT: this
514 * code must not allocate any new temps. If a new register is needed
515 * and base and dest are the same, spill some other register to
516 * rlp and then restore.
517 */
518{
Bill Buzbeea114add2012-05-03 15:00:40 -0700519 LIR *res;
520 LIR *load = NULL;
521 LIR *load2 = NULL;
522 MipsOpCode opcode = kMipsNop;
buzbeefa57c472012-11-21 12:06:18 -0800523 bool short_form = IS_SIMM16(displacement);
Bill Buzbeea114add2012-05-03 15:00:40 -0700524 bool pair = false;
buzbeee3acd072012-02-25 17:03:10 -0800525
Bill Buzbeea114add2012-05-03 15:00:40 -0700526 switch (size) {
527 case kLong:
528 case kDouble:
529 pair = true;
530 opcode = kMipsLw;
buzbeee3acd072012-02-25 17:03:10 -0800531#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800532 if (MIPS_FPREG(r_dest)) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700533 opcode = kMipsFlwc1;
buzbeefa57c472012-11-21 12:06:18 -0800534 if (MIPS_DOUBLEREG(r_dest)) {
535 r_dest = r_dest - MIPS_FP_DOUBLE;
buzbeee3acd072012-02-25 17:03:10 -0800536 } else {
buzbeefa57c472012-11-21 12:06:18 -0800537 DCHECK(MIPS_FPREG(r_dest_hi));
538 DCHECK(r_dest == (r_dest_hi - 1));
buzbeee3acd072012-02-25 17:03:10 -0800539 }
buzbeefa57c472012-11-21 12:06:18 -0800540 r_dest_hi = r_dest + 1;
Bill Buzbeea114add2012-05-03 15:00:40 -0700541 }
542#endif
buzbeefa57c472012-11-21 12:06:18 -0800543 short_form = IS_SIMM16_2WORD(displacement);
Bill Buzbeea114add2012-05-03 15:00:40 -0700544 DCHECK_EQ((displacement & 0x3), 0);
545 break;
546 case kWord:
547 case kSingle:
548 opcode = kMipsLw;
549#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800550 if (MIPS_FPREG(r_dest)) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700551 opcode = kMipsFlwc1;
buzbeefa57c472012-11-21 12:06:18 -0800552 DCHECK(MIPS_SINGLEREG(r_dest));
Bill Buzbeea114add2012-05-03 15:00:40 -0700553 }
554#endif
555 DCHECK_EQ((displacement & 0x3), 0);
556 break;
557 case kUnsignedHalf:
558 opcode = kMipsLhu;
559 DCHECK_EQ((displacement & 0x1), 0);
560 break;
561 case kSignedHalf:
562 opcode = kMipsLh;
563 DCHECK_EQ((displacement & 0x1), 0);
564 break;
565 case kUnsignedByte:
566 opcode = kMipsLbu;
567 break;
568 case kSignedByte:
569 opcode = kMipsLb;
570 break;
571 default:
buzbee52a77fc2012-11-20 19:50:46 -0800572 LOG(FATAL) << "Bad case in LoadBaseIndexedBody";
Bill Buzbeea114add2012-05-03 15:00:40 -0700573 }
574
buzbeefa57c472012-11-21 12:06:18 -0800575 if (short_form) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700576 if (!pair) {
buzbeefa57c472012-11-21 12:06:18 -0800577 load = res = NewLIR3(cu, opcode, r_dest, displacement, rBase);
buzbeee3acd072012-02-25 17:03:10 -0800578 } else {
buzbeefa57c472012-11-21 12:06:18 -0800579 load = res = NewLIR3(cu, opcode, r_dest,
Bill Buzbeea114add2012-05-03 15:00:40 -0700580 displacement + LOWORD_OFFSET, rBase);
buzbeefa57c472012-11-21 12:06:18 -0800581 load2 = NewLIR3(cu, opcode, r_dest_hi,
Bill Buzbeea114add2012-05-03 15:00:40 -0700582 displacement + HIWORD_OFFSET, rBase);
buzbeee3acd072012-02-25 17:03:10 -0800583 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700584 } else {
585 if (pair) {
buzbeefa57c472012-11-21 12:06:18 -0800586 int r_tmp = AllocFreeTemp(cu);
587 res = OpRegRegImm(cu, kOpAdd, r_tmp, rBase, displacement);
588 load = NewLIR3(cu, opcode, r_dest, LOWORD_OFFSET, r_tmp);
589 load2 = NewLIR3(cu, opcode, r_dest_hi, HIWORD_OFFSET, r_tmp);
590 FreeTemp(cu, r_tmp);
Bill Buzbeea114add2012-05-03 15:00:40 -0700591 } else {
buzbeefa57c472012-11-21 12:06:18 -0800592 int r_tmp = (rBase == r_dest) ? AllocFreeTemp(cu) : r_dest;
593 res = OpRegRegImm(cu, kOpAdd, r_tmp, rBase, displacement);
594 load = NewLIR3(cu, opcode, r_dest, 0, r_tmp);
595 if (r_tmp != r_dest)
596 FreeTemp(cu, r_tmp);
Bill Buzbeea114add2012-05-03 15:00:40 -0700597 }
598 }
buzbeee3acd072012-02-25 17:03:10 -0800599
buzbeef0504cd2012-11-13 16:31:10 -0800600 if (rBase == rMIPS_SP) {
buzbee52a77fc2012-11-20 19:50:46 -0800601 AnnotateDalvikRegAccess(load,
Bill Buzbeea114add2012-05-03 15:00:40 -0700602 (displacement + (pair ? LOWORD_OFFSET : 0)) >> 2,
buzbeefa57c472012-11-21 12:06:18 -0800603 true /* is_load */, pair /* is64bit */);
Bill Buzbeea114add2012-05-03 15:00:40 -0700604 if (pair) {
buzbee52a77fc2012-11-20 19:50:46 -0800605 AnnotateDalvikRegAccess(load2, (displacement + HIWORD_OFFSET) >> 2,
buzbeefa57c472012-11-21 12:06:18 -0800606 true /* is_load */, pair /* is64bit */);
buzbeee3acd072012-02-25 17:03:10 -0800607 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700608 }
609 return load;
buzbeee3acd072012-02-25 17:03:10 -0800610}
611
buzbeefa57c472012-11-21 12:06:18 -0800612LIR *LoadBaseDisp(CompilationUnit *cu, int rBase,
613 int displacement, int r_dest, OpSize size, int s_reg)
buzbeee3acd072012-02-25 17:03:10 -0800614{
buzbeefa57c472012-11-21 12:06:18 -0800615 return LoadBaseDispBody(cu, rBase, displacement, r_dest, -1,
616 size, s_reg);
buzbeee3acd072012-02-25 17:03:10 -0800617}
618
buzbeefa57c472012-11-21 12:06:18 -0800619LIR *LoadBaseDispWide(CompilationUnit *cu, int rBase,
620 int displacement, int r_dest_lo, int r_dest_hi, int s_reg)
buzbeee3acd072012-02-25 17:03:10 -0800621{
buzbeefa57c472012-11-21 12:06:18 -0800622 return LoadBaseDispBody(cu, rBase, displacement, r_dest_lo, r_dest_hi,
623 kLong, s_reg);
buzbeee3acd072012-02-25 17:03:10 -0800624}
625
buzbeefa57c472012-11-21 12:06:18 -0800626LIR *StoreBaseDispBody(CompilationUnit *cu, int rBase,
627 int displacement, int r_src, int r_src_hi, OpSize size)
buzbeee3acd072012-02-25 17:03:10 -0800628{
Bill Buzbeea114add2012-05-03 15:00:40 -0700629 LIR *res;
630 LIR *store = NULL;
631 LIR *store2 = NULL;
632 MipsOpCode opcode = kMipsNop;
buzbeefa57c472012-11-21 12:06:18 -0800633 bool short_form = IS_SIMM16(displacement);
Bill Buzbeea114add2012-05-03 15:00:40 -0700634 bool pair = false;
buzbeee3acd072012-02-25 17:03:10 -0800635
Bill Buzbeea114add2012-05-03 15:00:40 -0700636 switch (size) {
637 case kLong:
638 case kDouble:
639 pair = true;
640 opcode = kMipsSw;
buzbeee3acd072012-02-25 17:03:10 -0800641#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800642 if (MIPS_FPREG(r_src)) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700643 opcode = kMipsFswc1;
buzbeefa57c472012-11-21 12:06:18 -0800644 if (MIPS_DOUBLEREG(r_src)) {
645 r_src = r_src - MIPS_FP_DOUBLE;
buzbeee3acd072012-02-25 17:03:10 -0800646 } else {
buzbeefa57c472012-11-21 12:06:18 -0800647 DCHECK(MIPS_FPREG(r_src_hi));
648 DCHECK_EQ(r_src, (r_src_hi - 1));
buzbeee3acd072012-02-25 17:03:10 -0800649 }
buzbeefa57c472012-11-21 12:06:18 -0800650 r_src_hi = r_src + 1;
Bill Buzbeea114add2012-05-03 15:00:40 -0700651 }
652#endif
buzbeefa57c472012-11-21 12:06:18 -0800653 short_form = IS_SIMM16_2WORD(displacement);
Bill Buzbeea114add2012-05-03 15:00:40 -0700654 DCHECK_EQ((displacement & 0x3), 0);
655 break;
656 case kWord:
657 case kSingle:
658 opcode = kMipsSw;
659#ifdef __mips_hard_float
buzbeefa57c472012-11-21 12:06:18 -0800660 if (MIPS_FPREG(r_src)) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700661 opcode = kMipsFswc1;
buzbeefa57c472012-11-21 12:06:18 -0800662 DCHECK(MIPS_SINGLEREG(r_src));
Bill Buzbeea114add2012-05-03 15:00:40 -0700663 }
664#endif
665 DCHECK_EQ((displacement & 0x3), 0);
666 break;
667 case kUnsignedHalf:
668 case kSignedHalf:
669 opcode = kMipsSh;
670 DCHECK_EQ((displacement & 0x1), 0);
671 break;
672 case kUnsignedByte:
673 case kSignedByte:
674 opcode = kMipsSb;
675 break;
676 default:
buzbee52a77fc2012-11-20 19:50:46 -0800677 LOG(FATAL) << "Bad case in StoreBaseIndexedBody";
Bill Buzbeea114add2012-05-03 15:00:40 -0700678 }
679
buzbeefa57c472012-11-21 12:06:18 -0800680 if (short_form) {
Bill Buzbeea114add2012-05-03 15:00:40 -0700681 if (!pair) {
buzbeefa57c472012-11-21 12:06:18 -0800682 store = res = NewLIR3(cu, opcode, r_src, displacement, rBase);
buzbeee3acd072012-02-25 17:03:10 -0800683 } else {
buzbeefa57c472012-11-21 12:06:18 -0800684 store = res = NewLIR3(cu, opcode, r_src, displacement + LOWORD_OFFSET,
Bill Buzbeea114add2012-05-03 15:00:40 -0700685 rBase);
buzbeefa57c472012-11-21 12:06:18 -0800686 store2 = NewLIR3(cu, opcode, r_src_hi, displacement + HIWORD_OFFSET,
Bill Buzbeea114add2012-05-03 15:00:40 -0700687 rBase);
buzbeee3acd072012-02-25 17:03:10 -0800688 }
Bill Buzbeea114add2012-05-03 15:00:40 -0700689 } else {
buzbeefa57c472012-11-21 12:06:18 -0800690 int r_scratch = AllocTemp(cu);
691 res = OpRegRegImm(cu, kOpAdd, r_scratch, rBase, displacement);
Bill Buzbeea114add2012-05-03 15:00:40 -0700692 if (!pair) {
buzbeefa57c472012-11-21 12:06:18 -0800693 store = NewLIR3(cu, opcode, r_src, 0, r_scratch);
Bill Buzbeea114add2012-05-03 15:00:40 -0700694 } else {
buzbeefa57c472012-11-21 12:06:18 -0800695 store = NewLIR3(cu, opcode, r_src, LOWORD_OFFSET, r_scratch);
696 store2 = NewLIR3(cu, opcode, r_src_hi, HIWORD_OFFSET, r_scratch);
buzbeee3acd072012-02-25 17:03:10 -0800697 }
buzbeefa57c472012-11-21 12:06:18 -0800698 FreeTemp(cu, r_scratch);
Bill Buzbeea114add2012-05-03 15:00:40 -0700699 }
buzbeee3acd072012-02-25 17:03:10 -0800700
buzbeef0504cd2012-11-13 16:31:10 -0800701 if (rBase == rMIPS_SP) {
buzbee52a77fc2012-11-20 19:50:46 -0800702 AnnotateDalvikRegAccess(store, (displacement + (pair ? LOWORD_OFFSET : 0))
buzbeefa57c472012-11-21 12:06:18 -0800703 >> 2, false /* is_load */, pair /* is64bit */);
Bill Buzbeea114add2012-05-03 15:00:40 -0700704 if (pair) {
buzbee52a77fc2012-11-20 19:50:46 -0800705 AnnotateDalvikRegAccess(store2, (displacement + HIWORD_OFFSET) >> 2,
buzbeefa57c472012-11-21 12:06:18 -0800706 false /* is_load */, pair /* is64bit */);
Bill Buzbeea114add2012-05-03 15:00:40 -0700707 }
708 }
709
710 return res;
buzbeee3acd072012-02-25 17:03:10 -0800711}
712
buzbeefa57c472012-11-21 12:06:18 -0800713LIR *StoreBaseDisp(CompilationUnit *cu, int rBase,
714 int displacement, int r_src, OpSize size)
buzbeee3acd072012-02-25 17:03:10 -0800715{
buzbeefa57c472012-11-21 12:06:18 -0800716 return StoreBaseDispBody(cu, rBase, displacement, r_src, -1, size);
buzbeee3acd072012-02-25 17:03:10 -0800717}
718
buzbeefa57c472012-11-21 12:06:18 -0800719LIR *StoreBaseDispWide(CompilationUnit *cu, int rBase,
720 int displacement, int r_src_lo, int r_src_hi)
buzbeee3acd072012-02-25 17:03:10 -0800721{
buzbeefa57c472012-11-21 12:06:18 -0800722 return StoreBaseDispBody(cu, rBase, displacement, r_src_lo, r_src_hi, kLong);
buzbeee3acd072012-02-25 17:03:10 -0800723}
724
buzbeefa57c472012-11-21 12:06:18 -0800725void LoadPair(CompilationUnit *cu, int base, int low_reg, int high_reg)
buzbeee3acd072012-02-25 17:03:10 -0800726{
buzbeefa57c472012-11-21 12:06:18 -0800727 LoadWordDisp(cu, base, LOWORD_OFFSET , low_reg);
728 LoadWordDisp(cu, base, HIWORD_OFFSET , high_reg);
buzbeee3acd072012-02-25 17:03:10 -0800729}
730
buzbeefa57c472012-11-21 12:06:18 -0800731LIR* OpThreadMem(CompilationUnit* cu, OpKind op, int thread_offset)
buzbeeb046e162012-10-30 15:48:42 -0700732{
buzbee52a77fc2012-11-20 19:50:46 -0800733 LOG(FATAL) << "Unexpected use of OpThreadMem for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700734 return NULL;
735}
736
buzbeefa57c472012-11-21 12:06:18 -0800737LIR* OpMem(CompilationUnit* cu, OpKind op, int rBase, int disp)
buzbeeb046e162012-10-30 15:48:42 -0700738{
buzbee52a77fc2012-11-20 19:50:46 -0800739 LOG(FATAL) << "Unexpected use of OpMem for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700740 return NULL;
741}
742
buzbeefa57c472012-11-21 12:06:18 -0800743LIR* StoreBaseIndexedDisp(CompilationUnit *cu,
744 int rBase, int r_index, int scale, int displacement,
745 int r_src, int r_src_hi,
746 OpSize size, int s_reg)
buzbeeb046e162012-10-30 15:48:42 -0700747{
buzbee52a77fc2012-11-20 19:50:46 -0800748 LOG(FATAL) << "Unexpected use of StoreBaseIndexedDisp for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700749 return NULL;
750}
751
buzbeefa57c472012-11-21 12:06:18 -0800752LIR* OpRegMem(CompilationUnit *cu, OpKind op, int r_dest, int rBase,
buzbeeb046e162012-10-30 15:48:42 -0700753 int offset)
754{
buzbee52a77fc2012-11-20 19:50:46 -0800755 LOG(FATAL) << "Unexpected use of OpRegMem for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700756 return NULL;
757}
758
buzbeefa57c472012-11-21 12:06:18 -0800759LIR* LoadBaseIndexedDisp(CompilationUnit *cu,
760 int rBase, int r_index, int scale, int displacement,
761 int r_dest, int r_dest_hi,
762 OpSize size, int s_reg)
buzbeeb046e162012-10-30 15:48:42 -0700763{
buzbee52a77fc2012-11-20 19:50:46 -0800764 LOG(FATAL) << "Unexpected use of LoadBaseIndexedDisp for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700765 return NULL;
766}
767
buzbeefa57c472012-11-21 12:06:18 -0800768LIR* OpCondBranch(CompilationUnit* cu, ConditionCode cc, LIR* target)
buzbeeb046e162012-10-30 15:48:42 -0700769{
buzbee52a77fc2012-11-20 19:50:46 -0800770 LOG(FATAL) << "Unexpected use of OpCondBranch for MIPS";
buzbeeb046e162012-10-30 15:48:42 -0700771 return NULL;
772}
773
buzbeee3acd072012-02-25 17:03:10 -0800774} // namespace art