src/hotspot/share/interpreter/templateInterpreter.cpp
changeset 47916 bdbef8638948
parent 47688 3d1e3786d66e
child 55608 47af68c44e02
child 58678 9cf78a70fa4f
equal deleted inserted replaced
47915:d4af6b80aec3 47916:bdbef8638948
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   193 EntryPoint TemplateInterpreter::_trace_code;
   193 EntryPoint TemplateInterpreter::_trace_code;
   194 #endif // !PRODUCT
   194 #endif // !PRODUCT
   195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
   195 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
   196 EntryPoint TemplateInterpreter::_earlyret_entry;
   196 EntryPoint TemplateInterpreter::_earlyret_entry;
   197 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
   197 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
       
   198 address    TemplateInterpreter::_deopt_reexecute_return_entry;
   198 EntryPoint TemplateInterpreter::_safept_entry;
   199 EntryPoint TemplateInterpreter::_safept_entry;
   199 
   200 
   200 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
   201 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
   201 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
   202 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
   202 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
   203 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
   246     return _invokeinterface_return_entry[index];
   247     return _invokeinterface_return_entry[index];
   247   case Bytecodes::_invokedynamic:
   248   case Bytecodes::_invokedynamic:
   248     return _invokedynamic_return_entry[index];
   249     return _invokedynamic_return_entry[index];
   249   default:
   250   default:
   250     assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
   251     assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
   251     return _return_entry[length].entry(state);
   252     address entry = _return_entry[length].entry(state);
       
   253     vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index);
       
   254     return entry;
   252   }
   255   }
   253 }
   256 }
   254 
   257 
   255 
   258 
   256 address TemplateInterpreter::deopt_entry(TosState state, int length) {
   259 address TemplateInterpreter::deopt_entry(TosState state, int length) {
   257   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
   260   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
   258   return _deopt_entry[length].entry(state);
   261   address entry = _deopt_entry[length].entry(state);
       
   262   vmassert(entry != NULL, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
       
   263   return entry;
   259 }
   264 }
   260 
   265 
   261 //------------------------------------------------------------------------------------------------------------------------
   266 //------------------------------------------------------------------------------------------------------------------------
   262 // Suport for invokes
   267 // Suport for invokes
   263 
   268 
   311 // the bytecode.
   316 // the bytecode.
   312 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases
   317 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases
   313 //       that do not return "Interpreter::deopt_entry(vtos, 0)"
   318 //       that do not return "Interpreter::deopt_entry(vtos, 0)"
   314 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
   319 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
   315   assert(method->contains(bcp), "just checkin'");
   320   assert(method->contains(bcp), "just checkin'");
   316   Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
   321   Bytecodes::Code code   = Bytecodes::code_at(method, bcp);
   317   if (code == Bytecodes::_return) {
   322   if (code == Bytecodes::_return_register_finalizer) {
   318     // This is used for deopt during registration of finalizers
   323     // This is used for deopt during registration of finalizers
   319     // during Object.<init>.  We simply need to resume execution at
   324     // during Object.<init>.  We simply need to resume execution at
   320     // the standard return vtos bytecode to pop the frame normally.
   325     // the standard return vtos bytecode to pop the frame normally.
   321     // reexecuting the real bytecode would cause double registration
   326     // reexecuting the real bytecode would cause double registration
   322     // of the finalizable object.
   327     // of the finalizable object.
   323     return _normal_table.entry(Bytecodes::_return).entry(vtos);
   328     return Interpreter::deopt_reexecute_return_entry();
   324   } else {
   329   } else {
   325     return AbstractInterpreter::deopt_reexecute_entry(method, bcp);
   330     return AbstractInterpreter::deopt_reexecute_entry(method, bcp);
   326   }
   331   }
   327 }
   332 }
   328 
   333