# HG changeset patch # Parent 7a9a828195c769181646a6e611eea32d46763fb2 diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.hpp --- a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -40,7 +40,7 @@ public: virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, - Register src, Register dst, Register count) {} + Register src, Register dst, Register count, Label& L_exit, Register klass) {} virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {} diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.cpp --- a/src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -29,7 +29,7 @@ #define __ masm-> void ModRefBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, - Register src, Register dst, Register count) { + Register src, Register dst, Register count, Label& L_exit) { bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0; bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0; bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops); diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.hpp --- a/src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -42,7 +42,7 @@ Address dst, Register val, Register tmp1, Register tmp2) = 0; public: virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, - Register src, Register dst, Register count); + Register src, Register dst, Register count, Label& L_exit); virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count); diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp --- a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -44,7 +44,7 @@ address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL; void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, - Register src, Register dst, Register count) { + Register src, Register dst, Register count, Label& L_exit) { bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0; bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0; @@ -52,43 +52,13 @@ bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0; if (type == T_OBJECT || type == T_ARRAY) { + Label fastpath; + Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); + __ testb(gc_state, ShenandoahHeap::HAS_FORWARDED, ShenandoahHeap::MARKING | ShenandoahHeap::EVACUATION | ShenandoahHeap::UPDATEREFS | ShenandoahHeap::TRAVERSAL); + __ jcc(Assembler::zero, fastpath); + __ pusha(); // push registers #ifdef _LP64 - if (!checkcast && !obj_int) { - // Save count for barrier - __ movptr(r11, count); - } else if (disjoint && obj_int) { - // Save dst in r11 in the disjoint case - __ movq(r11, dst); - } -#else - if (disjoint) { - __ mov(rdx, dst); // save 'to' - } -#endif - - if (!dest_uninitialized && !ShenandoahHeap::heap()->heuristics()->can_do_traversal_gc()) { - Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); -#ifndef _LP64 - __ push(thread); - __ get_thread(thread); -#endif - - Label filtered; - Address in_progress(thread, in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset())); - // Is marking active? - if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) { - __ cmpl(in_progress, 0); - } else { - assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption"); - __ cmpb(in_progress, 0); - } - - NOT_LP64(__ pop(thread);) - - __ jcc(Assembler::equal, filtered); - - __ pusha(); // push registers -#ifdef _LP64 + /* if (count == c_rarg0) { if (dst == c_rarg1) { // exactly backwards!! @@ -101,64 +71,81 @@ __ movptr(c_rarg0, dst); __ movptr(c_rarg1, count); } - if (UseCompressedOops) { - __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry), 2); + */ + if (checkcast) { + if (disjoint) { + if (dest_uninitialized) { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_duninit_disjoint_checkcast), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_duninit_disjoint_checkcast), src, dst, count); + } + } else { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_disjoint_checkcast), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_disjoint_checkcast), src, dst, count); + } + } } else { - __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), 2); + if (dest_uninitialized) { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_duninit_conjoint_checkcast), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_duninit_conjoint_checkcast), src, dst, count); + } + } else { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_conjoint_checkcast), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_conjoint_checkcast), src, dst, count); + } + } } + } else { + if (disjoint) { + if (dest_uninitialized) { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_duninit_disjoint), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_duninit_disjoint), src, dst, count); + } + } else { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_disjoint), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_disjoint), src, dst, count); + } + } + } else { + if (dest_uninitialized) { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_duninit_conjoint), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_duninit_conjoint), src, dst, count); + } + } else { + if (UseCompressedOops) { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_narrow_conjoint), src, dst, count); + } else { + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::arraycopy_oop_conjoint), src, dst, count); + } + } + } + } #else __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_pre_oop_entry), - dst, count); + src, dst, count); #endif __ popa(); - __ bind(filtered); + __ jmp(L_exit); // Skip fastpath + __ bind(fastpath); } } - } void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) { - bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0; - bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0; - bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops); - Register tmp = rax; - - if (type == T_OBJECT || type == T_ARRAY) { -#ifdef _LP64 - if (!checkcast && !obj_int) { - // Save count for barrier - count = r11; - } else if (disjoint && obj_int) { - // Use the saved dst in the disjoint case - dst = r11; - } else if (checkcast) { - tmp = rscratch1; - } -#else - if (disjoint) { - __ mov(dst, rdx); // restore 'to' - } -#endif - - __ pusha(); // push registers (overkill) -#ifdef _LP64 - if (c_rarg0 == count) { // On win64 c_rarg0 == rcx - assert_different_registers(c_rarg1, dst); - __ mov(c_rarg1, count); - __ mov(c_rarg0, dst); - } else { - assert_different_registers(c_rarg0, count); - __ mov(c_rarg0, dst); - __ mov(c_rarg1, count); - } - __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), 2); -#else - __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_ref_array_post_entry), - dst, count); -#endif - __ popa(); - } } void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm, diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp --- a/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -83,7 +83,7 @@ Register res, Address addr, Register oldval, Register newval, bool exchange, Register tmp1, Register tmp2); virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, - Register src, Register dst, Register count); + Register src, Register dst, Register count, Label& L_exit); virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count); virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp --- a/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -224,7 +224,8 @@ BasicType type, Register src, Register dst, - Register count) { + Register count, + Label& L_exit) { if (!ZBarrierSet::barrier_needed(decorators, type)) { // Barrier not needed return; diff -r 7a9a828195c7 src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.hpp --- a/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -63,7 +63,8 @@ BasicType type, Register src, Register dst, - Register count); + Register count, + Label& L_exit); virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env, diff -r 7a9a828195c7 src/hotspot/cpu/x86/stubGenerator_x86_64.cpp --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -1868,7 +1868,7 @@ BasicType type = is_oop ? T_OBJECT : T_INT; BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); - bs->arraycopy_prologue(_masm, decorators, type, from, to, count); + bs->arraycopy_prologue(_masm, decorators, type, from, to, count, L_exit); // 'from', 'to' and 'count' are now valid __ movptr(dword_count, count); @@ -1963,7 +1963,7 @@ BasicType type = is_oop ? T_OBJECT : T_INT; BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); // no registers are destroyed by this call - bs->arraycopy_prologue(_masm, decorators, type, from, to, count); + bs->arraycopy_prologue(_masm, decorators, type, from, to, count, L_exit); assert_clean_int(count, rax); // Make sure 'count' is clean int. // 'from', 'to' and 'count' are now valid @@ -2066,7 +2066,7 @@ BasicType type = is_oop ? T_OBJECT : T_LONG; BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); - bs->arraycopy_prologue(_masm, decorators, type, from, to, qword_count); + bs->arraycopy_prologue(_masm, decorators, type, from, to, qword_count, L_exit); // Copy from low to high addresses. Use 'to' as scratch. __ lea(end_from, Address(from, qword_count, Address::times_8, -8)); @@ -2159,7 +2159,7 @@ BasicType type = is_oop ? T_OBJECT : T_LONG; BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); - bs->arraycopy_prologue(_masm, decorators, type, from, to, qword_count); + bs->arraycopy_prologue(_masm, decorators, type, from, to, qword_count, L_exit); __ jmp(L_copy_bytes); @@ -2350,7 +2350,7 @@ BasicType type = T_OBJECT; BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler(); - bs->arraycopy_prologue(_masm, decorators, type, from, to, count); + bs->arraycopy_prologue(_masm, decorators, type, from, to, count, L_done, ckval); // Copy from low to high addresses, indexed from the end of each array. __ lea(end_from, end_from_addr); diff -r 7a9a828195c7 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -131,7 +131,7 @@ } template -void ShenandoahBarrierSet::write_ref_array_pre_work(T* dst, size_t count) { +void ShenandoahBarrierSet::write_ref_array_pre_work(T* src, T* dst, size_t count) { shenandoah_assert_not_in_cset_loc_except(dst, _heap->cancelled_gc()); if (ShenandoahSATBBarrier && _heap->is_concurrent_mark_in_progress()) { T* elem_ptr = dst; @@ -144,15 +144,15 @@ } } -void ShenandoahBarrierSet::write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized) { +void ShenandoahBarrierSet::write_ref_array_pre(oop* src, oop* dst, size_t count, bool dest_uninitialized) { if (! dest_uninitialized) { - write_ref_array_pre_work(dst, count); + write_ref_array_pre_work(src, dst, count); } } -void ShenandoahBarrierSet::write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized) { +void ShenandoahBarrierSet::write_ref_array_pre(narrowOop* src, narrowOop* dst, size_t count, bool dest_uninitialized) { if (! dest_uninitialized) { - write_ref_array_pre_work(dst, count); + write_ref_array_pre_work(src, dst, count); } } diff -r 7a9a828195c7 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -64,11 +64,11 @@ void write_ref_array(HeapWord* start, size_t count); template void - write_ref_array_pre_work(T* dst, size_t count); + write_ref_array_pre_work(T* src, T* dst, size_t count); - void write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized); + void write_ref_array_pre(oop* src, oop* dst, size_t count, bool dest_uninitialized); - void write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized); + void write_ref_array_pre(narrowOop* src, narrowOop* dst, size_t count, bool dest_uninitialized); // We export this to make it available in cases where the static // type of the barrier set is known. Note that it is non-virtual. diff -r 7a9a828195c7 src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.cpp Thu Mar 28 18:50:18 2019 +0100 @@ -28,20 +28,24 @@ #include "runtime/interfaceSupport.inline.hpp" #include "oops/oop.inline.hpp" -void ShenandoahRuntime::write_ref_array_pre_oop_entry(oop* dst, size_t length) { - ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); - bs->write_ref_array_pre(dst, length, false); +void ShenandoahRuntime::arraycopy_oop_disjoint(oop* src, oop* dst, size_t length) { } -void ShenandoahRuntime::write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length) { - ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); - bs->write_ref_array_pre(dst, length, false); -} - -void ShenandoahRuntime::write_ref_array_post_entry(HeapWord* dst, size_t length) { - ShenandoahBarrierSet *bs = ShenandoahBarrierSet::barrier_set(); - bs->ShenandoahBarrierSet::write_ref_array(dst, length); -} +void ShenandoahRuntime::arraycopy_narrow_disjoint(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_duinit_disjoint(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_duinit_disjoint(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_conjoint(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_conjoint(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_duinit_conjoint(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_duinit_conjoint(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_disjoint_checkcast(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_disjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_duinit_disjoint_checkcast(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_duinit_disjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_conjoint_checkcast(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_conjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); +void ShenandoahRuntime::arraycopy_oop_duinit_conjoint_checkcast(oop* src, oop* dst, size_t length); +void ShenandoahRuntime::arraycopy_narrow_duinit_conjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); // Shenandoah pre write barrier slowpath JRT_LEAF(void, ShenandoahRuntime::write_ref_field_pre_entry(oopDesc* orig, JavaThread *thread)) diff -r 7a9a828195c7 src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Mon Mar 11 18:44:40 2019 +0100 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Thu Mar 28 18:50:18 2019 +0100 @@ -32,9 +32,23 @@ class ShenandoahRuntime : public AllStatic { public: - static void write_ref_array_pre_oop_entry(oop* dst, size_t length); - static void write_ref_array_pre_narrow_oop_entry(narrowOop* dst, size_t length); - static void write_ref_array_post_entry(HeapWord* dst, size_t length); + static void arraycopy_oop_disjoint(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_disjoint(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_duinit_disjoint(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_duinit_disjoint(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_conjoint(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_conjoint(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_duinit_conjoint(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_duinit_conjoint(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_disjoint_checkcast(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_disjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_duinit_disjoint_checkcast(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_duinit_disjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_conjoint_checkcast(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_conjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); + static void arraycopy_oop_duinit_conjoint_checkcast(oop* src, oop* dst, size_t length); + static void arraycopy_narrow_duinit_conjoint_checkcast(narrowOop* src, narrowOop* dst, size_t length); + static void write_ref_field_pre_entry(oopDesc* orig, JavaThread* thread); static oopDesc* load_reference_barrier_JRT(oopDesc* src);