fp_mips.cc revision a5954be0aac5edd892fb31a209960543d00e4500
1e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
2e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Copyright (C) 2012 The Android Open Source Project
3e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
4e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Licensed under the Apache License, Version 2.0 (the "License");
5e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * you may not use this file except in compliance with the License.
6e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * You may obtain a copy of the License at
7e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
8e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      http://www.apache.org/licenses/LICENSE-2.0
9e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
10e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Unless required by applicable law or agreed to in writing, software
11e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * distributed under the License is distributed on an "AS IS" BASIS,
12e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * See the License for the specific language governing permissions and
14e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * limitations under the License.
15e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
16e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
1702031b185b4653e6c72e21f7a51238b903f6d638buzbee#include "codegen_mips.h"
18641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom#include "compiler/codegen/codegen_util.h"
19641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom#include "compiler/codegen/ralloc_util.h"
20641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom#include "mips_lir.h"
21641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom#include "oat/runtime/oat_support_entrypoints.h"
2257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
24e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
25a5954be0aac5edd892fb31a209960543d00e4500buzbeevoid MipsCodegen::GenArithOpFloat(CompilationUnit *cu, Instruction::Code opcode,
2602031b185b4653e6c72e21f7a51238b903f6d638buzbee                                  RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2)
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
28a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
29fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
31a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /*
32a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   * Don't attempt to optimize register usage since these opcodes call out to
33a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   * the handlers.
34a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   */
35408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
36a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT_2ADDR:
37a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT:
38a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFadds;
39a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
40a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT_2ADDR:
41a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT:
42a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFsubs;
43a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
44a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT_2ADDR:
45a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT:
46a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFdivs;
47a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
48a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT_2ADDR:
49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT:
50a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFmuls;
51a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
52a6f3aaf8ca5385d870c35d1555b7787d56a70c95Ian Rogers    case Instruction::REM_FLOAT_2ADDR:
53a6f3aaf8ca5385d870c35d1555b7787d56a70c95Ian Rogers    case Instruction::REM_FLOAT:
54a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      FlushAllRegs(cu);   // Send everything to home location
55a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      CallRuntimeHelperRegLocationRegLocation(cu, ENTRYPOINT_OFFSET(pFmodf), rl_src1, rl_src2, false);
56a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      rl_result = GetReturn(cu, true);
57a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      StoreValue(cu, rl_dest, rl_result);
58a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
59a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee    case Instruction::NEG_FLOAT:
60a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      GenNegFloat(cu, rl_dest, rl_src1);
61a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
62a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
63a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
64a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
65fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src1 = LoadValue(cu, rl_src1, kFPReg);
66fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src2 = LoadValue(cu, rl_src2, kFPReg);
67fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_result = EvalLoc(cu, rl_dest, kFPReg, true);
68fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  NewLIR3(cu, op, rl_result.low_reg, rl_src1.low_reg, rl_src2.low_reg);
69fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  StoreValue(cu, rl_dest, rl_result);
70e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
71e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
72a5954be0aac5edd892fb31a209960543d00e4500buzbeevoid MipsCodegen::GenArithOpDouble(CompilationUnit *cu, Instruction::Code opcode,
7302031b185b4653e6c72e21f7a51238b903f6d638buzbee                                   RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2)
74e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
75a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
76fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
77e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
78408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
79a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE_2ADDR:
80a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE:
81a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFaddd;
82a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
83a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE_2ADDR:
84a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE:
85a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFsubd;
86a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
87a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE_2ADDR:
88a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE:
89a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFdivd;
90a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
91a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE_2ADDR:
92a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE:
93a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFmuld;
94a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
95a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE_2ADDR:
96a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE:
97a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      FlushAllRegs(cu);   // Send everything to home location
98a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      CallRuntimeHelperRegLocationRegLocation(cu, ENTRYPOINT_OFFSET(pFmod), rl_src1, rl_src2, false);
99a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      rl_result = GetReturnWide(cu, true);
100a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      StoreValueWide(cu, rl_dest, rl_result);
101a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
102a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee    case Instruction::NEG_DOUBLE:
103a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee      GenNegDouble(cu, rl_dest, rl_src1);
104a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
105a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
106a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unpexpected opcode: " << opcode;
107a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
108fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src1 = LoadValueWide(cu, rl_src1, kFPReg);
109fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_src1.wide);
110fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src2 = LoadValueWide(cu, rl_src2, kFPReg);
111fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_src2.wide);
112fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_result = EvalLoc(cu, rl_dest, kFPReg, true);
113fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_dest.wide);
114fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_result.wide);
115fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  NewLIR3(cu, op, S2d(rl_result.low_reg, rl_result.high_reg), S2d(rl_src1.low_reg, rl_src1.high_reg),
116fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee          S2d(rl_src2.low_reg, rl_src2.high_reg));
117fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  StoreValueWide(cu, rl_dest, rl_result);
118e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
119e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
120a5954be0aac5edd892fb31a209960543d00e4500buzbeevoid MipsCodegen::GenConversion(CompilationUnit *cu, Instruction::Code opcode, RegLocation rl_dest,
12102031b185b4653e6c72e21f7a51238b903f6d638buzbee                                RegLocation rl_src)
122e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
124fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int src_reg;
125fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
126a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  switch (opcode) {
127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_FLOAT:
128a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtsw;
129a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_FLOAT:
131a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtsd;
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_DOUBLE:
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtds;
135a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_DOUBLE:
137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtdw;
138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_INT:
140a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pF2iz), rl_dest, rl_src);
141a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_INT:
143a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pD2iz), rl_dest, rl_src);
144a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_DOUBLE:
146a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pL2d), rl_dest, rl_src);
147a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
148a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_LONG:
149a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pF2l), rl_dest, rl_src);
150a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
151a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_FLOAT:
152a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pL2f), rl_dest, rl_src);
153a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_LONG:
155a5954be0aac5edd892fb31a209960543d00e4500buzbee      GenConversionCall(cu, ENTRYPOINT_OFFSET(pD2l), rl_dest, rl_src);
156a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
157a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
158a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
159a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
160fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (rl_src.wide) {
161fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    rl_src = LoadValueWide(cu, rl_src, kFPReg);
162fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    src_reg = S2d(rl_src.low_reg, rl_src.high_reg);
163a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
164fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    rl_src = LoadValue(cu, rl_src, kFPReg);
165fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    src_reg = rl_src.low_reg;
166a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
167fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (rl_dest.wide) {
168fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    rl_result = EvalLoc(cu, rl_dest, kFPReg, true);
169fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    NewLIR2(cu, op, S2d(rl_result.low_reg, rl_result.high_reg), src_reg);
170fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    StoreValueWide(cu, rl_dest, rl_result);
171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
172fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    rl_result = EvalLoc(cu, rl_dest, kFPReg, true);
173fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    NewLIR2(cu, op, rl_result.low_reg, src_reg);
174fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    StoreValue(cu, rl_dest, rl_result);
175a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
176e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
177e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
178a5954be0aac5edd892fb31a209960543d00e4500buzbeevoid MipsCodegen::GenCmpFP(CompilationUnit *cu, Instruction::Code opcode, RegLocation rl_dest,
17902031b185b4653e6c72e21f7a51238b903f6d638buzbee                           RegLocation rl_src1, RegLocation rl_src2)
180e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
181a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  bool wide = true;
182a5954be0aac5edd892fb31a209960543d00e4500buzbee  int offset = -1; // Make gcc happy.
183e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
184408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
185a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_FLOAT:
186a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      offset = ENTRYPOINT_OFFSET(pCmplFloat);
187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      wide = false;
188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
189a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_FLOAT:
190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      offset = ENTRYPOINT_OFFSET(pCmpgFloat);
191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      wide = false;
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_DOUBLE:
194a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      offset = ENTRYPOINT_OFFSET(pCmplDouble);
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_DOUBLE:
197a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      offset = ENTRYPOINT_OFFSET(pCmpgDouble);
198a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
200a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
202fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  FlushAllRegs(cu);
203fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LockCallTemps(cu);
204a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (wide) {
205fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LoadValueDirectWideFixed(cu, rl_src1, rMIPS_FARG0, rMIPS_FARG1);
206fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LoadValueDirectWideFixed(cu, rl_src2, rMIPS_FARG2, rMIPS_FARG3);
207a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
208fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LoadValueDirectFixed(cu, rl_src1, rMIPS_FARG0);
209fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LoadValueDirectFixed(cu, rl_src2, rMIPS_FARG2);
210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
211fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int r_tgt = LoadHelper(cu, offset);
2128320f3867c02bae9bef6cdab267820cb7b412781buzbee  // NOTE: not a safepoint
213fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  OpReg(cu, kOpBlx, r_tgt);
214fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result = GetReturn(cu, false);
215fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  StoreValue(cu, rl_dest, rl_result);
216e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
217e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
21802031b185b4653e6c72e21f7a51238b903f6d638buzbeevoid MipsCodegen::GenFusedFPCmpBranch(CompilationUnit* cu, BasicBlock* bb, MIR* mir,
219fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                                bool gt_bias, bool is_double)
2204b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao{
2214b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao  UNIMPLEMENTED(FATAL) << "Need codegen for fused fp cmp branch";
2224b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao}
2234b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao
22402031b185b4653e6c72e21f7a51238b903f6d638buzbeevoid MipsCodegen::GenNegFloat(CompilationUnit *cu, RegLocation rl_dest, RegLocation rl_src)
225efc6369224b036a1fb77849f7ae65b3492c832c0buzbee{
226fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
227fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src = LoadValue(cu, rl_src, kCoreReg);
228fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
229fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  OpRegRegImm(cu, kOpAdd, rl_result.low_reg, rl_src.low_reg, 0x80000000);
230fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  StoreValue(cu, rl_dest, rl_result);
231efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
232efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
23302031b185b4653e6c72e21f7a51238b903f6d638buzbeevoid MipsCodegen::GenNegDouble(CompilationUnit *cu, RegLocation rl_dest, RegLocation rl_src)
234efc6369224b036a1fb77849f7ae65b3492c832c0buzbee{
235fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
236fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src = LoadValueWide(cu, rl_src, kCoreReg);
237fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
238fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  OpRegRegImm(cu, kOpAdd, rl_result.high_reg, rl_src.high_reg, 0x80000000);
239fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  OpRegCopy(cu, rl_result.low_reg, rl_src.low_reg);
240fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  StoreValueWide(cu, rl_dest, rl_result);
241efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
242efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
24302031b185b4653e6c72e21f7a51238b903f6d638buzbeebool MipsCodegen::GenInlinedMinMaxInt(CompilationUnit *cu, CallInfo* info, bool is_min)
244efc6369224b036a1fb77849f7ae65b3492c832c0buzbee{
245efc6369224b036a1fb77849f7ae65b3492c832c0buzbee  // TODO: need Mips implementation
246efc6369224b036a1fb77849f7ae65b3492c832c0buzbee  return false;
247efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
248efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
249e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} //  namespace art
250