< prev index next >

src/hotspot/cpu/x86/templateTable_x86.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


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);


< prev index next >