3211
3212 // setup registers & access constant pool cache
3213 if (recv == noreg) recv = r2;
3214 if (flags == noreg) flags = r3;
3215 assert_different_registers(method, index, recv, flags);
3216
3217 // save 'interpreter return address'
3218 __ save_bcp();
3219
3220 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
3221
3222 // maybe push appendix to arguments (just before return address)
3223 if (is_invokedynamic || is_invokehandle) {
3224 Label L_no_push;
3225 __ tbz(flags, ConstantPoolCacheEntry::has_appendix_shift, L_no_push);
3226 // Push the appendix as a trailing parameter.
3227 // This must be done before we get the receiver,
3228 // since the parameter_size includes it.
3229 __ push(r19);
3230 __ mov(r19, index);
3231 assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0");
3232 __ load_resolved_reference_at_index(index, r19);
3233 __ pop(r19);
3234 __ push(index); // push appendix (MethodType, CallSite, etc.)
3235 __ bind(L_no_push);
3236 }
3237
3238 // load receiver if needed (note: no return address pushed yet)
3239 if (load_receiver) {
3240 __ andw(recv, flags, ConstantPoolCacheEntry::parameter_size_mask);
3241 // FIXME -- is this actually correct? looks like it should be 2
3242 // const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address
3243 // const int receiver_is_at_end = -1; // back off one slot to get receiver
3244 // Address recv_addr = __ argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end);
3245 // __ movptr(recv, recv_addr);
3246 __ add(rscratch1, esp, recv, ext::uxtx, 3); // FIXME: uxtb here?
3247 __ ldr(recv, Address(rscratch1, -Interpreter::expr_offset_in_bytes(1)));
3248 __ verify_oop(recv);
3249 }
3250
3251 // compute return type
|
3211
3212 // setup registers & access constant pool cache
3213 if (recv == noreg) recv = r2;
3214 if (flags == noreg) flags = r3;
3215 assert_different_registers(method, index, recv, flags);
3216
3217 // save 'interpreter return address'
3218 __ save_bcp();
3219
3220 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
3221
3222 // maybe push appendix to arguments (just before return address)
3223 if (is_invokedynamic || is_invokehandle) {
3224 Label L_no_push;
3225 __ tbz(flags, ConstantPoolCacheEntry::has_appendix_shift, L_no_push);
3226 // Push the appendix as a trailing parameter.
3227 // This must be done before we get the receiver,
3228 // since the parameter_size includes it.
3229 __ push(r19);
3230 __ mov(r19, index);
3231 __ load_resolved_reference_at_index(index, r19);
3232 __ pop(r19);
3233 __ push(index); // push appendix (MethodType, CallSite, etc.)
3234 __ bind(L_no_push);
3235 }
3236
3237 // load receiver if needed (note: no return address pushed yet)
3238 if (load_receiver) {
3239 __ andw(recv, flags, ConstantPoolCacheEntry::parameter_size_mask);
3240 // FIXME -- is this actually correct? looks like it should be 2
3241 // const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address
3242 // const int receiver_is_at_end = -1; // back off one slot to get receiver
3243 // Address recv_addr = __ argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end);
3244 // __ movptr(recv, recv_addr);
3245 __ add(rscratch1, esp, recv, ext::uxtx, 3); // FIXME: uxtb here?
3246 __ ldr(recv, Address(rscratch1, -Interpreter::expr_offset_in_bytes(1)));
3247 __ verify_oop(recv);
3248 }
3249
3250 // compute return type
|