< prev index next >

src/cpu/x86/vm/interpreter_x86_64.cpp

Print this page




 238   // We no longer need to check for JDK 1.2 since it's EOL'ed.
 239   // The following check existed in pre 1.6 implementation,
 240   //    if (Universe::is_jdk12x_version()) {
 241   //      __ should_not_reach_here();
 242   //    }
 243   // Universe::is_jdk12x_version() always returns false since
 244   // the JDK version is not yet determined when this method is called.
 245   // This method is called during interpreter_init() whereas
 246   // JDK version is only determined when universe2_init() is called.
 247 
 248   // Note: For JDK 1.3 StrictMath exists and Math.sin/cos/sqrt are
 249   //       java methods.  Interpreter::method_kind(...) will select
 250   //       this entry point for the corresponding methods in JDK 1.3.
 251   // get argument
 252 
 253   if (kind == Interpreter::java_lang_math_sqrt) {
 254     __ sqrtsd(xmm0, Address(rsp, wordSize));
 255   } else if (kind == Interpreter::java_lang_math_exp) {
 256     __ movdbl(xmm0, Address(rsp, wordSize));
 257     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dexp())));



 258   } else {
 259     __ fld_d(Address(rsp, wordSize));
 260     switch (kind) {
 261       case Interpreter::java_lang_math_sin :
 262           __ trigfunc('s');
 263           break;
 264       case Interpreter::java_lang_math_cos :
 265           __ trigfunc('c');
 266           break;
 267       case Interpreter::java_lang_math_tan :
 268           __ trigfunc('t');
 269           break;
 270       case Interpreter::java_lang_math_abs:
 271           __ fabs();
 272           break;
 273       case Interpreter::java_lang_math_log:
 274           __ flog();
 275           break;
 276       case Interpreter::java_lang_math_log10:
 277           __ flog10();
 278           break;
 279       case Interpreter::java_lang_math_pow:
 280           __ fld_d(Address(rsp, 3*wordSize)); // second argument (one
 281                                               // empty stack slot)
 282           __ pow_with_fallback(0);
 283           break;
 284       default                              :
 285           ShouldNotReachHere();
 286     }
 287 
 288     // return double result in xmm0 for interpreter and compilers.
 289     __ subptr(rsp, 2*wordSize);
 290     // Round to 64bit precision
 291     __ fstp_d(Address(rsp, 0));
 292     __ movdbl(xmm0, Address(rsp, 0));
 293     __ addptr(rsp, 2*wordSize);
 294   }




 238   // We no longer need to check for JDK 1.2 since it's EOL'ed.
 239   // The following check existed in pre 1.6 implementation,
 240   //    if (Universe::is_jdk12x_version()) {
 241   //      __ should_not_reach_here();
 242   //    }
 243   // Universe::is_jdk12x_version() always returns false since
 244   // the JDK version is not yet determined when this method is called.
 245   // This method is called during interpreter_init() whereas
 246   // JDK version is only determined when universe2_init() is called.
 247 
 248   // Note: For JDK 1.3 StrictMath exists and Math.sin/cos/sqrt are
 249   //       java methods.  Interpreter::method_kind(...) will select
 250   //       this entry point for the corresponding methods in JDK 1.3.
 251   // get argument
 252 
 253   if (kind == Interpreter::java_lang_math_sqrt) {
 254     __ sqrtsd(xmm0, Address(rsp, wordSize));
 255   } else if (kind == Interpreter::java_lang_math_exp) {
 256     __ movdbl(xmm0, Address(rsp, wordSize));
 257     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dexp())));
 258   } else if (kind == Interpreter::java_lang_math_log) {
 259     __ movdbl(xmm0, Address(rsp, wordSize));
 260     __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dlog())));
 261   } else {
 262     __ fld_d(Address(rsp, wordSize));
 263     switch (kind) {
 264       case Interpreter::java_lang_math_sin :
 265           __ trigfunc('s');
 266           break;
 267       case Interpreter::java_lang_math_cos :
 268           __ trigfunc('c');
 269           break;
 270       case Interpreter::java_lang_math_tan :
 271           __ trigfunc('t');
 272           break;
 273       case Interpreter::java_lang_math_abs:
 274           __ fabs();



 275           break;
 276       case Interpreter::java_lang_math_log10:
 277           __ flog10();
 278           break;
 279       case Interpreter::java_lang_math_pow:
 280           __ fld_d(Address(rsp, 3*wordSize)); // second argument (one
 281                                               // empty stack slot)
 282           __ pow_with_fallback(0);
 283           break;
 284       default                              :
 285           ShouldNotReachHere();
 286     }
 287 
 288     // return double result in xmm0 for interpreter and compilers.
 289     __ subptr(rsp, 2*wordSize);
 290     // Round to 64bit precision
 291     __ fstp_d(Address(rsp, 0));
 292     __ movdbl(xmm0, Address(rsp, 0));
 293     __ addptr(rsp, 2*wordSize);
 294   }


< prev index next >