2 * Copyright (C) 2009 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "Armv5teLIR.h"
21 bool dvmCompilerGenArithOpFloat(CompilationUnit *cUnit, MIR *mir, int vDest,
24 TemplateOpCode opCode;
26 switch (mir->dalvikInsn.opCode) {
27 case OP_ADD_FLOAT_2ADDR:
29 opCode = TEMPLATE_ADD_FLOAT_VFP;
31 case OP_SUB_FLOAT_2ADDR:
33 opCode = TEMPLATE_SUB_FLOAT_VFP;
34 case OP_DIV_FLOAT_2ADDR:
36 opCode = TEMPLATE_DIV_FLOAT_VFP;
38 case OP_MUL_FLOAT_2ADDR:
40 opCode = TEMPLATE_MUL_FLOAT_VFP;
42 case OP_REM_FLOAT_2ADDR:
45 return dvmCompilerGenArithOpFloatPortable(cUnit, mir, vDest,
51 dvmCompilerLoadValueAddress(cUnit, vDest, r0);
52 dvmCompilerLoadValueAddress(cUnit, vSrc1, r1);
53 dvmCompilerLoadValueAddress(cUnit, vSrc2, r2);
54 dvmCompilerGenDispatchToHandler(cUnit, opCode);
58 bool dvmCompilerGenArithOpDouble(CompilationUnit *cUnit, MIR *mir, int vDest,
61 TemplateOpCode opCode;
63 switch (mir->dalvikInsn.opCode) {
64 case OP_ADD_DOUBLE_2ADDR:
66 opCode = TEMPLATE_ADD_DOUBLE_VFP;
68 case OP_SUB_DOUBLE_2ADDR:
70 opCode = TEMPLATE_SUB_DOUBLE_VFP;
72 case OP_DIV_DOUBLE_2ADDR:
74 opCode = TEMPLATE_DIV_DOUBLE_VFP;
76 case OP_MUL_DOUBLE_2ADDR:
78 opCode = TEMPLATE_MUL_DOUBLE_VFP;
80 case OP_REM_DOUBLE_2ADDR:
83 return dvmCompilerGenArithOpDoublePortable(cUnit, mir, vDest,
89 dvmCompilerLoadValueAddress(cUnit, vDest, r0);
90 dvmCompilerLoadValueAddress(cUnit, vSrc1, r1);
91 dvmCompilerLoadValueAddress(cUnit, vSrc2, r2);
92 dvmCompilerGenDispatchToHandler(cUnit, opCode);
96 bool dvmCompilerGenConversion(CompilationUnit *cUnit, MIR *mir)
98 OpCode opCode = mir->dalvikInsn.opCode;
99 int vSrc1Dest = mir->dalvikInsn.vA;
100 int vSrc2 = mir->dalvikInsn.vB;
101 TemplateOpCode template;
104 case OP_INT_TO_FLOAT:
105 template = TEMPLATE_INT_TO_FLOAT_VFP;
107 case OP_FLOAT_TO_INT:
108 template = TEMPLATE_FLOAT_TO_INT_VFP;
110 case OP_DOUBLE_TO_FLOAT:
111 template = TEMPLATE_DOUBLE_TO_FLOAT_VFP;
113 case OP_FLOAT_TO_DOUBLE:
114 template = TEMPLATE_FLOAT_TO_DOUBLE_VFP;
116 case OP_INT_TO_DOUBLE:
117 template = TEMPLATE_INT_TO_DOUBLE_VFP;
119 case OP_DOUBLE_TO_INT:
120 template = TEMPLATE_DOUBLE_TO_INT_VFP;
122 case OP_FLOAT_TO_LONG:
123 case OP_LONG_TO_FLOAT:
124 case OP_DOUBLE_TO_LONG:
125 case OP_LONG_TO_DOUBLE:
126 return dvmCompilerGenConversionPortable(cUnit, mir);
130 dvmCompilerLoadValueAddress(cUnit, vSrc1Dest, r0);
131 dvmCompilerLoadValueAddress(cUnit, vSrc2, r1);
132 dvmCompilerGenDispatchToHandler(cUnit, template);
136 bool dvmCompilerGenCmpX(CompilationUnit *cUnit, MIR *mir, int vDest,
137 int vSrc1, int vSrc2)
139 TemplateOpCode template;
140 switch(mir->dalvikInsn.opCode) {
142 template = TEMPLATE_CMPL_FLOAT_VFP;
145 template = TEMPLATE_CMPG_FLOAT_VFP;
148 template = TEMPLATE_CMPL_DOUBLE_VFP;
151 template = TEMPLATE_CMPG_DOUBLE_VFP;
156 dvmCompilerLoadValueAddress(cUnit, vSrc1, r0);
157 dvmCompilerLoadValueAddress(cUnit, vSrc2, r1);
158 dvmCompilerGenDispatchToHandler(cUnit, template);
159 dvmCompilerStoreValue(cUnit, r0, vDest, r1);