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