hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
changeset 13929 8da0dc50a6e4
parent 13743 154102966e74
child 13961 aeaa21c167d1
equal deleted inserted replaced
13918:b01a48301e67 13929:8da0dc50a6e4
  2182                                     ConstantPoolCacheEntry::flags_offset());
  2182                                     ConstantPoolCacheEntry::flags_offset());
  2183   // access constant pool cache fields
  2183   // access constant pool cache fields
  2184   const int index_offset = in_bytes(ConstantPoolCache::base_offset() +
  2184   const int index_offset = in_bytes(ConstantPoolCache::base_offset() +
  2185                                     ConstantPoolCacheEntry::f2_offset());
  2185                                     ConstantPoolCacheEntry::f2_offset());
  2186 
  2186 
  2187     size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2));
  2187   size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2));
  2188   resolve_cache_and_index(byte_no, cache, index, index_size);
  2188   resolve_cache_and_index(byte_no, cache, index, index_size);
  2189     __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
  2189     __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
  2190 
  2190 
  2191   if (itable_index != noreg) {
  2191   if (itable_index != noreg) {
  2192     // pick up itable or appendix index from f2 also:
  2192     // pick up itable or appendix index from f2 also:
  2924     // Push the appendix as a trailing parameter.
  2924     // Push the appendix as a trailing parameter.
  2925     // This must be done before we get the receiver,
  2925     // This must be done before we get the receiver,
  2926     // since the parameter_size includes it.
  2926     // since the parameter_size includes it.
  2927     __ push(rbx);
  2927     __ push(rbx);
  2928     __ mov(rbx, index);
  2928     __ mov(rbx, index);
       
  2929     assert(ConstantPoolCacheEntry::_indy_resolved_references_appendix_offset == 0, "appendix expected at index+0");
  2929     __ load_resolved_reference_at_index(index, rbx);
  2930     __ load_resolved_reference_at_index(index, rbx);
  2930     __ pop(rbx);
  2931     __ pop(rbx);
  2931     __ push(index);  // push appendix (MethodType, CallSite, etc.)
  2932     __ push(index);  // push appendix (MethodType, CallSite, etc.)
  2932     __ bind(L_no_push);
  2933     __ bind(L_no_push);
  2933   }
  2934   }
  3142 
  3143 
  3143 
  3144 
  3144 void TemplateTable::invokehandle(int byte_no) {
  3145 void TemplateTable::invokehandle(int byte_no) {
  3145   transition(vtos, vtos);
  3146   transition(vtos, vtos);
  3146   assert(byte_no == f1_byte, "use this argument");
  3147   assert(byte_no == f1_byte, "use this argument");
  3147   const Register rbx_method = rbx;  // f2
  3148   const Register rbx_method = rbx;
  3148   const Register rax_mtype  = rax;  // f1
  3149   const Register rax_mtype  = rax;
  3149   const Register rcx_recv   = rcx;
  3150   const Register rcx_recv   = rcx;
  3150   const Register rdx_flags  = rdx;
  3151   const Register rdx_flags  = rdx;
  3151 
  3152 
  3152   if (!EnableInvokeDynamic) {
  3153   if (!EnableInvokeDynamic) {
  3153     // rewriter does not generate this bytecode
  3154     // rewriter does not generate this bytecode
  3154     __ should_not_reach_here();
  3155     __ should_not_reach_here();
  3155     return;
  3156     return;
  3156   }
  3157   }
  3157 
  3158 
  3158   prepare_invoke(byte_no,
  3159   prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv);
  3159                  rbx_method, rax_mtype,  // get f2 Method*, f1 MethodType
       
  3160                  rcx_recv);
       
  3161   __ verify_method_ptr(rbx_method);
  3160   __ verify_method_ptr(rbx_method);
  3162   __ verify_oop(rcx_recv);
  3161   __ verify_oop(rcx_recv);
  3163   __ null_check(rcx_recv);
  3162   __ null_check(rcx_recv);
       
  3163 
       
  3164   // rax: MethodType object (from cpool->resolved_references[f1], if necessary)
       
  3165   // rbx: MH.invokeExact_MT method (from f2)
  3164 
  3166 
  3165   // Note:  rax_mtype is already pushed (if necessary) by prepare_invoke
  3167   // Note:  rax_mtype is already pushed (if necessary) by prepare_invoke
  3166 
  3168 
  3167   // FIXME: profile the LambdaForm also
  3169   // FIXME: profile the LambdaForm also
  3168   __ profile_final_call(rax);
  3170   __ profile_final_call(rax);
  3189   const Register rbx_method   = rbx;
  3191   const Register rbx_method   = rbx;
  3190   const Register rax_callsite = rax;
  3192   const Register rax_callsite = rax;
  3191 
  3193 
  3192   prepare_invoke(byte_no, rbx_method, rax_callsite);
  3194   prepare_invoke(byte_no, rbx_method, rax_callsite);
  3193 
  3195 
  3194   // rax: CallSite object (from cpool->resolved_references[])
  3196   // rax: CallSite object (from cpool->resolved_references[f1])
  3195   // rbx: MH.linkToCallSite method (from f2)
  3197   // rbx: MH.linkToCallSite method (from f2)
  3196 
  3198 
  3197   // Note:  rax_callsite is already pushed by prepare_invoke
  3199   // Note:  rax_callsite is already pushed by prepare_invoke
  3198 
  3200 
  3199   // %%% should make a type profile for any invokedynamic that takes a ref argument
  3201   // %%% should make a type profile for any invokedynamic that takes a ref argument