mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
6930772: JSR 292 needs to support SPARC C1
C1 for SPARC needs to support JSR 292. Reviewed-by: never, jrose
This commit is contained in:
parent
c9f2ba541b
commit
2e24ba80e9
28 changed files with 164 additions and 137 deletions
|
@ -2371,9 +2371,17 @@ void LIRGenerator::do_Invoke(Invoke* x) {
|
|||
bool optimized = x->target_is_loaded() && x->target_is_final();
|
||||
assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match");
|
||||
|
||||
// JSR 292
|
||||
// Preserve the SP over MethodHandle call sites.
|
||||
ciMethod* target = x->target();
|
||||
if (target->is_method_handle_invoke()) {
|
||||
info->set_is_method_handle_invoke(true);
|
||||
__ move(FrameMap::stack_pointer(), FrameMap::method_handle_invoke_SP_save_opr());
|
||||
}
|
||||
|
||||
switch (x->code()) {
|
||||
case Bytecodes::_invokestatic:
|
||||
__ call_static(x->target(), result_register,
|
||||
__ call_static(target, result_register,
|
||||
SharedRuntime::get_resolve_static_call_stub(),
|
||||
arg_list, info);
|
||||
break;
|
||||
|
@ -2383,17 +2391,17 @@ void LIRGenerator::do_Invoke(Invoke* x) {
|
|||
// for final target we still produce an inline cache, in order
|
||||
// to be able to call mixed mode
|
||||
if (x->code() == Bytecodes::_invokespecial || optimized) {
|
||||
__ call_opt_virtual(x->target(), receiver, result_register,
|
||||
__ call_opt_virtual(target, receiver, result_register,
|
||||
SharedRuntime::get_resolve_opt_virtual_call_stub(),
|
||||
arg_list, info);
|
||||
} else if (x->vtable_index() < 0) {
|
||||
__ call_icvirtual(x->target(), receiver, result_register,
|
||||
__ call_icvirtual(target, receiver, result_register,
|
||||
SharedRuntime::get_resolve_virtual_call_stub(),
|
||||
arg_list, info);
|
||||
} else {
|
||||
int entry_offset = instanceKlass::vtable_start_offset() + x->vtable_index() * vtableEntry::size();
|
||||
int vtable_offset = entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
|
||||
__ call_virtual(x->target(), receiver, result_register, vtable_offset, arg_list, info);
|
||||
__ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info);
|
||||
}
|
||||
break;
|
||||
case Bytecodes::_invokedynamic: {
|
||||
|
@ -2432,7 +2440,7 @@ void LIRGenerator::do_Invoke(Invoke* x) {
|
|||
// Load target MethodHandle from CallSite object.
|
||||
__ load(new LIR_Address(tmp, java_dyn_CallSite::target_offset_in_bytes(), T_OBJECT), receiver);
|
||||
|
||||
__ call_dynamic(x->target(), receiver, result_register,
|
||||
__ call_dynamic(target, receiver, result_register,
|
||||
SharedRuntime::get_resolve_opt_virtual_call_stub(),
|
||||
arg_list, info);
|
||||
break;
|
||||
|
@ -2442,6 +2450,12 @@ void LIRGenerator::do_Invoke(Invoke* x) {
|
|||
break;
|
||||
}
|
||||
|
||||
// JSR 292
|
||||
// Restore the SP after MethodHandle call sites.
|
||||
if (target->is_method_handle_invoke()) {
|
||||
__ move(FrameMap::method_handle_invoke_SP_save_opr(), FrameMap::stack_pointer());
|
||||
}
|
||||
|
||||
if (x->type()->is_float() || x->type()->is_double()) {
|
||||
// Force rounding of results from non-strictfp when in strictfp
|
||||
// scope (or when we don't know the strictness of the callee, to
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue