187 case Interpreter::java_lang_math_log :
188 case Interpreter::java_lang_math_log10 :
189 case Interpreter::java_lang_math_exp :
190 entry_point = __ pc();
191 __ ldrd(v0, Address(esp));
192 __ mov(sp, r13);
193 __ mov(r19, lr);
194 continuation = r19; // The first callee-saved register
195 generate_transcendental_entry(kind, 1);
196 break;
197 case Interpreter::java_lang_math_pow :
198 entry_point = __ pc();
199 __ mov(r19, lr);
200 continuation = r19;
201 __ ldrd(v0, Address(esp, 2 * Interpreter::stackElementSize));
202 __ ldrd(v1, Address(esp));
203 __ mov(sp, r13);
204 generate_transcendental_entry(kind, 2);
205 break;
206 case Interpreter::java_lang_math_fmaD :
207 case Interpreter::java_lang_math_fmaF :
208 return NULL;
209 default:
210 ;
211 }
212 if (entry_point) {
213 __ br(continuation);
214 }
215
216 return entry_point;
217 }
218
219 // double trigonometrics and transcendentals
220 // static jdouble dsin(jdouble x);
221 // static jdouble dcos(jdouble x);
222 // static jdouble dtan(jdouble x);
223 // static jdouble dlog(jdouble x);
224 // static jdouble dlog10(jdouble x);
225 // static jdouble dexp(jdouble x);
226 // static jdouble dpow(jdouble x, jdouble y);
227
228 void TemplateInterpreterGenerator::generate_transcendental_entry(AbstractInterpreter::MethodKind kind, int fpargs) {
|
187 case Interpreter::java_lang_math_log :
188 case Interpreter::java_lang_math_log10 :
189 case Interpreter::java_lang_math_exp :
190 entry_point = __ pc();
191 __ ldrd(v0, Address(esp));
192 __ mov(sp, r13);
193 __ mov(r19, lr);
194 continuation = r19; // The first callee-saved register
195 generate_transcendental_entry(kind, 1);
196 break;
197 case Interpreter::java_lang_math_pow :
198 entry_point = __ pc();
199 __ mov(r19, lr);
200 continuation = r19;
201 __ ldrd(v0, Address(esp, 2 * Interpreter::stackElementSize));
202 __ ldrd(v1, Address(esp));
203 __ mov(sp, r13);
204 generate_transcendental_entry(kind, 2);
205 break;
206 case Interpreter::java_lang_math_fmaD :
207 if (UseFMA) {
208 entry_point = __ pc();
209 __ ldrd(v0, Address(esp, 4 * Interpreter::stackElementSize));
210 __ ldrd(v1, Address(esp, 2 * Interpreter::stackElementSize));
211 __ ldrd(v2, Address(esp));
212 __ fmaddd(v0, v0, v1, v2);
213 __ mov(sp, r13); // Restore caller's SP
214 }
215 break;
216 case Interpreter::java_lang_math_fmaF :
217 if (UseFMA) {
218 entry_point = __ pc();
219 __ ldrs(v0, Address(esp, 2 * Interpreter::stackElementSize));
220 __ ldrs(v1, Address(esp, Interpreter::stackElementSize));
221 __ ldrs(v2, Address(esp));
222 __ fmadds(v0, v0, v1, v2);
223 __ mov(sp, r13); // Restore caller's SP
224 }
225 break;
226 default:
227 ;
228 }
229 if (entry_point) {
230 __ br(continuation);
231 }
232
233 return entry_point;
234 }
235
236 // double trigonometrics and transcendentals
237 // static jdouble dsin(jdouble x);
238 // static jdouble dcos(jdouble x);
239 // static jdouble dtan(jdouble x);
240 // static jdouble dlog(jdouble x);
241 // static jdouble dlog10(jdouble x);
242 // static jdouble dexp(jdouble x);
243 // static jdouble dpow(jdouble x, jdouble y);
244
245 void TemplateInterpreterGenerator::generate_transcendental_entry(AbstractInterpreter::MethodKind kind, int fpargs) {
|