3631 // setup registers & access constant pool cache
3632 if (recv == noreg) recv = rcx;
3633 if (flags == noreg) flags = rdx;
3634 assert_different_registers(method, index, recv, flags);
3635
3636 // save 'interpreter return address'
3637 __ save_bcp();
3638
3639 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
3640
3641 // maybe push appendix to arguments (just before return address)
3642 if (is_invokedynamic || is_invokehandle) {
3643 Label L_no_push;
3644 __ testl(flags, (1 << ConstantPoolCacheEntry::has_appendix_shift));
3645 __ jcc(Assembler::zero, L_no_push);
3646 // Push the appendix as a trailing parameter.
3647 // This must be done before we get the receiver,
3648 // since the parameter_size includes it.
3649 __ push(rbx);
3650 __ mov(rbx, index);
3651 assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0");
3652 __ load_resolved_reference_at_index(index, rbx);
3653 __ pop(rbx);
3654 __ push(index); // push appendix (MethodType, CallSite, etc.)
3655 __ bind(L_no_push);
3656 }
3657
3658 // load receiver if needed (after appendix is pushed so parameter size is correct)
3659 // Note: no return address pushed yet
3660 if (load_receiver) {
3661 __ movl(recv, flags);
3662 __ andl(recv, ConstantPoolCacheEntry::parameter_size_mask);
3663 const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address
3664 const int receiver_is_at_end = -1; // back off one slot to get receiver
3665 Address recv_addr = __ argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end);
3666 __ movptr(recv, recv_addr);
3667 __ verify_oop(recv);
3668 }
3669
3670 if (save_flags) {
3671 __ movl(rbcp, flags);
|
3631 // setup registers & access constant pool cache
3632 if (recv == noreg) recv = rcx;
3633 if (flags == noreg) flags = rdx;
3634 assert_different_registers(method, index, recv, flags);
3635
3636 // save 'interpreter return address'
3637 __ save_bcp();
3638
3639 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
3640
3641 // maybe push appendix to arguments (just before return address)
3642 if (is_invokedynamic || is_invokehandle) {
3643 Label L_no_push;
3644 __ testl(flags, (1 << ConstantPoolCacheEntry::has_appendix_shift));
3645 __ jcc(Assembler::zero, L_no_push);
3646 // Push the appendix as a trailing parameter.
3647 // This must be done before we get the receiver,
3648 // since the parameter_size includes it.
3649 __ push(rbx);
3650 __ mov(rbx, index);
3651 __ load_resolved_reference_at_index(index, rbx);
3652 __ pop(rbx);
3653 __ push(index); // push appendix (MethodType, CallSite, etc.)
3654 __ bind(L_no_push);
3655 }
3656
3657 // load receiver if needed (after appendix is pushed so parameter size is correct)
3658 // Note: no return address pushed yet
3659 if (load_receiver) {
3660 __ movl(recv, flags);
3661 __ andl(recv, ConstantPoolCacheEntry::parameter_size_mask);
3662 const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address
3663 const int receiver_is_at_end = -1; // back off one slot to get receiver
3664 Address recv_addr = __ argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end);
3665 __ movptr(recv, recv_addr);
3666 __ verify_oop(recv);
3667 }
3668
3669 if (save_flags) {
3670 __ movl(rbcp, flags);
|