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 } |