src/hotspot/cpu/ppc/methodHandles_ppc.cpp
changeset 50162 f9fe56417050
parent 49480 d7df2dd501ce
child 50728 9375184cec98
equal deleted inserted replaced
50161:e2d9b38630c3 50162:f9fe56417050
   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);