< prev index next >

src/hotspot/cpu/aarch64/templateTable_aarch64.cpp

Print this page
rev 52749 : Bootstrap method consolidation
* clean up and simplify JDK support code for BSM invocation
* simplify JVM bootstrap handshake: use BootstrapCallInfo only
* remove unused JVM paths and data fields
* move bootstrap argument processing from MethodHandleNatives to ConstantPool
* remove ConstantGroup; merge argument access into BootstrapCallInfo
* adjust BSM argument access: remove copyArguments, add argumentRef API
* add metadata-free BSM modes, including symbolic arguments from CP


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


< prev index next >