--- old/src/share/vm/interpreter/templateInterpreter.hpp 2016-12-12 12:55:56.060192791 -0500 +++ new/src/share/vm/interpreter/templateInterpreter.hpp 2016-12-12 12:55:55.476189895 -0500 @@ -88,6 +88,7 @@ friend class TemplateInterpreterGenerator; friend class TemplateTable; friend class CodeCacheExtensions; + friend class BCSetTemplate; // friend class Interpreter; public: @@ -130,6 +131,8 @@ static DispatchTable _normal_table; // the normal dispatch table (used to set the active table in normal mode) static DispatchTable _safept_table; // the safepoint dispatch table (used to set the active table for safepoints) static address _wentry_point[DispatchTable::length]; // wide instructions only (vtos tosca always) + static address _typed_entry_point[Bytecodes::number_of_bcset][DispatchTable::length]; + static address _typed_wentry_point[Bytecodes::number_of_bcset][DispatchTable::length]; public: @@ -160,6 +163,14 @@ #endif // !PRODUCT static address continuation (TosState state) { return _continuation_entry.entry(state); } static address* dispatch_table(TosState state) { return _active_table.table_for(state); } + static address* typed_dispatch_table(Bytecodes::BCSet btype) { + assert(btype > 0 && btype < Bytecodes::number_of_bcset, "Invalid btype"); + return _typed_entry_point[btype]; + } + static address* typed_wide_dispatch_table(Bytecodes::BCSet btype) { + assert(btype > 0 && btype < Bytecodes::number_of_bcset, "Invalid btype"); + return _typed_wentry_point[btype]; + } static address* dispatch_table() { return _active_table.table_for(); } static int distance_from_dispatch_table(TosState state){ return _active_table.distance_from(state); } static address* normal_table(TosState state) { return _normal_table.table_for(state); }