hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp
changeset 8676 9098d4e927e1
parent 8495 a4959965eaa3
child 8731 0dccf5d963cc
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
   110       tem = O0_mtype;          // in case there is another indirection
   110       tem = O0_mtype;          // in case there is another indirection
   111     }
   111     }
   112   }
   112   }
   113 
   113 
   114   // given the MethodType, find out where the MH argument is buried
   114   // given the MethodType, find out where the MH argument is buried
   115   __ load_heap_oop(Address(O0_mtype,   __ delayed_value(java_dyn_MethodType::form_offset_in_bytes,        O1_scratch)), O4_argslot);
   115   __ load_heap_oop(Address(O0_mtype,   __ delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes,        O1_scratch)), O4_argslot);
   116   __ ldsw(         Address(O4_argslot, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O4_argslot);
   116   __ ldsw(         Address(O4_argslot, __ delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O4_argslot);
   117   __ add(Gargs, __ argument_offset(O4_argslot, 1), O4_argbase);
   117   __ add(Gargs, __ argument_offset(O4_argslot, 1), O4_argbase);
   118   // Note: argument_address uses its input as a scratch register!
   118   // Note: argument_address uses its input as a scratch register!
   119   __ ld_ptr(Address(O4_argbase, -Interpreter::stackElementSize), G3_method_handle);
   119   __ ld_ptr(Address(O4_argbase, -Interpreter::stackElementSize), G3_method_handle);
   120 
   120 
   121   trace_method_handle(_masm, "invokeExact");
   121   trace_method_handle(_masm, "invokeExact");
   139   // make room on the stack for another pointer:
   139   // make room on the stack for another pointer:
   140   insert_arg_slots(_masm, 2 * stack_move_unit(), _INSERT_REF_MASK, O4_argbase, O1_scratch, O2_scratch, O3_scratch);
   140   insert_arg_slots(_masm, 2 * stack_move_unit(), _INSERT_REF_MASK, O4_argbase, O1_scratch, O2_scratch, O3_scratch);
   141   // load up an adapter from the calling type (Java weaves this)
   141   // load up an adapter from the calling type (Java weaves this)
   142   Register O2_form    = O2_scratch;
   142   Register O2_form    = O2_scratch;
   143   Register O3_adapter = O3_scratch;
   143   Register O3_adapter = O3_scratch;
   144   __ load_heap_oop(Address(O0_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes,               O1_scratch)), O2_form);
   144   __ load_heap_oop(Address(O0_mtype, __ delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes,               O1_scratch)), O2_form);
   145   // load_heap_oop(Address(O2_form,  __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
   145   // load_heap_oop(Address(O2_form,  __ delayed_value(java_lang_invoke_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
   146   // deal with old JDK versions:
   146   // deal with old JDK versions:
   147   __ add(          Address(O2_form,  __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
   147   __ add(          Address(O2_form,  __ delayed_value(java_lang_invoke_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
   148   __ cmp(O3_adapter, O2_form);
   148   __ cmp(O3_adapter, O2_form);
   149   Label sorry_no_invoke_generic;
   149   Label sorry_no_invoke_generic;
   150   __ brx(Assembler::lessUnsigned, false, Assembler::pn, sorry_no_invoke_generic);
   150   __ brx(Assembler::lessUnsigned, false, Assembler::pn, sorry_no_invoke_generic);
   151   __ delayed()->nop();
   151   __ delayed()->nop();
   152 
   152 
   374 }
   374 }
   375 #endif // PRODUCT
   375 #endif // PRODUCT
   376 
   376 
   377 // which conversion op types are implemented here?
   377 // which conversion op types are implemented here?
   378 int MethodHandles::adapter_conversion_ops_supported_mask() {
   378 int MethodHandles::adapter_conversion_ops_supported_mask() {
   379   return ((1<<sun_dyn_AdapterMethodHandle::OP_RETYPE_ONLY)
   379   return ((1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_ONLY)
   380          |(1<<sun_dyn_AdapterMethodHandle::OP_RETYPE_RAW)
   380          |(1<<java_lang_invoke_AdapterMethodHandle::OP_RETYPE_RAW)
   381          |(1<<sun_dyn_AdapterMethodHandle::OP_CHECK_CAST)
   381          |(1<<java_lang_invoke_AdapterMethodHandle::OP_CHECK_CAST)
   382          |(1<<sun_dyn_AdapterMethodHandle::OP_PRIM_TO_PRIM)
   382          |(1<<java_lang_invoke_AdapterMethodHandle::OP_PRIM_TO_PRIM)
   383          |(1<<sun_dyn_AdapterMethodHandle::OP_REF_TO_PRIM)
   383          |(1<<java_lang_invoke_AdapterMethodHandle::OP_REF_TO_PRIM)
   384          |(1<<sun_dyn_AdapterMethodHandle::OP_SWAP_ARGS)
   384          |(1<<java_lang_invoke_AdapterMethodHandle::OP_SWAP_ARGS)
   385          |(1<<sun_dyn_AdapterMethodHandle::OP_ROT_ARGS)
   385          |(1<<java_lang_invoke_AdapterMethodHandle::OP_ROT_ARGS)
   386          |(1<<sun_dyn_AdapterMethodHandle::OP_DUP_ARGS)
   386          |(1<<java_lang_invoke_AdapterMethodHandle::OP_DUP_ARGS)
   387          |(1<<sun_dyn_AdapterMethodHandle::OP_DROP_ARGS)
   387          |(1<<java_lang_invoke_AdapterMethodHandle::OP_DROP_ARGS)
   388          //|(1<<sun_dyn_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG!
   388          //|(1<<java_lang_invoke_AdapterMethodHandle::OP_SPREAD_ARGS) //BUG!
   389          );
   389          );
   390   // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS.
   390   // FIXME: MethodHandlesTest gets a crash if we enable OP_SPREAD_ARGS.
   391 }
   391 }
   392 
   392 
   393 //------------------------------------------------------------------------------
   393 //------------------------------------------------------------------------------
   411   // Argument registers for _raise_exception.
   411   // Argument registers for _raise_exception.
   412   const Register O0_code     = O0;
   412   const Register O0_code     = O0;
   413   const Register O1_actual   = O1;
   413   const Register O1_actual   = O1;
   414   const Register O2_required = O2;
   414   const Register O2_required = O2;
   415 
   415 
   416   guarantee(java_dyn_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
   416   guarantee(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
   417 
   417 
   418   // Some handy addresses:
   418   // Some handy addresses:
   419   Address G5_method_fie(    G5_method,        in_bytes(methodOopDesc::from_interpreted_offset()));
   419   Address G5_method_fie(    G5_method,        in_bytes(methodOopDesc::from_interpreted_offset()));
   420   Address G5_method_fce(    G5_method,        in_bytes(methodOopDesc::from_compiled_offset()));
   420   Address G5_method_fce(    G5_method,        in_bytes(methodOopDesc::from_compiled_offset()));
   421 
   421 
   422   Address G3_mh_vmtarget(   G3_method_handle, java_dyn_MethodHandle::vmtarget_offset_in_bytes());
   422   Address G3_mh_vmtarget(   G3_method_handle, java_lang_invoke_MethodHandle::vmtarget_offset_in_bytes());
   423 
   423 
   424   Address G3_dmh_vmindex(   G3_method_handle, sun_dyn_DirectMethodHandle::vmindex_offset_in_bytes());
   424   Address G3_dmh_vmindex(   G3_method_handle, java_lang_invoke_DirectMethodHandle::vmindex_offset_in_bytes());
   425 
   425 
   426   Address G3_bmh_vmargslot( G3_method_handle, sun_dyn_BoundMethodHandle::vmargslot_offset_in_bytes());
   426   Address G3_bmh_vmargslot( G3_method_handle, java_lang_invoke_BoundMethodHandle::vmargslot_offset_in_bytes());
   427   Address G3_bmh_argument(  G3_method_handle, sun_dyn_BoundMethodHandle::argument_offset_in_bytes());
   427   Address G3_bmh_argument(  G3_method_handle, java_lang_invoke_BoundMethodHandle::argument_offset_in_bytes());
   428 
   428 
   429   Address G3_amh_vmargslot( G3_method_handle, sun_dyn_AdapterMethodHandle::vmargslot_offset_in_bytes());
   429   Address G3_amh_vmargslot( G3_method_handle, java_lang_invoke_AdapterMethodHandle::vmargslot_offset_in_bytes());
   430   Address G3_amh_argument ( G3_method_handle, sun_dyn_AdapterMethodHandle::argument_offset_in_bytes());
   430   Address G3_amh_argument ( G3_method_handle, java_lang_invoke_AdapterMethodHandle::argument_offset_in_bytes());
   431   Address G3_amh_conversion(G3_method_handle, sun_dyn_AdapterMethodHandle::conversion_offset_in_bytes());
   431   Address G3_amh_conversion(G3_method_handle, java_lang_invoke_AdapterMethodHandle::conversion_offset_in_bytes());
   432 
   432 
   433   const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
   433   const int java_mirror_offset = klassOopDesc::klass_part_offset_in_bytes() + Klass::java_mirror_offset_in_bytes();
   434 
   434 
   435   if (have_entry(ek)) {
   435   if (have_entry(ek)) {
   436     __ nop();  // empty stubs make SG sick
   436     __ nop();  // empty stubs make SG sick
   451       assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
   451       assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
   452 
   452 
   453       __ mov(O5_savedSP, SP);  // Cut the stack back to where the caller started.
   453       __ mov(O5_savedSP, SP);  // Cut the stack back to where the caller started.
   454 
   454 
   455       Label L_no_method;
   455       Label L_no_method;
   456       // FIXME: fill in _raise_exception_method with a suitable sun.dyn method
   456       // FIXME: fill in _raise_exception_method with a suitable java.lang.invoke method
   457       __ set(AddressLiteral((address) &_raise_exception_method), G5_method);
   457       __ set(AddressLiteral((address) &_raise_exception_method), G5_method);
   458       __ ld_ptr(Address(G5_method, 0), G5_method);
   458       __ ld_ptr(Address(G5_method, 0), G5_method);
   459       __ tst(G5_method);
   459       __ tst(G5_method);
   460       __ brx(Assembler::zero, false, Assembler::pn, L_no_method);
   460       __ brx(Assembler::zero, false, Assembler::pn, L_no_method);
   461       __ delayed()->nop();
   461       __ delayed()->nop();