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