< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.cpp

Print this page
rev 50604 : imported patch jep181-rev1

*** 3200,3230 **** const Register Rscratch = G4_scratch; assert_different_registers(Rscratch, G5_method); prepare_invoke(byte_no, Rinterface, Rret, Rmethod, O0_recv, O1_flags); ! // get receiver klass __ null_check(O0_recv, oopDesc::klass_offset_in_bytes()); __ load_klass(O0_recv, O2_Klass); // Special case of invokeinterface called for virtual method of ! // java.lang.Object. See cpCacheOop.cpp for details. ! // This code isn't produced by javac, but could be produced by ! // another compliant java compiler. ! Label notMethod; __ set((1 << ConstantPoolCacheEntry::is_forced_virtual_shift), Rscratch); __ btst(O1_flags, Rscratch); ! __ br(Assembler::zero, false, Assembler::pt, notMethod); __ delayed()->nop(); invokeinterface_object_method(O2_Klass, Rinterface, Rret, O1_flags); ! __ bind(notMethod); Register Rtemp = O1_flags; ! Label L_no_such_interface; // Receiver subtype check against REFC. __ lookup_interface_method(// inputs: rec. class, interface, itable index O2_Klass, Rinterface, noreg, // outputs: temp reg1, temp reg2, temp reg3 --- 3200,3258 ---- const Register Rscratch = G4_scratch; assert_different_registers(Rscratch, G5_method); prepare_invoke(byte_no, Rinterface, Rret, Rmethod, O0_recv, O1_flags); ! // First check for Object case, then private interface method, ! // then regular interface method. ! ! // get receiver klass - this is also a null check __ null_check(O0_recv, oopDesc::klass_offset_in_bytes()); __ load_klass(O0_recv, O2_Klass); // Special case of invokeinterface called for virtual method of ! // java.lang.Object. See cpCache.cpp for details. ! Label notObjectMethod; __ set((1 << ConstantPoolCacheEntry::is_forced_virtual_shift), Rscratch); __ btst(O1_flags, Rscratch); ! __ br(Assembler::zero, false, Assembler::pt, notObjectMethod); __ delayed()->nop(); invokeinterface_object_method(O2_Klass, Rinterface, Rret, O1_flags); ! __ bind(notObjectMethod); ! ! Label L_no_such_interface; ! ! // Check for private method invocation - indicated by vfinal ! Label notVFinal; ! { ! __ set((1 << ConstantPoolCacheEntry::is_vfinal_shift), Rscratch); ! __ btst(O1_flags, Rscratch); ! __ br(Assembler::zero, false, Assembler::pt, notVFinal); ! __ delayed()->nop(); + Label subtype; Register Rtemp = O1_flags; + __ check_klass_subtype(O2_Klass, Rinterface, Rscratch, Rtemp, subtype); + // If we get here the typecheck failed + __ ba(L_no_such_interface); + __ delayed()->nop(); + __ bind(subtype); ! // do the call ! Register Rcall = Rinterface; ! __ mov(Rmethod, G5_method); ! assert_different_registers(Rcall, G5_method, Gargs, Rret); ! ! __ profile_arguments_type(G5_method, Rcall, Gargs, true); ! __ profile_final_call(Rscratch); ! __ call_from_interpreter(Rcall, Gargs, Rret); ! } ! __ bind(notVFinal); ! ! Register Rtemp = O1_flags; // Receiver subtype check against REFC. __ lookup_interface_method(// inputs: rec. class, interface, itable index O2_Klass, Rinterface, noreg, // outputs: temp reg1, temp reg2, temp reg3
< prev index next >