fp_arm.cc revision 67bf885d62b1473c833bece1c9e0bb624e6ba391
167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee/* 267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Copyright (C) 2011 The Android Open Source Project 367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Licensed under the Apache License, Version 2.0 (the "License"); 567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * you may not use this file except in compliance with the License. 667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * You may obtain a copy of the License at 767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * http://www.apache.org/licenses/LICENSE-2.0 967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * 1067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Unless required by applicable law or agreed to in writing, software 1167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * distributed under the License is distributed on an "AS IS" BASIS, 1267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * See the License for the specific language governing permissions and 1467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * limitations under the License. 1567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */ 1667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 1767bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestatic bool genArithOpFloat(CompilationUnit* cUnit, MIR* mir, 1867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlDest, RegLocation rlSrc1, 1967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlSrc2) 2067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee{ 2167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee int op = kThumbBkpt; 2267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlResult; 2367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 2467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee /* 2567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * Don't attempt to optimize register usage since these opcodes call out to 2667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee * the handlers. 2767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee */ 2867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee switch (mir->dalvikInsn.opcode) { 2967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_ADD_FLOAT_2ADDR: 3067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_ADD_FLOAT: 3167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vadds; 3267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 3367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_SUB_FLOAT_2ADDR: 3467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_SUB_FLOAT: 3567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vsubs; 3667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 3767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DIV_FLOAT_2ADDR: 3867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DIV_FLOAT: 3967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vdivs; 4067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 4167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_MUL_FLOAT_2ADDR: 4267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_MUL_FLOAT: 4367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vmuls; 4467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 4567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_REM_FLOAT_2ADDR: 4667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_REM_FLOAT: 4767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_NEG_FLOAT: { 4867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, 4967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2); 5067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 5167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee default: 5267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return true; 5367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 5467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg); 5567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg); 5667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true); 5767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR3(cUnit, (ArmOpcode)op, rlResult.lowReg, rlSrc1.lowReg, 5867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2.lowReg); 5967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee storeValue(cUnit, rlDest, rlResult); 6067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return false; 6167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee} 6267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 6367bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestatic bool genArithOpDouble(CompilationUnit* cUnit, MIR* mir, 6467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlDest, RegLocation rlSrc1, 6567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlSrc2) 6667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee{ 6767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee int op = kThumbBkpt; 6867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlResult; 6967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 7067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee switch (mir->dalvikInsn.opcode) { 7167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_ADD_DOUBLE_2ADDR: 7267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_ADD_DOUBLE: 7367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vaddd; 7467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 7567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_SUB_DOUBLE_2ADDR: 7667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_SUB_DOUBLE: 7767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vsubd; 7867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 7967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DIV_DOUBLE_2ADDR: 8067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DIV_DOUBLE: 8167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vdivd; 8267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 8367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_MUL_DOUBLE_2ADDR: 8467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_MUL_DOUBLE: 8567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2Vmuld; 8667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 8767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_REM_DOUBLE_2ADDR: 8867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_REM_DOUBLE: 8967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_NEG_DOUBLE: { 9067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, 9167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2); 9267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 9367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee default: 9467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return true; 9567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 9667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 9767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg); 9867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee assert(rlSrc1.wide); 9967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg); 10067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee assert(rlSrc2.wide); 10167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true); 10267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee assert(rlDest.wide); 10367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee assert(rlResult.wide); 10467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR3(cUnit, (ArmOpcode)op, S2D(rlResult.lowReg, rlResult.highReg), 10567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee S2D(rlSrc1.lowReg, rlSrc1.highReg), 10667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee S2D(rlSrc2.lowReg, rlSrc2.highReg)); 10767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee storeValueWide(cUnit, rlDest, rlResult); 10867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return false; 10967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee} 11067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 11167bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestatic bool genConversion(CompilationUnit* cUnit, MIR* mir) 11267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee{ 11367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee Opcode opcode = mir->dalvikInsn.opcode; 11467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee int op = kThumbBkpt; 11567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee bool longSrc = false; 11667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee bool longDest = false; 11767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee int srcReg; 11867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlSrc; 11967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlDest; 12067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlResult; 12167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 12267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee switch (opcode) { 12367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_INT_TO_FLOAT: 12467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = false; 12567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = false; 12667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtIF; 12767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 12867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_FLOAT_TO_INT: 12967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = false; 13067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = false; 13167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtFI; 13267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 13367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DOUBLE_TO_FLOAT: 13467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = true; 13567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = false; 13667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtDF; 13767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 13867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_FLOAT_TO_DOUBLE: 13967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = false; 14067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = true; 14167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtFd; 14267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 14367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_INT_TO_DOUBLE: 14467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = false; 14567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = true; 14667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtID; 14767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 14867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DOUBLE_TO_INT: 14967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longSrc = true; 15067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee longDest = false; 15167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee op = kThumb2VcvtDI; 15267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 15367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_LONG_TO_DOUBLE: 15467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_FLOAT_TO_LONG: 15567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_LONG_TO_FLOAT: 15667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_DOUBLE_TO_LONG: 15767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return genConversionPortable(cUnit, mir); 15867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee default: 15967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return true; 16067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 16167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee if (longSrc) { 16267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc = oatGetSrcWide(cUnit, mir, 0, 1); 16367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc = loadValueWide(cUnit, rlSrc, kFPReg); 16467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee srcReg = S2D(rlSrc.lowReg, rlSrc.highReg); 16567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } else { 16667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc = oatGetSrc(cUnit, mir, 0); 16767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc = loadValue(cUnit, rlSrc, kFPReg); 16867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee srcReg = rlSrc.lowReg; 16967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 17067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee if (longDest) { 17167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlDest = oatGetDestWide(cUnit, mir, 0, 1); 17267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true); 17367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR2(cUnit, (ArmOpcode)op, S2D(rlResult.lowReg, rlResult.highReg), 17467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee srcReg); 17567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee storeValueWide(cUnit, rlDest, rlResult); 17667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } else { 17767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlDest = oatGetDest(cUnit, mir, 0); 17867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true); 17967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR2(cUnit, (ArmOpcode)op, rlResult.lowReg, srcReg); 18067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee storeValue(cUnit, rlDest, rlResult); 18167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 18267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return false; 18367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee} 18467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 18567bf885d62b1473c833bece1c9e0bb624e6ba391buzbeestatic bool genCmpFP(CompilationUnit* cUnit, MIR* mir, RegLocation rlDest, 18667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlSrc1, RegLocation rlSrc2) 18767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee{ 18867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee bool isDouble; 18967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee int defaultResult; 19067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee RegLocation rlResult; 19167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 19267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee switch(mir->dalvikInsn.opcode) { 19367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_CMPL_FLOAT: 19467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee isDouble = false; 19567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee defaultResult = -1; 19667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 19767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_CMPG_FLOAT: 19867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee isDouble = false; 19967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee defaultResult = 1; 20067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 20167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_CMPL_DOUBLE: 20267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee isDouble = true; 20367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee defaultResult = -1; 20467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 20567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee case OP_CMPG_DOUBLE: 20667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee isDouble = true; 20767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee defaultResult = 1; 20867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee break; 20967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee default: 21067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return true; 21167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 21267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee if (isDouble) { 21367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg); 21467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg); 21567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee oatClobberSReg(cUnit, rlDest.sRegLow); 21667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true); 21767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee loadConstant(cUnit, rlResult.lowReg, defaultResult); 21867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR2(cUnit, kThumb2Vcmpd, S2D(rlSrc1.lowReg, r1Src2.highReg), 21967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee S2D(rlSrc2.lowReg, rlSrc2.highReg)); 22067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } else { 22167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg); 22267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg); 22367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee oatClobberSReg(cUnit, rlDest.sRegLow); 22467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true); 22567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee loadConstant(cUnit, rlResult.lowReg, defaultResult); 22667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR2(cUnit, kThumb2Vcmps, rlSrc1.lowReg, rlSrc2.lowReg); 22767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee } 22867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee assert(!FPREG(rlResult.lowReg)); 22967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR0(cUnit, kThumb2Fmstat); 23067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 23167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee genIT(cUnit, (defaultResult == -1) ? kArmCondGt : kArmCondMi, ""); 23267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee newLIR2(cUnit, kThumb2MovImmShift, rlResult.lowReg, 23367bf885d62b1473c833bece1c9e0bb624e6ba391buzbee modifiedImmediate(-defaultResult)); // Must not alter ccodes 23467bf885d62b1473c833bece1c9e0bb624e6ba391buzbee genBarrier(cUnit); 23567bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 23667bf885d62b1473c833bece1c9e0bb624e6ba391buzbee genIT(cUnit, kArmCondEq, ""); 23767bf885d62b1473c833bece1c9e0bb624e6ba391buzbee loadConstant(cUnit, rlResult.lowReg, 0); 23867bf885d62b1473c833bece1c9e0bb624e6ba391buzbee genBarrier(cUnit); 23967bf885d62b1473c833bece1c9e0bb624e6ba391buzbee 24067bf885d62b1473c833bece1c9e0bb624e6ba391buzbee storeValue(cUnit, rlDest, rlResult); 24167bf885d62b1473c833bece1c9e0bb624e6ba391buzbee return false; 24267bf885d62b1473c833bece1c9e0bb624e6ba391buzbee} 243