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