src/cpu/x86/vm/templateInterpreter_x86_64.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:


1517   // determine code generation flags
1518   bool synchronized = false;
1519   address entry_point = NULL;
1520 
1521   switch (kind) {
1522   case Interpreter::zerolocals             :                                                                             break;
1523   case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1524   case Interpreter::native                 : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false); break;
1525   case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(true);  break;
1526   case Interpreter::empty                  : entry_point = ((InterpreterGenerator*) this)->generate_empty_entry();       break;
1527   case Interpreter::accessor               : entry_point = ((InterpreterGenerator*) this)->generate_accessor_entry();    break;
1528   case Interpreter::abstract               : entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry();    break;
1529   case Interpreter::method_handle          : entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry();break;
1530 
1531   case Interpreter::java_lang_math_sin     : // fall thru
1532   case Interpreter::java_lang_math_cos     : // fall thru
1533   case Interpreter::java_lang_math_tan     : // fall thru
1534   case Interpreter::java_lang_math_abs     : // fall thru
1535   case Interpreter::java_lang_math_log     : // fall thru
1536   case Interpreter::java_lang_math_log10   : // fall thru
1537   case Interpreter::java_lang_math_sqrt    : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind);    break;


1538   case Interpreter::java_lang_ref_reference_get
1539                                            : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
1540   default                                  : ShouldNotReachHere();                                                       break;
1541   }
1542 
1543   if (entry_point) {
1544     return entry_point;
1545   }
1546 
1547   return ((InterpreterGenerator*) this)->
1548                                 generate_normal_entry(synchronized);
1549 }
1550 
1551 // These should never be compiled since the interpreter will prefer
1552 // the compiled version to the intrinsic version.
1553 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1554   switch (method_kind(m)) {
1555     case Interpreter::java_lang_math_sin     : // fall thru
1556     case Interpreter::java_lang_math_cos     : // fall thru
1557     case Interpreter::java_lang_math_tan     : // fall thru
1558     case Interpreter::java_lang_math_abs     : // fall thru
1559     case Interpreter::java_lang_math_log     : // fall thru
1560     case Interpreter::java_lang_math_log10   : // fall thru
1561     case Interpreter::java_lang_math_sqrt    :


1562       return false;
1563     default:
1564       return true;
1565   }
1566 }
1567 
1568 // How much stack a method activation needs in words.
1569 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
1570   const int entry_size = frame::interpreter_frame_monitor_size();
1571 
1572   // total overhead size: entry_size + (saved rbp thru expr stack
1573   // bottom).  be sure to change this if you add/subtract anything
1574   // to/from the overhead area
1575   const int overhead_size =
1576     -(frame::interpreter_frame_initial_sp_offset) + entry_size;
1577 
1578   const int stub_code = frame::entry_frame_after_call_words;
1579   const int extra_stack = methodOopDesc::extra_stack_entries();
1580   const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
1581                            Interpreter::stackElementWords;




1517   // determine code generation flags
1518   bool synchronized = false;
1519   address entry_point = NULL;
1520 
1521   switch (kind) {
1522   case Interpreter::zerolocals             :                                                                             break;
1523   case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
1524   case Interpreter::native                 : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false); break;
1525   case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(true);  break;
1526   case Interpreter::empty                  : entry_point = ((InterpreterGenerator*) this)->generate_empty_entry();       break;
1527   case Interpreter::accessor               : entry_point = ((InterpreterGenerator*) this)->generate_accessor_entry();    break;
1528   case Interpreter::abstract               : entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry();    break;
1529   case Interpreter::method_handle          : entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry();break;
1530 
1531   case Interpreter::java_lang_math_sin     : // fall thru
1532   case Interpreter::java_lang_math_cos     : // fall thru
1533   case Interpreter::java_lang_math_tan     : // fall thru
1534   case Interpreter::java_lang_math_abs     : // fall thru
1535   case Interpreter::java_lang_math_log     : // fall thru
1536   case Interpreter::java_lang_math_log10   : // fall thru
1537   case Interpreter::java_lang_math_sqrt    : // fall thru
1538   case Interpreter::java_lang_math_pow     : // fall thru
1539   case Interpreter::java_lang_math_exp     : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind);    break;
1540   case Interpreter::java_lang_ref_reference_get
1541                                            : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
1542   default                                  : ShouldNotReachHere();                                                       break;
1543   }
1544 
1545   if (entry_point) {
1546     return entry_point;
1547   }
1548 
1549   return ((InterpreterGenerator*) this)->
1550                                 generate_normal_entry(synchronized);
1551 }
1552 
1553 // These should never be compiled since the interpreter will prefer
1554 // the compiled version to the intrinsic version.
1555 bool AbstractInterpreter::can_be_compiled(methodHandle m) {
1556   switch (method_kind(m)) {
1557     case Interpreter::java_lang_math_sin     : // fall thru
1558     case Interpreter::java_lang_math_cos     : // fall thru
1559     case Interpreter::java_lang_math_tan     : // fall thru
1560     case Interpreter::java_lang_math_abs     : // fall thru
1561     case Interpreter::java_lang_math_log     : // fall thru
1562     case Interpreter::java_lang_math_log10   : // fall thru
1563     case Interpreter::java_lang_math_sqrt    : // fall thru
1564     case Interpreter::java_lang_math_pow     : // fall thru
1565     case Interpreter::java_lang_math_exp     :
1566       return false;
1567     default:
1568       return true;
1569   }
1570 }
1571 
1572 // How much stack a method activation needs in words.
1573 int AbstractInterpreter::size_top_interpreter_activation(methodOop method) {
1574   const int entry_size = frame::interpreter_frame_monitor_size();
1575 
1576   // total overhead size: entry_size + (saved rbp thru expr stack
1577   // bottom).  be sure to change this if you add/subtract anything
1578   // to/from the overhead area
1579   const int overhead_size =
1580     -(frame::interpreter_frame_initial_sp_offset) + entry_size;
1581 
1582   const int stub_code = frame::entry_frame_after_call_words;
1583   const int extra_stack = methodOopDesc::extra_stack_entries();
1584   const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) *
1585                            Interpreter::stackElementWords;