--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp Wed Jun 12 14:21:36 2019 +0200
+++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp Wed Jun 12 14:22:04 2019 +0200
@@ -3130,6 +3130,33 @@
BLOCK_COMMENT("} check_klass_subtype");
}
+void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
+ assert(L_fast_path != NULL || L_slow_path != NULL, "at least one is required");
+
+ Label L_fallthrough;
+ if (L_fast_path == NULL) {
+ L_fast_path = &L_fallthrough;
+ } else if (L_slow_path == NULL) {
+ L_slow_path = &L_fallthrough;
+ }
+
+ // Fast path check: class is fully initialized
+ z_cli(Address(klass, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
+ z_bre(*L_fast_path);
+
+ // Fast path check: current thread is initializer thread
+ z_cg(thread, Address(klass, InstanceKlass::init_thread_offset()));
+ if (L_slow_path == &L_fallthrough) {
+ z_bre(*L_fast_path);
+ } else if (L_fast_path == &L_fallthrough) {
+ z_brne(*L_slow_path);
+ } else {
+ Unimplemented();
+ }
+
+ bind(L_fallthrough);
+}
+
// Increment a counter at counter_address when the eq condition code is
// set. Kills registers tmp1_reg and tmp2_reg and preserves the condition code.
void MacroAssembler::increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg) {
@@ -4346,6 +4373,12 @@
resolve_oop_handle(mirror);
}
+void MacroAssembler::load_method_holder(Register holder, Register method) {
+ mem2reg_opt(holder, Address(method, Method::const_offset()));
+ mem2reg_opt(holder, Address(holder, ConstMethod::constants_offset()));
+ mem2reg_opt(holder, Address(holder, ConstantPool::pool_holder_offset_in_bytes()));
+}
+
//---------------------------------------------------------------
//--- Operations on arrays.
//---------------------------------------------------------------