fp_mips.cc revision 675e09b2753c2fcd521bd8f0230a0abf06e9b0e9
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"
187940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrom#include "dex/quick/mir_to_lir-inl.h"
19166db04e259ca51838c311891598664deeed85adIan Rogers#include "entrypoints/quick/quick_entrypoints.h"
20641ce0371c2f0dc95d26be02d8366124c8b66653Brian Carlstrom#include "mips_lir.h"
2157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
22e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
241fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MipsMir2Lir::GenArithOpFloat(Instruction::Code opcode,
252ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom                                  RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2) {
26a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
27fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
29a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /*
30a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   * Don't attempt to optimize register usage since these opcodes call out to
31a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   * the handlers.
32a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee   */
33408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
34a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT_2ADDR:
35a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT:
36a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFadds;
37a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
38a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT_2ADDR:
39a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT:
40a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFsubs;
41a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
42a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT_2ADDR:
43a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT:
44a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFdivs;
45a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
46a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT_2ADDR:
47a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT:
48a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFmuls;
49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
50a6f3aaf8ca5385d870c35d1555b7787d56a70c95Ian Rogers    case Instruction::REM_FLOAT_2ADDR:
51a6f3aaf8ca5385d870c35d1555b7787d56a70c95Ian Rogers    case Instruction::REM_FLOAT:
521fd3346740dfb7f47be9922312b68a4227fada96buzbee      FlushAllRegs();   // Send everything to home location
53984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      CallRuntimeHelperRegLocationRegLocation(kQuickFmodf, rl_src1, rl_src2, false);
54a0cd2d701f29e0bc6275f1b13c0edfd4ec391879buzbee      rl_result = GetReturn(kFPReg);
551fd3346740dfb7f47be9922312b68a4227fada96buzbee      StoreValue(rl_dest, rl_result);
56a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
57a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee    case Instruction::NEG_FLOAT:
581fd3346740dfb7f47be9922312b68a4227fada96buzbee      GenNegFloat(rl_dest, rl_src1);
59a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
60a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
61a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
62a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
631fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src1 = LoadValue(rl_src1, kFPReg);
641fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src2 = LoadValue(rl_src2, kFPReg);
651fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_result = EvalLoc(rl_dest, kFPReg, true);
6600e1ec6581b5b7b46ca4c314c2854e9caa647dd2Bill Buzbee  NewLIR3(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg(), rl_src2.reg.GetReg());
671fd3346740dfb7f47be9922312b68a4227fada96buzbee  StoreValue(rl_dest, rl_result);
68e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
69e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
701fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MipsMir2Lir::GenArithOpDouble(Instruction::Code opcode,
712ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom                                   RegLocation rl_dest, RegLocation rl_src1, RegLocation rl_src2) {
72a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
73fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
74e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
75408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
76a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE_2ADDR:
77a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE:
78a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFaddd;
79a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
80a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE_2ADDR:
81a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE:
82a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFsubd;
83a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
84a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE_2ADDR:
85a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE:
86a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFdivd;
87a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
88a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE_2ADDR:
89a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE:
90a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFmuld;
91a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
92a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE_2ADDR:
93a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE:
941fd3346740dfb7f47be9922312b68a4227fada96buzbee      FlushAllRegs();   // Send everything to home location
95984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      CallRuntimeHelperRegLocationRegLocation(kQuickFmod, rl_src1, rl_src2, false);
96a0cd2d701f29e0bc6275f1b13c0edfd4ec391879buzbee      rl_result = GetReturnWide(kFPReg);
971fd3346740dfb7f47be9922312b68a4227fada96buzbee      StoreValueWide(rl_dest, rl_result);
98a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
99a3a82b219531effb53aef13f48e50db9bf0f9fb5buzbee    case Instruction::NEG_DOUBLE:
1001fd3346740dfb7f47be9922312b68a4227fada96buzbee      GenNegDouble(rl_dest, rl_src1);
101a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
102a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
103a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unpexpected opcode: " << opcode;
104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
1051fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src1 = LoadValueWide(rl_src1, kFPReg);
106fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_src1.wide);
1071fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src2 = LoadValueWide(rl_src2, kFPReg);
108fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_src2.wide);
1091fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_result = EvalLoc(rl_dest, kFPReg, true);
110fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_dest.wide);
111fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(rl_result.wide);
112091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  NewLIR3(op, rl_result.reg.GetReg(), rl_src1.reg.GetReg(), rl_src2.reg.GetReg());
1131fd3346740dfb7f47be9922312b68a4227fada96buzbee  StoreValueWide(rl_dest, rl_result);
114e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
115e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
116675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jianvoid MipsMir2Lir::GenMultiplyByConstantFloat(RegLocation rl_dest, RegLocation rl_src1,
117675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian                                             int32_t constant) {
118675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  // TODO: need mips implementation.
119675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  UNUSED(rl_dest, rl_src1, constant);
120675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  LOG(FATAL) << "Unimplemented GenMultiplyByConstantFloat in mips";
121675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian}
122675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian
123675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jianvoid MipsMir2Lir::GenMultiplyByConstantDouble(RegLocation rl_dest, RegLocation rl_src1,
124675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian                                              int64_t constant) {
125675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  // TODO: need mips implementation.
126675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  UNUSED(rl_dest, rl_src1, constant);
127675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian  LOG(FATAL) << "Unimplemented GenMultiplyByConstantDouble in mips";
128675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian}
129675e09b2753c2fcd521bd8f0230a0abf06e9b0e9Ningsheng Jian
1301fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MipsMir2Lir::GenConversion(Instruction::Code opcode, RegLocation rl_dest,
1312ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom                                RegLocation rl_src) {
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  int op = kMipsNop;
133fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  switch (opcode) {
135a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_FLOAT:
136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtsw;
137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_FLOAT:
139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtsd;
140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
141a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_DOUBLE:
142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtds;
143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_DOUBLE:
145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      op = kMipsFcvtdw;
146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
147a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_INT:
148984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickF2iz, rl_dest, rl_src);
149a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
150a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_INT:
151984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickD2iz, rl_dest, rl_src);
152a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
153a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_DOUBLE:
154984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickL2d, rl_dest, rl_src);
155a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
156a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_LONG:
157984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickF2l, rl_dest, rl_src);
158a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
159a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_FLOAT:
160984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickL2f, rl_dest, rl_src);
161a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
162a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_LONG:
163984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      GenConversionCall(kQuickD2l, rl_dest, rl_src);
164a5954be0aac5edd892fb31a209960543d00e4500buzbee      return;
165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
166a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
167a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
168fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (rl_src.wide) {
1691fd3346740dfb7f47be9922312b68a4227fada96buzbee    rl_src = LoadValueWide(rl_src, kFPReg);
170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
1711fd3346740dfb7f47be9922312b68a4227fada96buzbee    rl_src = LoadValue(rl_src, kFPReg);
172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
173091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  rl_result = EvalLoc(rl_dest, kFPReg, true);
174091cc408e9dc87e60fb64c61e186bea568fc3d3abuzbee  NewLIR2(op, rl_result.reg.GetReg(), rl_src.reg.GetReg());
175fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (rl_dest.wide) {
1761fd3346740dfb7f47be9922312b68a4227fada96buzbee    StoreValueWide(rl_dest, rl_result);
177a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
1781fd3346740dfb7f47be9922312b68a4227fada96buzbee    StoreValue(rl_dest, rl_result);
179a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
180e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
181e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
1821fd3346740dfb7f47be9922312b68a4227fada96buzbeevoid MipsMir2Lir::GenCmpFP(Instruction::Code opcode, RegLocation rl_dest,
1832ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom                           RegLocation rl_src1, RegLocation rl_src2) {
184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  bool wide = true;
185984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe  QuickEntrypointEnum target;
186e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
187408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  switch (opcode) {
188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_FLOAT:
189984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      target = kQuickCmplFloat;
190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      wide = false;
191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_FLOAT:
193984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      target = kQuickCmpgFloat;
194a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      wide = false;
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_DOUBLE:
197984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      target = kQuickCmplDouble;
198a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_DOUBLE:
200984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      target = kQuickCmpgDouble;
201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
202a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
203a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
204984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe      target = kQuickCmplFloat;
205a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
2061fd3346740dfb7f47be9922312b68a4227fada96buzbee  FlushAllRegs();
2071fd3346740dfb7f47be9922312b68a4227fada96buzbee  LockCallTemps();
208a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (wide) {
2092700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    RegStorage r_tmp1(RegStorage::k64BitPair, rMIPS_FARG0, rMIPS_FARG1);
2102700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    RegStorage r_tmp2(RegStorage::k64BitPair, rMIPS_FARG2, rMIPS_FARG3);
2112700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    LoadValueDirectWideFixed(rl_src1, r_tmp1);
2122700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    LoadValueDirectWideFixed(rl_src2, r_tmp2);
213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
2142700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    LoadValueDirectFixed(rl_src1, rs_rMIPS_FARG0);
2152700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee    LoadValueDirectFixed(rl_src2, rs_rMIPS_FARG2);
216a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
217984305917bf57b3f8d92965e4715a0370cc5bcfbAndreas Gampe  RegStorage r_tgt = LoadHelper(target);
2188320f3867c02bae9bef6cdab267820cb7b412781buzbee  // NOTE: not a safepoint
2191fd3346740dfb7f47be9922312b68a4227fada96buzbee  OpReg(kOpBlx, r_tgt);
220a0cd2d701f29e0bc6275f1b13c0edfd4ec391879buzbee  RegLocation rl_result = GetReturn(kCoreReg);
2211fd3346740dfb7f47be9922312b68a4227fada96buzbee  StoreValue(rl_dest, rl_result);
222e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
223e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
2246a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogersvoid MipsMir2Lir::GenFusedFPCmpBranch(BasicBlock* bb, MIR* mir, bool gt_bias, bool is_double) {
2256a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  UNUSED(bb, mir, gt_bias, is_double);
2264b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao  UNIMPLEMENTED(FATAL) << "Need codegen for fused fp cmp branch";
2274b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao}
2284b771a09fe1d947dee7265e3c018d7f1dd89a5d3jeffhao
2292ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MipsMir2Lir::GenNegFloat(RegLocation rl_dest, RegLocation rl_src) {
230fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
2311fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src = LoadValue(rl_src, kCoreReg);
2321fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_result = EvalLoc(rl_dest, kCoreReg, true);
2332700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee  OpRegRegImm(kOpAdd, rl_result.reg, rl_src.reg, 0x80000000);
2341fd3346740dfb7f47be9922312b68a4227fada96buzbee  StoreValue(rl_dest, rl_result);
235efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
236efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
2372ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstromvoid MipsMir2Lir::GenNegDouble(RegLocation rl_dest, RegLocation rl_src) {
238fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result;
2391fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_src = LoadValueWide(rl_src, kCoreReg);
2401fd3346740dfb7f47be9922312b68a4227fada96buzbee  rl_result = EvalLoc(rl_dest, kCoreReg, true);
2412700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee  OpRegRegImm(kOpAdd, rl_result.reg.GetHigh(), rl_src.reg.GetHigh(), 0x80000000);
2422700f7e1edbcd2518f4978e4cd0e05a4149f91b6buzbee  OpRegCopy(rl_result.reg, rl_src.reg);
2431fd3346740dfb7f47be9922312b68a4227fada96buzbee  StoreValueWide(rl_dest, rl_result);
244efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
245efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
24623abec955e2e733999a1e2c30e4e384e46e5dde4Serban Constantinescubool MipsMir2Lir::GenInlinedMinMax(CallInfo* info, bool is_min, bool is_long) {
2476a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  // TODO: need Mips implementation.
2486a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  UNUSED(info, is_min, is_long);
249efc6369224b036a1fb77849f7ae65b3492c832c0buzbee  return false;
250efc6369224b036a1fb77849f7ae65b3492c832c0buzbee}
251efc6369224b036a1fb77849f7ae65b3492c832c0buzbee
2527934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom}  // namespace art
253