2726
2727 invoke_load_arguments(x, args, arg_list);
2728
2729 if (x->has_receiver()) {
2730 args->at(0)->load_item_force(LIR_Assembler::receiverOpr());
2731 receiver = args->at(0)->result();
2732 }
2733
2734 // emit invoke code
2735 bool optimized = x->target_is_loaded() && x->target_is_final();
2736 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match");
2737
2738 // JSR 292
2739 // Preserve the SP over MethodHandle call sites.
2740 ciMethod* target = x->target();
2741 if (target->is_method_handle_invoke()) {
2742 info->set_is_method_handle_invoke(true);
2743 __ move(FrameMap::stack_pointer(), FrameMap::method_handle_invoke_SP_save_opr());
2744 }
2745
2746 switch (x->code()) {
2747 case Bytecodes::_invokestatic:
2748 __ call_static(target, result_register,
2749 SharedRuntime::get_resolve_static_call_stub(),
2750 arg_list, info);
2751 break;
2752 case Bytecodes::_invokespecial:
2753 case Bytecodes::_invokevirtual:
2754 case Bytecodes::_invokeinterface:
2755 // for final target we still produce an inline cache, in order
2756 // to be able to call mixed mode
2757 if (x->code() == Bytecodes::_invokespecial || optimized) {
2758 __ call_opt_virtual(target, receiver, result_register,
2759 SharedRuntime::get_resolve_opt_virtual_call_stub(),
2760 arg_list, info);
2761 } else if (x->vtable_index() < 0) {
2762 __ call_icvirtual(target, receiver, result_register,
2763 SharedRuntime::get_resolve_virtual_call_stub(),
2764 arg_list, info);
2765 } else {
|
2726
2727 invoke_load_arguments(x, args, arg_list);
2728
2729 if (x->has_receiver()) {
2730 args->at(0)->load_item_force(LIR_Assembler::receiverOpr());
2731 receiver = args->at(0)->result();
2732 }
2733
2734 // emit invoke code
2735 bool optimized = x->target_is_loaded() && x->target_is_final();
2736 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match");
2737
2738 // JSR 292
2739 // Preserve the SP over MethodHandle call sites.
2740 ciMethod* target = x->target();
2741 if (target->is_method_handle_invoke()) {
2742 info->set_is_method_handle_invoke(true);
2743 __ move(FrameMap::stack_pointer(), FrameMap::method_handle_invoke_SP_save_opr());
2744 }
2745
2746 info->set_profiled_call(x->is_profiled());
2747
2748 switch (x->code()) {
2749 case Bytecodes::_invokestatic:
2750 __ call_static(target, result_register,
2751 SharedRuntime::get_resolve_static_call_stub(),
2752 arg_list, info);
2753 break;
2754 case Bytecodes::_invokespecial:
2755 case Bytecodes::_invokevirtual:
2756 case Bytecodes::_invokeinterface:
2757 // for final target we still produce an inline cache, in order
2758 // to be able to call mixed mode
2759 if (x->code() == Bytecodes::_invokespecial || optimized) {
2760 __ call_opt_virtual(target, receiver, result_register,
2761 SharedRuntime::get_resolve_opt_virtual_call_stub(),
2762 arg_list, info);
2763 } else if (x->vtable_index() < 0) {
2764 __ call_icvirtual(target, receiver, result_register,
2765 SharedRuntime::get_resolve_virtual_call_stub(),
2766 arg_list, info);
2767 } else {
|