< prev index next >

src/hotspot/cpu/ppc/templateTable_ppc_64.cpp

Print this page

        

*** 2230,2240 **** // Kills: // - Rscratch void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register Rscratch, size_t index_size) { __ get_cache_and_index_at_bcp(Rcache, 1, index_size); ! Label Lresolved, Ldone, L_clinit_barrier_slow; Bytecodes::Code code = bytecode(); switch (code) { case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break; case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break; --- 2230,2240 ---- // Kills: // - Rscratch void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register Rscratch, size_t index_size) { __ get_cache_and_index_at_bcp(Rcache, 1, index_size); ! Label Lresolved, Ldone; Bytecodes::Code code = bytecode(); switch (code) { case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break; case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
*** 2251,2284 **** #endif // Acquire by cmp-br-isync (see below). __ cmpdi(CCR0, Rscratch, (int)code); __ beq(CCR0, Lresolved); - // Class initialization barrier slow path lands here as well. - __ bind(L_clinit_barrier_slow); - address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ li(R4_ARG2, code); __ call_VM(noreg, entry, R4_ARG2, true); // Update registers with resolved info. __ get_cache_and_index_at_bcp(Rcache, 1, index_size); __ b(Ldone); __ bind(Lresolved); __ isync(); // Order load wrt. succeeding loads. - - // Class initialization barrier for static methods - if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) { - const Register method = Rscratch; - const Register klass = Rscratch; - - __ load_resolved_method_at_index(byte_no, Rcache, method); - __ load_method_holder(klass, method); - __ clinit_barrier(klass, R16_thread, NULL /*L_fast_path*/, &L_clinit_barrier_slow); - } - __ bind(Ldone); } // Load the constant pool cache entry at field accesses into registers. // The Rcache and Rindex registers must be set before call. --- 2251,2270 ----
*** 2341,2351 **** if (is_invokevfinal) { assert(Ritable_index == noreg, "register not used"); // Already resolved. __ get_cache_and_index_at_bcp(Rcache, 1); } else { ! resolve_cache_and_index(byte_no, Rcache, /* temp */ Rmethod, is_invokedynamic ? sizeof(u4) : sizeof(u2)); } __ ld(Rmethod, method_offset, Rcache); __ ld(Rflags, flags_offset, Rcache); --- 2327,2337 ---- if (is_invokevfinal) { assert(Ritable_index == noreg, "register not used"); // Already resolved. __ get_cache_and_index_at_bcp(Rcache, 1); } else { ! resolve_cache_and_index(byte_no, Rcache, R0, is_invokedynamic ? sizeof(u4) : sizeof(u2)); } __ ld(Rmethod, method_offset, Rcache); __ ld(Rflags, flags_offset, Rcache);
*** 3646,3656 **** __ profile_virtual_call(Rrecv_klass, Rscratch1, Rscratch2, false); // Find entry point to call. // Get declaring interface class from method ! __ load_method_holder(Rinterface_klass, Rmethod); // Get itable index from method __ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod); __ subfic(Rindex, Rindex, Method::itable_index_max); --- 3632,3644 ---- __ profile_virtual_call(Rrecv_klass, Rscratch1, Rscratch2, false); // Find entry point to call. // Get declaring interface class from method ! __ ld(Rinterface_klass, in_bytes(Method::const_offset()), Rmethod); ! __ ld(Rinterface_klass, in_bytes(ConstMethod::constants_offset()), Rinterface_klass); ! __ ld(Rinterface_klass, ConstantPool::pool_holder_offset_in_bytes(), Rinterface_klass); // Get itable index from method __ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod); __ subfic(Rindex, Rindex, Method::itable_index_max);
< prev index next >