blob: db3b9286257b4f21bdc9e9f8f53024e379916be5 [file] [log] [blame]
buzbeee88dfbf2012-03-05 11:19:57 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17namespace art {
18
19bool genArithOpFloat(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
20 RegLocation rlSrc1, RegLocation rlSrc2)
21{
22 UNIMPLEMENTED(WARNING) << "genArithOpFloat";
23 return false;
24#if 0
25#ifdef __mips_hard_float
26 int op = kMipsNop;
27 RegLocation rlResult;
28
29 /*
30 * Don't attempt to optimize register usage since these opcodes call out to
31 * the handlers.
32 */
33 switch (mir->dalvikInsn.opcode) {
34 case OP_ADD_FLOAT_2ADDR:
35 case OP_ADD_FLOAT:
36 op = kMipsFadds;
37 break;
38 case OP_SUB_FLOAT_2ADDR:
39 case OP_SUB_FLOAT:
40 op = kMipsFsubs;
41 break;
42 case OP_DIV_FLOAT_2ADDR:
43 case OP_DIV_FLOAT:
44 op = kMipsFdivs;
45 break;
46 case OP_MUL_FLOAT_2ADDR:
47 case OP_MUL_FLOAT:
48 op = kMipsFmuls;
49 break;
50 case OP_REM_FLOAT_2ADDR:
51 case OP_REM_FLOAT:
52 case OP_NEG_FLOAT: {
53 return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
54 }
55 default:
56 return true;
57 }
58 rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
59 rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg);
60 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
61 newLIR3(cUnit, (MipsOpCode)op, rlResult.lowReg, rlSrc1.lowReg,
62 rlSrc2.lowReg);
63 storeValue(cUnit, rlDest, rlResult);
64
65 return false;
66#else
67 return genArithOpFloatPortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
68#endif
69#endif
70}
71
72static bool genArithOpDouble(CompilationUnit *cUnit, MIR *mir,
73 RegLocation rlDest, RegLocation rlSrc1,
74 RegLocation rlSrc2)
75{
76 UNIMPLEMENTED(WARNING) << "genArithOpDouble";
77 return false;
78#if 0
79#ifdef __mips_hard_float
80 int op = kMipsNop;
81 RegLocation rlResult;
82
83 switch (mir->dalvikInsn.opcode) {
84 case OP_ADD_DOUBLE_2ADDR:
85 case OP_ADD_DOUBLE:
86 op = kMipsFaddd;
87 break;
88 case OP_SUB_DOUBLE_2ADDR:
89 case OP_SUB_DOUBLE:
90 op = kMipsFsubd;
91 break;
92 case OP_DIV_DOUBLE_2ADDR:
93 case OP_DIV_DOUBLE:
94 op = kMipsFdivd;
95 break;
96 case OP_MUL_DOUBLE_2ADDR:
97 case OP_MUL_DOUBLE:
98 op = kMipsFmuld;
99 break;
100 case OP_REM_DOUBLE_2ADDR:
101 case OP_REM_DOUBLE:
102 case OP_NEG_DOUBLE: {
103 return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
104 }
105 default:
106 return true;
107 }
108 rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
109 DCHECK(rlSrc1.wide);
110 rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg);
111 DCHECK(rlSrc2.wide);
112 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
113 DCHECK(rlDest.wide);
114 DCHECK(rlResult.wide);
115 newLIR3(cUnit, (MipsOpCode)op, S2D(rlResult.lowReg, rlResult.highReg),
116 S2D(rlSrc1.lowReg, rlSrc1.highReg),
117 S2D(rlSrc2.lowReg, rlSrc2.highReg));
118 storeValueWide(cUnit, rlDest, rlResult);
119 return false;
120#else
121 return genArithOpDoublePortable(cUnit, mir, rlDest, rlSrc1, rlSrc2);
122#endif
123#endif
124}
125
126static bool genConversion(CompilationUnit *cUnit, MIR *mir)
127{
128 UNIMPLEMENTED(WARNING) << "genConversion";
129 return false;
130#if 0
131#ifdef __mips_hard_float
132 Opcode opcode = mir->dalvikInsn.opcode;
133 bool longSrc = false;
134 bool longDest = false;
135 RegLocation rlSrc;
136 RegLocation rlDest;
137 int op = kMipsNop;
138 int srcReg;
139 RegLocation rlResult;
140 switch (opcode) {
141 case OP_INT_TO_FLOAT:
142 longSrc = false;
143 longDest = false;
144 op = kMipsFcvtsw;
145 break;
146 case OP_DOUBLE_TO_FLOAT:
147 longSrc = true;
148 longDest = false;
149 op = kMipsFcvtsd;
150 break;
151 case OP_FLOAT_TO_DOUBLE:
152 longSrc = false;
153 longDest = true;
154 op = kMipsFcvtds;
155 break;
156 case OP_INT_TO_DOUBLE:
157 longSrc = false;
158 longDest = true;
159 op = kMipsFcvtdw;
160 break;
161 case OP_FLOAT_TO_INT:
162 case OP_DOUBLE_TO_INT:
163 case OP_LONG_TO_DOUBLE:
164 case OP_FLOAT_TO_LONG:
165 case OP_LONG_TO_FLOAT:
166 case OP_DOUBLE_TO_LONG:
167 return genConversionPortable(cUnit, mir);
168 default:
169 return true;
170 }
171 if (longSrc) {
172 rlSrc = oatGetSrcWide(cUnit, mir, 0, 1);
173 rlSrc = loadValueWide(cUnit, rlSrc, kFPReg);
174 srcReg = S2D(rlSrc.lowReg, rlSrc.highReg);
175 } else {
176 rlSrc = oatGetSrc(cUnit, mir, 0);
177 rlSrc = loadValue(cUnit, rlSrc, kFPReg);
178 srcReg = rlSrc.lowReg;
179 }
180 if (longDest) {
181 rlDest = oatGetDestWide(cUnit, mir, 0, 1);
182 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
183 newLIR2(cUnit, (MipsOpCode)op, S2D(rlResult.lowReg, rlResult.highReg), srcReg);
184 storeValueWide(cUnit, rlDest, rlResult);
185 } else {
186 rlDest = oatGetDest(cUnit, mir, 0);
187 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
188 newLIR2(cUnit, (MipsOpCode)op, rlResult.lowReg, srcReg);
189 storeValue(cUnit, rlDest, rlResult);
190 }
191 return false;
192#else
193 return genConversionPortable(cUnit, mir);
194#endif
195#endif
196}
197
198static bool genCmpFP(CompilationUnit *cUnit, MIR *mir, RegLocation rlDest,
199 RegLocation rlSrc1, RegLocation rlSrc2)
200{
201 UNIMPLEMENTED(WARNING) << "genCmpFP";
202#if 0
203 bool wide = true;
204 int offset;
205
206 switch(mir->dalvikInsn.opcode) {
207 case OP_CMPL_FLOAT:
208 offset = OFFSETOF_MEMBER(Thread, pCmplFloat);
209 wide = false;
210 break;
211 case OP_CMPG_FLOAT:
212 offset = OFFSETOF_MEMBER(Thread, pCmpgFloat);
213 wide = false;
214 break;
215 case OP_CMPL_DOUBLE:
216 offset = OFFSETOF_MEMBER(Thread, pCmplDouble);
217 break;
218 case OP_CMPG_DOUBLE:
219 offset = OFFSETOF_MEMBER(Thread, pCmpgDouble);
220 break;
221 default:
222 return true;
223 }
224 oatFlushAllRegs(cUnit);
225 oatLockCallTemps(cUnit);
226 if (wide) {
227 loadValueDirectWideFixed(cUnit, rlSrc1, rARG0, rARG1);
228 loadValueDirectWideFixed(cUnit, rlSrc2, rARG2, rARG3);
229 } else {
230 loadValueDirectFixed(cUnit, rlSrc1, rARG0);
231 loadValueDirectFixed(cUnit, rlSrc2, rARG1);
232 }
233 int rTgt = loadHelper(cUnit, offset);
234 opReg(cUnit, kOpBlx, rTgt);
235 RegLocation rlResult = oatGetReturn(cUnit);
236 storeValue(cUnit, rlDest, rlResult);
237#endif
238 return false;
239}
240
241} // namespace art