< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.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


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


< prev index next >