< prev index next >

src/share/vm/interpreter/templateInterpreter.cpp

Print this page




  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "code/codeCacheExtensions.hpp"
  27 #include "interpreter/interpreter.hpp"
  28 #include "interpreter/interpreterRuntime.hpp"
  29 #include "interpreter/interp_masm.hpp"
  30 #include "interpreter/templateInterpreter.hpp"
  31 #include "interpreter/templateInterpreterGenerator.hpp"
  32 #include "interpreter/templateTable.hpp"

  33 #include "memory/resourceArea.hpp"
  34 #include "runtime/logTimer.hpp"
  35 
  36 #ifndef CC_INTERP
  37 
  38 # define __ _masm->
  39 
  40 void TemplateInterpreter::initialize() {
  41   if (_code != NULL) return;
  42   // assertions
  43   assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length,
  44          "dispatch table too small");
  45 
  46   AbstractInterpreter::initialize();
  47 
  48   TemplateTable::initialize();
  49 


  50   // generate interpreter
  51   { ResourceMark rm;
  52     TraceStartupTime timer("Interpreter generation");
  53     int code_size = InterpreterCodeSize;
  54     NOT_PRODUCT(code_size *= 4;)  // debug uses extra interpreter code space
  55 #if INCLUDE_JVMTI
  56     if (CodeCacheExtensions::saving_generated_interpreter()) {
  57       // May requires several versions of the codelets.
  58       // Final size will automatically be optimized.
  59       code_size *= 2;
  60     }
  61 #endif
  62     _code = new StubQueue(new InterpreterCodeletInterface, code_size, NULL,
  63                           "Interpreter");
  64     TemplateInterpreterGenerator g(_code);
  65   }
  66   if (PrintInterpreter) {
  67     if (CodeCacheExtensions::saving_generated_interpreter() &&
  68         CodeCacheExtensions::use_pregenerated_interpreter()) {
  69       ResourceMark rm;
  70       tty->print("Printing the newly generated interpreter first");
  71       print();
  72       tty->print("Printing the pregenerated interpreter next");
  73     }
  74   }
  75 
  76   // Install the pregenerated interpreter code before printing it
  77   CodeCacheExtensions::complete_step(CodeCacheExtensionsSteps::TemplateInterpreter);
  78 
  79   if (PrintInterpreter) {
  80     ResourceMark rm;
  81     print();
  82   }
  83 


  84   // initialize dispatch table
  85   _active_table = _normal_table;
  86 }
  87 
  88 //------------------------------------------------------------------------------------------------------------------------
  89 // Implementation of EntryPoint
  90 
  91 EntryPoint::EntryPoint() {
  92   assert(number_of_states == 10, "check the code below");
  93   _entry[btos] = NULL;
  94   _entry[ctos] = NULL;
  95   _entry[stos] = NULL;
  96   _entry[atos] = NULL;
  97   _entry[itos] = NULL;
  98   _entry[ltos] = NULL;
  99   _entry[ftos] = NULL;
 100   _entry[dtos] = NULL;
 101   _entry[qtos] = NULL;
 102   _entry[vtos] = NULL;
 103 }


 207 address    TemplateInterpreter::_throw_StackOverflowError_entry             = NULL;
 208 address    TemplateInterpreter::_throw_exception_entry                      = NULL;
 209 
 210 #ifndef PRODUCT
 211 EntryPoint TemplateInterpreter::_trace_code;
 212 #endif // !PRODUCT
 213 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
 214 EntryPoint TemplateInterpreter::_earlyret_entry;
 215 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
 216 EntryPoint TemplateInterpreter::_continuation_entry;
 217 EntryPoint TemplateInterpreter::_safept_entry;
 218 
 219 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
 220 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
 221 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
 222 
 223 DispatchTable TemplateInterpreter::_active_table;
 224 DispatchTable TemplateInterpreter::_normal_table;
 225 DispatchTable TemplateInterpreter::_safept_table;
 226 address    TemplateInterpreter::_wentry_point[DispatchTable::length];


 227 
 228 
 229 //------------------------------------------------------------------------------------------------------------------------
 230 // Entry points
 231 
 232 /**
 233  * Returns the return entry table for the given invoke bytecode.
 234  */
 235 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
 236   switch (code) {
 237   case Bytecodes::_invokestatic:
 238   case Bytecodes::_invokespecial:
 239   case Bytecodes::_invokevirtual:
 240   case Bytecodes::_invokedirect:
 241   case Bytecodes::_invokehandle:
 242     return Interpreter::invoke_return_entry_table();
 243   case Bytecodes::_invokeinterface:
 244     return Interpreter::invokeinterface_return_entry_table();
 245   case Bytecodes::_invokedynamic:
 246     return Interpreter::invokedynamic_return_entry_table();




  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "code/codeCacheExtensions.hpp"
  27 #include "interpreter/interpreter.hpp"
  28 #include "interpreter/interpreterRuntime.hpp"
  29 #include "interpreter/interp_masm.hpp"
  30 #include "interpreter/templateInterpreter.hpp"
  31 #include "interpreter/templateInterpreterGenerator.hpp"
  32 #include "interpreter/templateTable.hpp"
  33 #include "interpreter/extendedBytecodes.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "runtime/logTimer.hpp"
  36 
  37 #ifndef CC_INTERP
  38 
  39 # define __ _masm->
  40 
  41 void TemplateInterpreter::initialize() {
  42   if (_code != NULL) return;
  43   // assertions
  44   assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length,
  45          "dispatch table too small");
  46 
  47   AbstractInterpreter::initialize();
  48 
  49   TemplateTable::initialize();
  50 
  51   BCSetTemplate::initialize();
  52 
  53   // generate interpreter
  54   { ResourceMark rm;
  55     TraceStartupTime timer("Interpreter generation");
  56     int code_size = InterpreterCodeSize;
  57     NOT_PRODUCT(code_size *= 4;)  // debug uses extra interpreter code space
  58 #if INCLUDE_JVMTI
  59     if (CodeCacheExtensions::saving_generated_interpreter()) {
  60       // May requires several versions of the codelets.
  61       // Final size will automatically be optimized.
  62       code_size *= 2;
  63     }
  64 #endif
  65     _code = new StubQueue(new InterpreterCodeletInterface, code_size, NULL,
  66                           "Interpreter");
  67     TemplateInterpreterGenerator g(_code);
  68   }
  69   if (PrintInterpreter) {
  70     if (CodeCacheExtensions::saving_generated_interpreter() &&
  71         CodeCacheExtensions::use_pregenerated_interpreter()) {
  72       ResourceMark rm;
  73       tty->print("Printing the newly generated interpreter first");
  74       print();
  75       tty->print("Printing the pregenerated interpreter next");
  76     }
  77   }
  78 
  79   // Install the pregenerated interpreter code before printing it
  80   CodeCacheExtensions::complete_step(CodeCacheExtensionsSteps::TemplateInterpreter);
  81 
  82   if (PrintInterpreter) {
  83     ResourceMark rm;
  84     print();
  85   }
  86 
  87   TemplateTable::cleanup();
  88 
  89   // initialize dispatch table
  90   _active_table = _normal_table;
  91 }
  92 
  93 //------------------------------------------------------------------------------------------------------------------------
  94 // Implementation of EntryPoint
  95 
  96 EntryPoint::EntryPoint() {
  97   assert(number_of_states == 10, "check the code below");
  98   _entry[btos] = NULL;
  99   _entry[ctos] = NULL;
 100   _entry[stos] = NULL;
 101   _entry[atos] = NULL;
 102   _entry[itos] = NULL;
 103   _entry[ltos] = NULL;
 104   _entry[ftos] = NULL;
 105   _entry[dtos] = NULL;
 106   _entry[qtos] = NULL;
 107   _entry[vtos] = NULL;
 108 }


 212 address    TemplateInterpreter::_throw_StackOverflowError_entry             = NULL;
 213 address    TemplateInterpreter::_throw_exception_entry                      = NULL;
 214 
 215 #ifndef PRODUCT
 216 EntryPoint TemplateInterpreter::_trace_code;
 217 #endif // !PRODUCT
 218 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
 219 EntryPoint TemplateInterpreter::_earlyret_entry;
 220 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
 221 EntryPoint TemplateInterpreter::_continuation_entry;
 222 EntryPoint TemplateInterpreter::_safept_entry;
 223 
 224 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
 225 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
 226 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
 227 
 228 DispatchTable TemplateInterpreter::_active_table;
 229 DispatchTable TemplateInterpreter::_normal_table;
 230 DispatchTable TemplateInterpreter::_safept_table;
 231 address    TemplateInterpreter::_wentry_point[DispatchTable::length];
 232 address    TemplateInterpreter::_typed_entry_point[Bytecodes::number_of_bcset][DispatchTable::length];
 233 address    TemplateInterpreter::_typed_wentry_point[Bytecodes::number_of_bcset][DispatchTable::length];
 234 
 235 
 236 //------------------------------------------------------------------------------------------------------------------------
 237 // Entry points
 238 
 239 /**
 240  * Returns the return entry table for the given invoke bytecode.
 241  */
 242 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
 243   switch (code) {
 244   case Bytecodes::_invokestatic:
 245   case Bytecodes::_invokespecial:
 246   case Bytecodes::_invokevirtual:
 247   case Bytecodes::_invokedirect:
 248   case Bytecodes::_invokehandle:
 249     return Interpreter::invoke_return_entry_table();
 250   case Bytecodes::_invokeinterface:
 251     return Interpreter::invokeinterface_return_entry_table();
 252   case Bytecodes::_invokedynamic:
 253     return Interpreter::invokedynamic_return_entry_table();


< prev index next >