171 assert_different_registers(recv, method_temp, temp2); // temp3 is only passed on |
171 assert_different_registers(recv, method_temp, temp2); // temp3 is only passed on |
172 assert(method_temp == R19_method, "required register for loading method"); |
172 assert(method_temp == R19_method, "required register for loading method"); |
173 |
173 |
174 // Load the invoker, as MH -> MH.form -> LF.vmentry |
174 // Load the invoker, as MH -> MH.form -> LF.vmentry |
175 __ verify_oop(recv); |
175 __ verify_oop(recv); |
176 __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()), recv, temp2); |
176 __ load_heap_oop(method_temp, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()), recv, |
|
177 temp2, noreg, false, OOP_NOT_NULL); |
177 __ verify_oop(method_temp); |
178 __ verify_oop(method_temp); |
178 __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()), method_temp, temp2); |
179 __ load_heap_oop(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()), method_temp, |
|
180 temp2, noreg, false, OOP_NOT_NULL); |
179 __ verify_oop(method_temp); |
181 __ verify_oop(method_temp); |
180 __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), method_temp); |
182 __ load_heap_oop(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), method_temp, |
|
183 temp2, noreg, false, OOP_NOT_NULL); |
181 __ verify_oop(method_temp); |
184 __ verify_oop(method_temp); |
182 __ ld(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), method_temp); |
185 __ ld(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), method_temp); |
183 |
186 |
184 if (VerifyMethodHandles && !for_compiler_entry) { |
187 if (VerifyMethodHandles && !for_compiler_entry) { |
185 // Make sure recv is already on stack. |
188 // Make sure recv is already on stack. |
336 __ verify_klass_ptr(temp1_recv_klass); |
339 __ verify_klass_ptr(temp1_recv_klass); |
337 } |
340 } |
338 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { |
341 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { |
339 Label L_ok; |
342 Label L_ok; |
340 Register temp2_defc = temp2; |
343 Register temp2_defc = temp2; |
341 __ load_heap_oop_not_null(temp2_defc, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, temp3); |
344 __ load_heap_oop(temp2_defc, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, |
|
345 temp3, noreg, false, OOP_NOT_NULL); |
342 load_klass_from_Class(_masm, temp2_defc, temp3, temp4); |
346 load_klass_from_Class(_masm, temp2_defc, temp3, temp4); |
343 __ verify_klass_ptr(temp2_defc); |
347 __ verify_klass_ptr(temp2_defc); |
344 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok); |
348 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok); |
345 // If we get here, the type check failed! |
349 // If we get here, the type check failed! |
346 __ stop("receiver class disagrees with MemberName.clazz"); |
350 __ stop("receiver class disagrees with MemberName.clazz"); |
363 switch (iid) { |
367 switch (iid) { |
364 case vmIntrinsics::_linkToSpecial: |
368 case vmIntrinsics::_linkToSpecial: |
365 if (VerifyMethodHandles) { |
369 if (VerifyMethodHandles) { |
366 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp2); |
370 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp2); |
367 } |
371 } |
368 __ load_heap_oop(R19_method, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), member_reg); |
372 __ load_heap_oop(R19_method, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), member_reg, |
|
373 temp3, noreg, false, OOP_NOT_NULL); |
369 __ ld(R19_method, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), R19_method); |
374 __ ld(R19_method, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), R19_method); |
370 break; |
375 break; |
371 |
376 |
372 case vmIntrinsics::_linkToStatic: |
377 case vmIntrinsics::_linkToStatic: |
373 if (VerifyMethodHandles) { |
378 if (VerifyMethodHandles) { |
374 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp2); |
379 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp2); |
375 } |
380 } |
376 __ load_heap_oop(R19_method, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), member_reg); |
381 __ load_heap_oop(R19_method, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes()), member_reg, |
|
382 temp3, noreg, false, OOP_NOT_NULL); |
377 __ ld(R19_method, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), R19_method); |
383 __ ld(R19_method, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes()), R19_method); |
378 break; |
384 break; |
379 |
385 |
380 case vmIntrinsics::_linkToVirtual: |
386 case vmIntrinsics::_linkToVirtual: |
381 { |
387 { |
413 if (VerifyMethodHandles) { |
419 if (VerifyMethodHandles) { |
414 verify_ref_kind(_masm, JVM_REF_invokeInterface, member_reg, temp2); |
420 verify_ref_kind(_masm, JVM_REF_invokeInterface, member_reg, temp2); |
415 } |
421 } |
416 |
422 |
417 Register temp2_intf = temp2; |
423 Register temp2_intf = temp2; |
418 __ load_heap_oop_not_null(temp2_intf, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, temp3); |
424 __ load_heap_oop(temp2_intf, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, |
|
425 temp3, noreg, false, OOP_NOT_NULL); |
419 load_klass_from_Class(_masm, temp2_intf, temp3, temp4); |
426 load_klass_from_Class(_masm, temp2_intf, temp3, temp4); |
420 __ verify_klass_ptr(temp2_intf); |
427 __ verify_klass_ptr(temp2_intf); |
421 |
428 |
422 Register vtable_index = R19_method; |
429 Register vtable_index = R19_method; |
423 __ ld(vtable_index, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()), member_reg); |
430 __ ld(vtable_index, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()), member_reg); |