2974 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); |
2974 args->at(0)->load_item_force(LIR_Assembler::receiverOpr()); |
2975 receiver = args->at(0)->result(); |
2975 receiver = args->at(0)->result(); |
2976 } |
2976 } |
2977 |
2977 |
2978 // emit invoke code |
2978 // emit invoke code |
2979 bool optimized = x->target_is_loaded() && x->target_is_final(); |
|
2980 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match"); |
2979 assert(receiver->is_illegal() || receiver->is_equal(LIR_Assembler::receiverOpr()), "must match"); |
2981 |
2980 |
2982 // JSR 292 |
2981 // JSR 292 |
2983 // Preserve the SP over MethodHandle call sites, if needed. |
2982 // Preserve the SP over MethodHandle call sites, if needed. |
2984 ciMethod* target = x->target(); |
2983 ciMethod* target = x->target(); |
2999 arg_list, info); |
2998 arg_list, info); |
3000 break; |
2999 break; |
3001 case Bytecodes::_invokespecial: |
3000 case Bytecodes::_invokespecial: |
3002 case Bytecodes::_invokevirtual: |
3001 case Bytecodes::_invokevirtual: |
3003 case Bytecodes::_invokeinterface: |
3002 case Bytecodes::_invokeinterface: |
3004 // for final target we still produce an inline cache, in order |
3003 // for loaded and final (method or class) target we still produce an inline cache, |
3005 // to be able to call mixed mode |
3004 // in order to be able to call mixed mode |
3006 if (x->code() == Bytecodes::_invokespecial || optimized) { |
3005 if (x->code() == Bytecodes::_invokespecial || x->target_is_final()) { |
3007 __ call_opt_virtual(target, receiver, result_register, |
3006 __ call_opt_virtual(target, receiver, result_register, |
3008 SharedRuntime::get_resolve_opt_virtual_call_stub(), |
3007 SharedRuntime::get_resolve_opt_virtual_call_stub(), |
3009 arg_list, info); |
3008 arg_list, info); |
3010 } else if (x->vtable_index() < 0) { |
3009 } else if (x->vtable_index() < 0) { |
3011 __ call_icvirtual(target, receiver, result_register, |
3010 __ call_icvirtual(target, receiver, result_register, |