hotspot/src/cpu/x86/vm/methodHandles_x86.cpp
changeset 8676 9098d4e927e1
parent 8495 a4959965eaa3
child 9437 9981851b4b8c
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
   123       tem = rax_mtype;          // in case there is another indirection
   123       tem = rax_mtype;          // in case there is another indirection
   124     }
   124     }
   125   }
   125   }
   126 
   126 
   127   // given the MethodType, find out where the MH argument is buried
   127   // given the MethodType, find out where the MH argument is buried
   128   __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
   128   __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, rdi_temp)));
   129   Register rdx_vmslots = rdx_temp;
   129   Register rdx_vmslots = rdx_temp;
   130   __ movl(rdx_vmslots, Address(rdx_temp, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, rdi_temp)));
   130   __ movl(rdx_vmslots, Address(rdx_temp, __ delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, rdi_temp)));
   131   __ movptr(rcx_recv, __ argument_address(rdx_vmslots));
   131   __ movptr(rcx_recv, __ argument_address(rdx_vmslots));
   132 
   132 
   133   trace_method_handle(_masm, "invokeExact");
   133   trace_method_handle(_masm, "invokeExact");
   134 
   134 
   135   __ check_method_handle_type(rax_mtype, rcx_recv, rdi_temp, wrong_method_type);
   135   __ check_method_handle_type(rax_mtype, rcx_recv, rdi_temp, wrong_method_type);
   152   __ lea(rcx_argslot, __ argument_address(rdx_vmslots, 1));
   152   __ lea(rcx_argslot, __ argument_address(rdx_vmslots, 1));
   153   insert_arg_slots(_masm, 2 * stack_move_unit(), _INSERT_REF_MASK,
   153   insert_arg_slots(_masm, 2 * stack_move_unit(), _INSERT_REF_MASK,
   154                    rcx_argslot, rbx_temp, rdx_temp);
   154                    rcx_argslot, rbx_temp, rdx_temp);
   155 
   155 
   156   // load up an adapter from the calling type (Java weaves this)
   156   // load up an adapter from the calling type (Java weaves this)
   157   __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, rdi_temp)));
   157   __ load_heap_oop(rdx_temp, Address(rax_mtype, __ delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, rdi_temp)));
   158   Register rdx_adapter = rdx_temp;
   158   Register rdx_adapter = rdx_temp;
   159   // __ load_heap_oop(rdx_adapter, Address(rdx_temp, java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes()));
   159   // __ load_heap_oop(rdx_adapter, Address(rdx_temp, java_lang_invoke_MethodTypeForm::genericInvoker_offset_in_bytes()));
   160   // deal with old JDK versions:
   160   // deal with old JDK versions:
   161   __ lea(rdi_temp, Address(rdx_temp, __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, rdi_temp)));
   161   __ lea(rdi_temp, Address(rdx_temp, __ delayed_value(java_lang_invoke_MethodTypeForm::genericInvoker_offset_in_bytes, rdi_temp)));
   162   __ cmpptr(rdi_temp, rdx_temp);
   162   __ cmpptr(rdi_temp, rdx_temp);
   163   Label sorry_no_invoke_generic;
   163   Label sorry_no_invoke_generic;
   164   __ jcc(Assembler::below, sorry_no_invoke_generic);
   164   __ jcc(Assembler::below, sorry_no_invoke_generic);
   165 
   165 
   166   __ load_heap_oop(rdx_adapter, Address(rdi_temp, 0));
   166   __ load_heap_oop(rdx_adapter, Address(rdi_temp, 0));
   369 }
   369 }
   370 #endif //PRODUCT
   370 #endif //PRODUCT
   371 
   371 
   372 // which conversion op types are implemented here?
   372 // which conversion op types are implemented here?
   373 int MethodHandles::adapter_conversion_ops_supported_mask() {
   373 int MethodHandles::adapter_conversion_ops_supported_mask() {
   374   return ((1<<sun_dyn_AdapterMethodHandle::OP_RETYPE_ONLY)
   374   return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY)
   375          |(1<<sun_dyn_AdapterMethodHandle::OP_RETYPE_RAW)
   375          |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW)
   376          |(1<<sun_dyn_AdapterMethodHandle::OP_CHECK_CAST)
   376          |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST)
   377          |(1<<sun_dyn_AdapterMethodHandle::OP_PRIM_TO_PRIM)
   377          |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM)
   378          |(1<<sun_dyn_AdapterMethodHandle::OP_REF_TO_PRIM)
   378          |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM)
   379          |(1<<sun_dyn_AdapterMethodHandle::OP_SWAP_ARGS)
   379          |(1<<java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS)
   380          |(1<<sun_dyn_AdapterMethodHandle::OP_ROT_ARGS)
   380          |(1<<java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS)
   381          |(1<<sun_dyn_AdapterMethodHandle::OP_DUP_ARGS)
   381          |(1<<java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS)
   382          |(1<<sun_dyn_AdapterMethodHandle::OP_DROP_ARGS)
   382          |(1<<java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS)
   383          //|(1<<sun_dyn_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG!
   383          //|(1<<java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG!
   384          );
   384          );
   385   // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS.
   385   // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS.
   386 }
   386 }
   387 
   387 
   388 //------------------------------------------------------------------------------
   388 //------------------------------------------------------------------------------
   413   const Register rarg0_code     = LP64_ONLY(j_rarg0) NOT_LP64(rcx);
   413   const Register rarg0_code     = LP64_ONLY(j_rarg0) NOT_LP64(rcx);
   414   const Register rarg1_actual   = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
   414   const Register rarg1_actual   = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
   415   const Register rarg2_required = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
   415   const Register rarg2_required = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
   416   assert_different_registers(rarg0_code, rarg1_actual, rarg2_required, saved_last_sp);
   416   assert_different_registers(rarg0_code, rarg1_actual, rarg2_required, saved_last_sp);
   417 
   417 
   418   guarantee(java_dyn_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
   418   guarantee(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
   419 
   419 
   420   // some handy addresses
   420   // some handy addresses
   421   Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
   421   Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
   422   Address rbx_method_fce(     rbx,      methodOopDesc::from_compiled_offset() );
   422   Address rbx_method_fce(     rbx,      methodOopDesc::from_compiled_offset() );
   423 
   423 
   424   Address rcx_mh_vmtarget(    rcx_recv, java_dyn_MethodHandle::vmtarget_offset_in_bytes() );
   424   Address rcx_mh_vmtarget(    rcx_recv, java_lang_invoke_MethodHandle::vmtarget_offset_in_bytes() );
   425   Address rcx_dmh_vmindex(    rcx_recv, sun_dyn_DirectMethodHandle::vmindex_offset_in_bytes() );
   425   Address rcx_dmh_vmindex(    rcx_recv, java_lang_invoke_DirectMethodHandle::vmindex_offset_in_bytes() );
   426 
   426 
   427   Address rcx_bmh_vmargslot(  rcx_recv, sun_dyn_BoundMethodHandle::vmargslot_offset_in_bytes() );
   427   Address rcx_bmh_vmargslot(  rcx_recv, java_lang_invoke_BoundMethodHandle::vmargslot_offset_in_bytes() );
   428   Address rcx_bmh_argument(   rcx_recv, sun_dyn_BoundMethodHandle::argument_offset_in_bytes() );
   428   Address rcx_bmh_argument(   rcx_recv, java_lang_invoke_BoundMethodHandle::argument_offset_in_bytes() );
   429 
   429 
   430   Address rcx_amh_vmargslot(  rcx_recv, sun_dyn_AdapterMethodHandle::vmargslot_offset_in_bytes() );
   430   Address rcx_amh_vmargslot(  rcx_recv, java_lang_invoke_AdapterMethodHandle::vmargslot_offset_in_bytes() );
   431   Address rcx_amh_argument(   rcx_recv, sun_dyn_AdapterMethodHandle::argument_offset_in_bytes() );
   431   Address rcx_amh_argument(   rcx_recv, java_lang_invoke_AdapterMethodHandle::argument_offset_in_bytes() );
   432   Address rcx_amh_conversion( rcx_recv, sun_dyn_AdapterMethodHandle::conversion_offset_in_bytes() );
   432   Address rcx_amh_conversion( rcx_recv, java_lang_invoke_AdapterMethodHandle::conversion_offset_in_bytes() );
   433   Address vmarg;                // __ argument_address(vmargslot)
   433   Address vmarg;                // __ argument_address(vmargslot)
   434 
   434 
   435   const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
   435   const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
   436 
   436 
   437   if (have_entry(ek)) {
   437   if (have_entry(ek)) {
   458       __ pop(rdi_pc);  // caller PC
   458       __ pop(rdi_pc);  // caller PC
   459       __ mov(rsp, saved_last_sp);  // cut the stack back to where the caller started
   459       __ mov(rsp, saved_last_sp);  // cut the stack back to where the caller started
   460 
   460 
   461       Register rbx_method = rbx_temp;
   461       Register rbx_method = rbx_temp;
   462       Label L_no_method;
   462       Label L_no_method;
   463       // FIXME: fill in _raise_exception_method with a suitable sun.dyn method
   463       // FIXME: fill in _raise_exception_method with a suitable java.lang.invoke method
   464       __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method));
   464       __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method));
   465       __ testptr(rbx_method, rbx_method);
   465       __ testptr(rbx_method, rbx_method);
   466       __ jccb(Assembler::zero, L_no_method);
   466       __ jccb(Assembler::zero, L_no_method);
   467 
   467 
   468       const int jobject_oop_offset = 0;
   468       const int jobject_oop_offset = 0;