fp_mips.cc revision 57b86d47b66322693a070185fadfb43cb9c12eab
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
1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "oat/runtime/oat_support_entrypoints.h"
1857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
19e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
20e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
215de3494e4297c0d480409da3fecee39173f1d4e1buzbeebool genArithOpFloat(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
225de3494e4297c0d480409da3fecee39173f1d4e1buzbee                     RegLocation rlSrc1, RegLocation rlSrc2)
23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
24e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#ifdef __mips_hard_float
25e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int op = kMipsNop;
26e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    RegLocation rlResult;
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /*
29e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Don't attempt to optimize register usage since these opcodes call out to
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * the handlers.
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     */
32e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    switch (mir->dalvikInsn.opcode) {
33adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::ADD_FLOAT_2ADDR:
34adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::ADD_FLOAT:
35e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFadds;
36e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
37adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::SUB_FLOAT_2ADDR:
38adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::SUB_FLOAT:
39e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFsubs;
40e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
41adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DIV_FLOAT_2ADDR:
42adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DIV_FLOAT:
43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFdivs;
44e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
45adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::MUL_FLOAT_2ADDR:
46adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::MUL_FLOAT:
47e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFmuls;
48e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
49adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::REM_FLOAT_2ADDR:
50adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::REM_FLOAT:
51adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::NEG_FLOAT: {
52e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
53e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
54e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        default:
55e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return true;
56e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
57e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
58e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg);
59e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
605de3494e4297c0d480409da3fecee39173f1d4e1buzbee    newLIR3(cUnit, (MipsOpCode)op, rlResult.lowReg, rlSrc1.lowReg,
615de3494e4297c0d480409da3fecee39173f1d4e1buzbee                    rlSrc2.lowReg);
62e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    storeValue(cUnit, rlDest, rlResult);
63e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
64e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return false;
65e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#else
6611f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
67e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
68e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
69e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
70e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeestatic bool genArithOpDouble(CompilationUnit *cUnit, MIR *mir,
71e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                             RegLocation rlDest, RegLocation rlSrc1,
72e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                             RegLocation rlSrc2)
73e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
74e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#ifdef __mips_hard_float
75e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int op = kMipsNop;
76e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    RegLocation rlResult;
77e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
78e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    switch (mir->dalvikInsn.opcode) {
79adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::ADD_DOUBLE_2ADDR:
80adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::ADD_DOUBLE:
81e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFaddd;
82e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
83adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::SUB_DOUBLE_2ADDR:
84adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::SUB_DOUBLE:
85e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFsubd;
86e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
87adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DIV_DOUBLE_2ADDR:
88adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DIV_DOUBLE:
89e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFdivd;
90e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
91adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::MUL_DOUBLE_2ADDR:
92adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::MUL_DOUBLE:
93e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFmuld;
94e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
95adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::REM_DOUBLE_2ADDR:
96adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::REM_DOUBLE:
97adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::NEG_DOUBLE: {
98e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
99e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
100e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        default:
101e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return true;
102e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
103e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
104e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    DCHECK(rlSrc1.wide);
105e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg);
106e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    DCHECK(rlSrc2.wide);
107e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
108e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    DCHECK(rlDest.wide);
109e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    DCHECK(rlResult.wide);
110e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    newLIR3(cUnit, (MipsOpCode)op, S2D(rlResult.lowReg, rlResult.highReg),
111e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            S2D(rlSrc1.lowReg, rlSrc1.highReg),
112e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            S2D(rlSrc2.lowReg, rlSrc2.highReg));
113e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    storeValueWide(cUnit, rlDest, rlResult);
114e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return false;
115e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#else
11611f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
117e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
118e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
119e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
120e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeestatic bool genConversion(CompilationUnit *cUnit, MIR *mir)
121e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
1225de3494e4297c0d480409da3fecee39173f1d4e1buzbee#ifdef __mips_hard_float
123adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes    Instruction::Code opcode = mir->dalvikInsn.opcode;
124e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    bool longSrc = false;
125e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    bool longDest = false;
126e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    RegLocation rlSrc;
127e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    RegLocation rlDest;
128e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int op = kMipsNop;
129e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int srcReg;
130e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    RegLocation rlResult;
131e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    switch (opcode) {
132adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::INT_TO_FLOAT:
133e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longSrc = false;
134e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longDest = false;
135e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFcvtsw;
136e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
137adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DOUBLE_TO_FLOAT:
138e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longSrc = true;
139e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longDest = false;
140e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFcvtsd;
141e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
142adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::FLOAT_TO_DOUBLE:
143e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longSrc = false;
144e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longDest = true;
145e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFcvtds;
146e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
147adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::INT_TO_DOUBLE:
148e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longSrc = false;
149e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            longDest = true;
150e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            op = kMipsFcvtdw;
151e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
152adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::FLOAT_TO_INT:
153adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DOUBLE_TO_INT:
154adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::LONG_TO_DOUBLE:
155adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::FLOAT_TO_LONG:
156adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::LONG_TO_FLOAT:
157adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::DOUBLE_TO_LONG:
158e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return genConversionPortable(cUnit, mir);
159e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        default:
160e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return true;
161e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
162e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    if (longSrc) {
163e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlSrc = oatGetSrcWide(cUnit, mir, 0, 1);
164e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlSrc = loadValueWide(cUnit, rlSrc, kFPReg);
165e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        srcReg = S2D(rlSrc.lowReg, rlSrc.highReg);
166e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    } else {
167e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlSrc = oatGetSrc(cUnit, mir, 0);
168e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlSrc = loadValue(cUnit, rlSrc, kFPReg);
169e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        srcReg = rlSrc.lowReg;
170e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
171e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    if (longDest) {
172e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlDest = oatGetDestWide(cUnit, mir, 0, 1);
173e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
174e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        newLIR2(cUnit, (MipsOpCode)op, S2D(rlResult.lowReg, rlResult.highReg), srcReg);
175e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        storeValueWide(cUnit, rlDest, rlResult);
176e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    } else {
177e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlDest = oatGetDest(cUnit, mir, 0);
178e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
179e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        newLIR2(cUnit, (MipsOpCode)op, rlResult.lowReg, srcReg);
180e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        storeValue(cUnit, rlDest, rlResult);
181e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
182e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return false;
183e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#else
18411f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    return genConversionPortable(cUnit, mir);
185e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#endif
186e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
187e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
188e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeestatic bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
189e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                     RegLocation rlSrc1, RegLocation rlSrc2)
190e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
191e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    bool wide = true;
19211f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    int offset;
193e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
194b25c3f6a86dc634ce44fb2849385b49465caa84dElliott Hughes    switch (mir->dalvikInsn.opcode) {
195adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::CMPL_FLOAT:
19657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers            offset = ENTRYPOINT_OFFSET(pCmplFloat);
197e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            wide = false;
198e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
199adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::CMPG_FLOAT:
20057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers            offset = ENTRYPOINT_OFFSET(pCmpgFloat);
201e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            wide = false;
202e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
203adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::CMPL_DOUBLE:
20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers            offset = ENTRYPOINT_OFFSET(pCmplDouble);
205e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
206adb8c67f6d87a160d4e3a8afea7cb93f6c14568bElliott Hughes        case Instruction::CMPG_DOUBLE:
20757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers            offset = ENTRYPOINT_OFFSET(pCmpgDouble);
208e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
209e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        default:
210e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            return true;
211e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
21211f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    oatFlushAllRegs(cUnit);
21311f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    oatLockCallTemps(cUnit);
21411f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    if (wide) {
21511f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee        loadValueDirectWideFixed(cUnit, rlSrc1, rARG0, rARG1);
21611f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee        loadValueDirectWideFixed(cUnit, rlSrc2, rARG2, rARG3);
21711f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    } else {
21811f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee        loadValueDirectFixed(cUnit, rlSrc1, rARG0);
21911f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee        loadValueDirectFixed(cUnit, rlSrc2, rARG1);
22011f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    }
22111f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    int rTgt = loadHelper(cUnit, offset);
22211f9d2130e938511efceb6d2a4793cee7dfdde35Bill Buzbee    opReg(cUnit, kOpBlx, rTgt);
223f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian Rogers    RegLocation rlResult = oatGetReturn(cUnit, false);
224e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    storeValue(cUnit, rlDest, rlResult);
225e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return false;
226e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
227e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
228e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} //  namespace art
229