mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
6994093: MethodHandle.invokeGeneric needs porting to SPARC
SPARC code missing from fix to 6939224 Reviewed-by: twisti
This commit is contained in:
parent
b22ecee555
commit
c798146bee
3 changed files with 78 additions and 9 deletions
|
@ -77,10 +77,22 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
|
|||
// O0, O1: garbage temps, blown away
|
||||
Register O0_argslot = O0;
|
||||
Register O1_scratch = O1;
|
||||
Register O2_scratch = O2;
|
||||
Register O3_scratch = O3;
|
||||
Register O4_argbase = O4;
|
||||
Register O5_mtype = O5;
|
||||
|
||||
// emit WrongMethodType path first, to enable back-branch from main path
|
||||
Label wrong_method_type;
|
||||
__ bind(wrong_method_type);
|
||||
Label invoke_generic_slow_path;
|
||||
assert(methodOopDesc::intrinsic_id_size_in_bytes() == sizeof(u1), "");;
|
||||
__ ldub(Address(G5_method, methodOopDesc::intrinsic_id_offset_in_bytes()), O1_scratch);
|
||||
__ cmp(O1_scratch, (int) vmIntrinsics::_invokeExact);
|
||||
__ brx(Assembler::notEqual, false, Assembler::pt, invoke_generic_slow_path);
|
||||
__ delayed()->nop();
|
||||
__ mov(O5_mtype, G5_method_type); // required by throw_WrongMethodType
|
||||
// mov(G3_method_handle, G3_method_handle); // already in this register
|
||||
__ jump_to(AddressLiteral(Interpreter::throw_WrongMethodType_entry()), O1_scratch);
|
||||
__ delayed()->nop();
|
||||
|
||||
|
@ -88,23 +100,75 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
|
|||
__ align(CodeEntryAlignment);
|
||||
address entry_point = __ pc();
|
||||
|
||||
// fetch the MethodType from the method handle into G5_method_type
|
||||
// fetch the MethodType from the method handle
|
||||
{
|
||||
Register tem = G5_method;
|
||||
assert(tem == G5_method_type, "yes, it's the same register");
|
||||
for (jint* pchase = methodOopDesc::method_type_offsets_chain(); (*pchase) != -1; pchase++) {
|
||||
__ ld_ptr(Address(tem, *pchase), G5_method_type);
|
||||
__ ld_ptr(Address(tem, *pchase), O5_mtype);
|
||||
tem = O5_mtype; // in case there is another indirection
|
||||
}
|
||||
}
|
||||
|
||||
// given the MethodType, find out where the MH argument is buried
|
||||
__ load_heap_oop(Address(G5_method_type, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, O1_scratch)), O0_argslot);
|
||||
__ ldsw( Address(O0_argslot, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O0_argslot);
|
||||
__ ld_ptr(__ argument_address(O0_argslot), G3_method_handle);
|
||||
__ load_heap_oop(Address(O5_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, O1_scratch)), O0_argslot);
|
||||
__ ldsw( Address(O0_argslot, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O0_argslot);
|
||||
__ add(Gargs, __ argument_offset(O0_argslot, 1), O4_argbase);
|
||||
// Note: argument_address uses its input as a scratch register!
|
||||
__ ld_ptr(Address(O4_argbase, -Interpreter::stackElementSize), G3_method_handle);
|
||||
|
||||
__ check_method_handle_type(G5_method_type, G3_method_handle, O1_scratch, wrong_method_type);
|
||||
trace_method_handle(_masm, "invokeExact");
|
||||
|
||||
__ check_method_handle_type(O5_mtype, G3_method_handle, O1_scratch, wrong_method_type);
|
||||
__ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
|
||||
|
||||
// for invokeGeneric (only), apply argument and result conversions on the fly
|
||||
__ bind(invoke_generic_slow_path);
|
||||
#ifdef ASSERT
|
||||
{ Label L;
|
||||
__ ldub(Address(G5_method, methodOopDesc::intrinsic_id_offset_in_bytes()), O1_scratch);
|
||||
__ cmp(O1_scratch, (int) vmIntrinsics::_invokeGeneric);
|
||||
__ brx(Assembler::equal, false, Assembler::pt, L);
|
||||
__ delayed()->nop();
|
||||
__ stop("bad methodOop::intrinsic_id");
|
||||
__ bind(L);
|
||||
}
|
||||
#endif //ASSERT
|
||||
|
||||
// make room on the stack for another pointer:
|
||||
insert_arg_slots(_masm, 2 * stack_move_unit(), _INSERT_REF_MASK,
|
||||
O4_argbase, O1_scratch, O2_scratch, O3_scratch);
|
||||
// load up an adapter from the calling type (Java weaves this)
|
||||
Register O2_form = O2_scratch;
|
||||
Register O3_adapter = O3_scratch;
|
||||
__ load_heap_oop(Address(O5_mtype, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, O1_scratch)), O2_form);
|
||||
// load_heap_oop(Address(O2_form, __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
|
||||
// deal with old JDK versions:
|
||||
__ add( Address(O2_form, __ delayed_value(java_dyn_MethodTypeForm::genericInvoker_offset_in_bytes, O1_scratch)), O3_adapter);
|
||||
__ cmp(O3_adapter, O2_form);
|
||||
Label sorry_no_invoke_generic;
|
||||
__ brx(Assembler::lessUnsigned, false, Assembler::pn, sorry_no_invoke_generic);
|
||||
__ delayed()->nop();
|
||||
|
||||
__ load_heap_oop(Address(O3_adapter, 0), O3_adapter);
|
||||
__ tst(O3_adapter);
|
||||
__ brx(Assembler::zero, false, Assembler::pn, sorry_no_invoke_generic);
|
||||
__ delayed()->nop();
|
||||
__ st_ptr(O3_adapter, Address(O4_argbase, 1 * Interpreter::stackElementSize));
|
||||
// As a trusted first argument, pass the type being called, so the adapter knows
|
||||
// the actual types of the arguments and return values.
|
||||
// (Generic invokers are shared among form-families of method-type.)
|
||||
__ st_ptr(O5_mtype, Address(O4_argbase, 0 * Interpreter::stackElementSize));
|
||||
// FIXME: assert that O3_adapter is of the right method-type.
|
||||
__ mov(O3_adapter, G3_method_handle);
|
||||
trace_method_handle(_masm, "invokeGeneric");
|
||||
__ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
|
||||
|
||||
__ bind(sorry_no_invoke_generic); // no invokeGeneric implementation available!
|
||||
__ mov(O5_mtype, G5_method_type); // required by throw_WrongMethodType
|
||||
// mov(G3_method_handle, G3_method_handle); // already in this register
|
||||
__ jump_to(AddressLiteral(Interpreter::throw_WrongMethodType_entry()), O1_scratch);
|
||||
__ delayed()->nop();
|
||||
|
||||
return entry_point;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue