src/cpu/x86/vm/templateInterpreter_x86_32.cpp

Print this page
rev 3227 : 7133857: exp() and pow() should use the x87 ISA on x86
Summary: use x87 instructions to implement exp() and pow() in interpreter/c1/c2.
Reviewed-by:


1501   // determine code generation flags
1502   bool synchronized = false;
1503   address entry_point = NULL;
1504 
1505   switch (kind) {
1506     case Interpreter::zerolocals             :                                                                             break;
1507     case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1508     case Interpreter::native                 : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false);  break;
1509     case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true);   break;
1510     case Interpreter::empty                  : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry();        break;
1511     case Interpreter::accessor               : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry();     break;
1512     case Interpreter::abstract               : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry();     break;
1513     case Interpreter::method_handle          : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break;
1514 
1515     case Interpreter::java_lang_math_sin     : // fall thru
1516     case Interpreter::java_lang_math_cos     : // fall thru
1517     case Interpreter::java_lang_math_tan     : // fall thru
1518     case Interpreter::java_lang_math_abs     : // fall thru
1519     case Interpreter::java_lang_math_log     : // fall thru
1520     case Interpreter::java_lang_math_log10   : // fall thru
1521     case Interpreter::java_lang_math_sqrt    : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind);     break;


1522     case Interpreter::java_lang_ref_reference_get
1523                                              : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
1524     default                                  : ShouldNotReachHere();                                                       break;
1525   }
1526 
1527   if (entry_point) return entry_point;
1528 
1529   return ((InterpreterGenerator*)this)->generate_normal_entry(synchronized);
1530 
1531 }
1532 
1533 // These should never be compiled since the interpreter will prefer
1534 // the compiled version to the intrinsic version.
1535 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1536   switch (method_kind(m)) {
1537     case Interpreter::java_lang_math_sin     : // fall thru
1538     case Interpreter::java_lang_math_cos     : // fall thru
1539     case Interpreter::java_lang_math_tan     : // fall thru
1540     case Interpreter::java_lang_math_abs     : // fall thru
1541     case Interpreter::java_lang_math_log     : // fall thru
1542     case Interpreter::java_lang_math_log10   : // fall thru
1543     case Interpreter::java_lang_math_sqrt    :


1544       return false;
1545     default:
1546       return true;
1547   }
1548 }
1549 
1550 // How much stack a method activation needs in words.
1551 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
1552 
1553   const int stub_code = 4;  // see generate_call_stub
1554   // Save space for one monitor to get into the interpreted method in case
1555   // the method is synchronized
1556   int monitor_size    = method->is_synchronized() ?
1557                                 1*frame::interpreter_frame_monitor_size() : 0;
1558 
1559   // total overhead size: entry_size + (saved rbp, thru expr stack bottom).
1560   // be sure to change this if you add/subtract anything to/from the overhead area
1561   const int overhead_size = -frame::interpreter_frame_initial_sp_offset;
1562 
1563   const int extra_stack = methodOopDesc::extra_stack_entries();




1501   // determine code generation flags
1502   bool synchronized = false;
1503   address entry_point = NULL;
1504 
1505   switch (kind) {
1506     case Interpreter::zerolocals             :                                                                             break;
1507     case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1508     case Interpreter::native                 : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false);  break;
1509     case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true);   break;
1510     case Interpreter::empty                  : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry();        break;
1511     case Interpreter::accessor               : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry();     break;
1512     case Interpreter::abstract               : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry();     break;
1513     case Interpreter::method_handle          : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break;
1514 
1515     case Interpreter::java_lang_math_sin     : // fall thru
1516     case Interpreter::java_lang_math_cos     : // fall thru
1517     case Interpreter::java_lang_math_tan     : // fall thru
1518     case Interpreter::java_lang_math_abs     : // fall thru
1519     case Interpreter::java_lang_math_log     : // fall thru
1520     case Interpreter::java_lang_math_log10   : // fall thru
1521     case Interpreter::java_lang_math_sqrt    : // fall thru
1522     case Interpreter::java_lang_math_pow     : // fall thru
1523     case Interpreter::java_lang_math_exp     : entry_point = ((InterpreterGenerator*)this)->generate_math_entry(kind);     break;
1524     case Interpreter::java_lang_ref_reference_get
1525                                              : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
1526     default                                  : ShouldNotReachHere();                                                       break;
1527   }
1528 
1529   if (entry_point) return entry_point;
1530 
1531   return ((InterpreterGenerator*)this)->generate_normal_entry(synchronized);
1532 
1533 }
1534 
1535 // These should never be compiled since the interpreter will prefer
1536 // the compiled version to the intrinsic version.
1537 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1538   switch (method_kind(m)) {
1539     case Interpreter::java_lang_math_sin     : // fall thru
1540     case Interpreter::java_lang_math_cos     : // fall thru
1541     case Interpreter::java_lang_math_tan     : // fall thru
1542     case Interpreter::java_lang_math_abs     : // fall thru
1543     case Interpreter::java_lang_math_log     : // fall thru
1544     case Interpreter::java_lang_math_log10   : // fall thru
1545     case Interpreter::java_lang_math_sqrt    : // fall thru
1546     case Interpreter::java_lang_math_pow     : // fall thru
1547     case Interpreter::java_lang_math_exp     :
1548       return false;
1549     default:
1550       return true;
1551   }
1552 }
1553 
1554 // How much stack a method activation needs in words.
1555 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
1556 
1557   const int stub_code = 4;  // see generate_call_stub
1558   // Save space for one monitor to get into the interpreted method in case
1559   // the method is synchronized
1560   int monitor_size    = method->is_synchronized() ?
1561                                 1*frame::interpreter_frame_monitor_size() : 0;
1562 
1563   // total overhead size: entry_size + (saved rbp, thru expr stack bottom).
1564   // be sure to change this if you add/subtract anything to/from the overhead area
1565   const int overhead_size = -frame::interpreter_frame_initial_sp_offset;
1566 
1567   const int extra_stack = methodOopDesc::extra_stack_entries();