2975 // setup registers & access constant pool cache
2976 if (recv == noreg) recv = O0;
2977 if (flags == noreg) flags = O1;
2978 const Register temp = O2;
2979 assert_different_registers(method, ra, index, recv, flags, temp);
2980
2981 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
2982
2983 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
2984
2985 // maybe push appendix to arguments
2986 if (is_invokedynamic || is_invokehandle) {
2987 Label L_no_push;
2988 __ set((1 << ConstantPoolCacheEntry::has_appendix_shift), temp);
2989 __ btst(flags, temp);
2990 __ br(Assembler::zero, false, Assembler::pt, L_no_push);
2991 __ delayed()->nop();
2992 // Push the appendix as a trailing parameter.
2993 // This must be done before we get the receiver,
2994 // since the parameter_size includes it.
2995 assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0");
2996 __ load_resolved_reference_at_index(temp, index, /*tmp*/recv);
2997 __ verify_oop(temp);
2998 __ push_ptr(temp); // push appendix (MethodType, CallSite, etc.)
2999 __ bind(L_no_push);
3000 }
3001
3002 // load receiver if needed (after appendix is pushed so parameter size is correct)
3003 if (load_receiver) {
3004 __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, temp); // get parameter size
3005 __ load_receiver(temp, recv); // __ argument_address uses Gargs but we need Lesp
3006 __ verify_oop(recv);
3007 }
3008
3009 // compute return type
3010 __ srl(flags, ConstantPoolCacheEntry::tos_state_shift, ra);
3011 // Make sure we don't need to mask flags after the above shift
3012 ConstantPoolCacheEntry::verify_tos_state_shift();
3013 // load return address
3014 {
3015 const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
|
2975 // setup registers & access constant pool cache
2976 if (recv == noreg) recv = O0;
2977 if (flags == noreg) flags = O1;
2978 const Register temp = O2;
2979 assert_different_registers(method, ra, index, recv, flags, temp);
2980
2981 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
2982
2983 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
2984
2985 // maybe push appendix to arguments
2986 if (is_invokedynamic || is_invokehandle) {
2987 Label L_no_push;
2988 __ set((1 << ConstantPoolCacheEntry::has_appendix_shift), temp);
2989 __ btst(flags, temp);
2990 __ br(Assembler::zero, false, Assembler::pt, L_no_push);
2991 __ delayed()->nop();
2992 // Push the appendix as a trailing parameter.
2993 // This must be done before we get the receiver,
2994 // since the parameter_size includes it.
2995 __ load_resolved_reference_at_index(temp, index, /*tmp*/recv);
2996 __ verify_oop(temp);
2997 __ push_ptr(temp); // push appendix (MethodType, CallSite, etc.)
2998 __ bind(L_no_push);
2999 }
3000
3001 // load receiver if needed (after appendix is pushed so parameter size is correct)
3002 if (load_receiver) {
3003 __ and3(flags, ConstantPoolCacheEntry::parameter_size_mask, temp); // get parameter size
3004 __ load_receiver(temp, recv); // __ argument_address uses Gargs but we need Lesp
3005 __ verify_oop(recv);
3006 }
3007
3008 // compute return type
3009 __ srl(flags, ConstantPoolCacheEntry::tos_state_shift, ra);
3010 // Make sure we don't need to mask flags after the above shift
3011 ConstantPoolCacheEntry::verify_tos_state_shift();
3012 // load return address
3013 {
3014 const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
|