< prev index next >
src/hotspot/share/interpreter/templateInterpreter.cpp
Print this page
rev 50307 : [mq]: cont
@@ -191,16 +191,18 @@
#ifndef PRODUCT
EntryPoint TemplateInterpreter::_trace_code;
#endif // !PRODUCT
EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
+EntryPoint TemplateInterpreter::_return_entryX[TemplateInterpreter::number_of_return_entries];
EntryPoint TemplateInterpreter::_earlyret_entry;
EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
address TemplateInterpreter::_deopt_reexecute_return_entry;
EntryPoint TemplateInterpreter::_safept_entry;
address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
+address TemplateInterpreter::_invoke_return_entryX[TemplateInterpreter::number_of_return_addrs];
address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
DispatchTable TemplateInterpreter::_active_table;
DispatchTable TemplateInterpreter::_normal_table;
@@ -233,25 +235,29 @@
/**
* Returns the return entry address for the given top-of-stack state and bytecode.
*/
address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
+ return return_entry(state, length, code, false);
+}
+
+address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code, bool X) {
guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
const int index = TosState_as_index(state);
switch (code) {
case Bytecodes::_invokestatic:
case Bytecodes::_invokespecial:
case Bytecodes::_invokevirtual:
case Bytecodes::_invokehandle:
- return _invoke_return_entry[index];
+ return X ? _invoke_return_entryX[index] : _invoke_return_entry[index];
case Bytecodes::_invokeinterface:
return _invokeinterface_return_entry[index];
case Bytecodes::_invokedynamic:
return _invokedynamic_return_entry[index];
default:
assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
- address entry = _return_entry[length].entry(state);
+ address entry = (X ? _return_entryX[length] : _return_entry[length]).entry(state);
vmassert(entry != NULL, "unsupported return entry requested, length=%d state=%d", length, index);
return entry;
}
}
< prev index next >