< prev index next >
src/hotspot/cpu/ppc/templateTable_ppc_64.cpp
Print this page
*** 3583,3615 ****
Rrecv_klass = R4_ARG2,
Rflags = R7_ARG5;
prepare_invoke(byte_no, Rinterface_klass, Rret_addr, Rmethod, Rreceiver, Rflags, Rscratch1);
// Check for private method invocation - indicated by vfinal
! Label LnotVFinal;
__ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_vfinal_shift);
__ bfalse(CCR0, LnotVFinal);
! __ null_check_throw(Rreceiver, -1, Rscratch3);
Register Rscratch = Rflags; // Rflags is dead now.
__ profile_final_call(Rscratch1, Rscratch);
__ profile_arguments_type(Rindex, Rscratch, Rrecv_klass /* scratch */, true);
__ call_from_interpreter(Rindex, Rret_addr, Rscratch, Rrecv_klass /* scratch */);
__ bind(LnotVFinal);
- // Get receiver klass.
- __ null_check_throw(Rreceiver, oopDesc::klass_offset_in_bytes(), Rscratch2);
- __ load_klass(Rrecv_klass, Rreceiver);
-
// Check corner case object method.
! Label LobjectMethod, L_no_such_interface, Lthrow_ame;
__ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift);
__ btrue(CCR0, LobjectMethod);
__ lookup_interface_method(Rrecv_klass, Rinterface_klass, noreg, noreg, Rscratch1, Rscratch2,
L_no_such_interface, /*return_method=*/false);
--- 3583,3620 ----
Rrecv_klass = R4_ARG2,
Rflags = R7_ARG5;
prepare_invoke(byte_no, Rinterface_klass, Rret_addr, Rmethod, Rreceiver, Rflags, Rscratch1);
+ // Get receiver klass - this is also a null check
+ __ null_check_throw(Rreceiver, oopDesc::klass_offset_in_bytes(), Rscratch2);
+ __ load_klass(Rrecv_klass, Rreceiver);
+
// Check for private method invocation - indicated by vfinal
! Label LnotVFinal, L_no_such_interface, L_subtype;
__ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_vfinal_shift);
__ bfalse(CCR0, LnotVFinal);
! __ check_klass_subtype(Rrecv_klass, Rinterface_klass, Rscratch, Rscratch1, subtype);
! // If we get here the typecheck failed
! __ b(L_no_such_interface);
! __ bind(subtype);
!
! // do the call
Register Rscratch = Rflags; // Rflags is dead now.
__ profile_final_call(Rscratch1, Rscratch);
__ profile_arguments_type(Rindex, Rscratch, Rrecv_klass /* scratch */, true);
__ call_from_interpreter(Rindex, Rret_addr, Rscratch, Rrecv_klass /* scratch */);
__ bind(LnotVFinal);
// Check corner case object method.
! Label LobjectMethod, Lthrow_ame;
__ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift);
__ btrue(CCR0, LobjectMethod);
__ lookup_interface_method(Rrecv_klass, Rinterface_klass, noreg, noreg, Rscratch1, Rscratch2,
L_no_such_interface, /*return_method=*/false);
< prev index next >