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