--- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Tue Jun 11 09:27:51 2019 +0200
+++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Tue Jun 11 09:51:33 2019 +0200
@@ -2232,7 +2232,7 @@
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;
+ Label Lresolved, Ldone, L_clinit_barrier_slow;
Bytecodes::Code code = bytecode();
switch (code) {
@@ -2253,6 +2253,9 @@
__ 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);
@@ -2263,6 +2266,17 @@
__ 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);
}
@@ -2329,7 +2343,7 @@
// 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));
+ resolve_cache_and_index(byte_no, Rcache, /* temp */ Rmethod, is_invokedynamic ? sizeof(u4) : sizeof(u2));
}
__ ld(Rmethod, method_offset, Rcache);
@@ -3634,9 +3648,7 @@
// 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);
+ __ load_method_holder(Rinterface_klass, Rmethod);
// Get itable index from method
__ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod);