< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page
rev 49096 : [mq]: eliminate_wb_stub.patch

@@ -801,11 +801,11 @@
 
   address generate_shenandoah_wb(bool c_abi, bool do_cset_test) {
     StubCodeMark mark(this, "StubRoutines", "shenandoah_wb");
     address start = __ pc();
 
-    Label not_done, done, slow_case, not_an_instance, is_array;
+    Label not_done;
 
     // We use RDI, which also serves as argument register for slow call.
     // RAX always holds the src object ptr, except after the slow call and
     // the cmpxchg, then it holds the result.
     // R8 and RCX are used as temporary registers.

@@ -847,107 +847,10 @@
 
     if (!c_abi) {
       __ push(rcx);
     }
 
-    if (UseTLAB && ShenandoahAsmWB) {
-
-      Register new_obj = r8;
-      __ movptr(new_obj, Address(r15_thread, JavaThread::gclab_top_offset()));
-      __ testptr(new_obj, new_obj);
-      __ jcc(Assembler::zero, slow_case); // No TLAB.
-
-      __ load_klass(rcx, rax);
-
-      // Figure out object size.
-      __ movl(rcx, Address(rcx, Klass::layout_helper_offset()));
-      __ testl(rcx, Klass::_lh_instance_slow_path_bit);
-      // test to see if it has a finalizer or is malformed in some way
-      __ jcc(Assembler::notZero, slow_case);
-      __ cmpl(rcx, Klass::_lh_neutral_value); // Make sure it's an instance (LH > 0)
-      __ jcc(Assembler::lessEqual, not_an_instance); // Thrashes rcx, returns size in rcx. Uses rax.
-      __ bind(is_array);
-
-      // Size in rdi, new_obj in r8, src obj in rax
-
-      Register new_obj_end = rdi;
-      int oop_extra_words = Universe::heap()->oop_extra_words();
-      __ addq(rcx, oop_extra_words * HeapWordSize);
-      __ lea(new_obj_end, Address(new_obj, rcx, Address::times_1));
-      __ cmpptr(new_obj_end, Address(r15_thread, JavaThread::gclab_end_offset()));
-      __ jcc(Assembler::above, slow_case);
-      __ subq(rcx, oop_extra_words * HeapWordSize);
-
-      // Store Brooks pointer and adjust start of newobj.
-      Universe::heap()->compile_prepare_oop(_masm, new_obj);
-
-      // Size in rcx, new_obj in r8, src obj in rax
-
-      // Copy object.
-      Label loop;
-      if (!c_abi) {
-        __ push(rdi); // Save new_obj_end
-        __ push(rsi);
-      } else {
-        __ mov(r9, rdi); // Save new_obj_end
-      }
-      __ shrl(rcx, 3);   // Make it num-64-bit-words
-      __ mov(rdi, r8); // Mov dst into rdi
-      __ mov(rsi, rax); // Src into rsi.
-      __ rep_mov();
-      if (!c_abi) {
-        __ pop(rsi); // Restore rsi.
-        __ pop(rdi); // Restore new_obj_end
-      } else {
-        __ mov(rdi, r9); // Restore new_obj_end
-      }
-
-      // Src obj still in rax.
-      if (os::is_MP()) {
-        __ lock();
-      }
-      __ cmpxchgptr(new_obj, Address(rax, BrooksPointer::byte_offset(), Address::times_1));
-      __ jccb(Assembler::notEqual, done); // Failed. Updated object in rax.
-      // Otherwise, we succeeded.
-      __ mov(rax, new_obj);
-      __ movptr(Address(r15_thread, JavaThread::gclab_top_offset()), new_obj_end);
-      __ bind(done);
-
-      if (!c_abi) {
-        __ pop(rcx);
-        __ pop(r8);
-        __ pop(rdi);
-      }
-
-      __ ret(0);
-
-      __ bind(not_an_instance);
-      if (!c_abi) {
-        __ push(rdx);
-      }
-      // Layout_helper bits are in rcx
-      __ movl(rdx, rcx); // Move layout_helper bits to rdx
-      __ movl(rdi, Address(rax, arrayOopDesc::length_offset_in_bytes()));
-      __ shrl(rcx, Klass::_lh_log2_element_size_shift);
-      __ andl(rcx, Klass::_lh_log2_element_size_mask);
-      __ shll(rdi); // Shifts left by number of bits in rcx (CL)
-      __ shrl(rdx, Klass::_lh_header_size_shift);
-      __ andl(rdx, Klass::_lh_header_size_mask);
-      __ addl(rdi, rdx);
-      // Round up.
-      __ addl(rdi, HeapWordSize-1);
-      __ andl(rdi, -HeapWordSize);
-      if (!c_abi) {
-        __ pop(rdx);
-      }
-      // Move size (rdi) into rcx
-      __ movl(rcx, rdi);
-      __ jmp(is_array);
-
-      __ bind(slow_case);
-    }
-
     if (!c_abi) {
       __ push(rdx);
       __ push(rdi);
       __ push(rsi);
       __ push(r8);

@@ -5327,11 +5230,10 @@
                                                 throw_NullPointerException_at_call));
 
     // entry points that are platform specific
     if (UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValWriteBarrier || ShenandoahStoreValEnqueueBarrier)) {
          StubRoutines::x86::_shenandoah_wb = generate_shenandoah_wb(false, true);
-         StubRoutines::_shenandoah_wb_C = generate_shenandoah_wb(true, !ShenandoahWriteBarrierCsetTestInIR);
     }
     StubRoutines::x86::_f2i_fixup = generate_f2i_fixup();
     StubRoutines::x86::_f2l_fixup = generate_f2l_fixup();
     StubRoutines::x86::_d2i_fixup = generate_d2i_fixup();
     StubRoutines::x86::_d2l_fixup = generate_d2l_fixup();
< prev index next >