--- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Thu Oct 17 20:27:44 2019 +0100
+++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Thu Oct 17 20:53:35 2019 +0100
@@ -32,6 +32,7 @@
#include "interpreter/templateInterpreter.hpp"
#include "interpreter/templateTable.hpp"
#include "memory/universe.hpp"
+#include "oops/klass.inline.hpp"
#include "oops/objArrayKlass.hpp"
#include "oops/oop.inline.hpp"
#include "prims/methodHandles.hpp"
@@ -2232,7 +2233,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 +2254,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 +2267,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 +2344,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 +3649,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);
@@ -3808,7 +3821,7 @@
if (UseBiasedLocking) {
__ ld(Rscratch, in_bytes(Klass::prototype_header_offset()), RinstanceKlass);
} else {
- __ load_const_optimized(Rscratch, markOopDesc::prototype(), R0);
+ __ load_const_optimized(Rscratch, markWord::prototype().value(), R0);
}
__ std(Rscratch, oopDesc::mark_offset_in_bytes(), RallocatedObject);