< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page
rev 8961 : [mq]: diff-shenandoah.patch

@@ -3727,10 +3727,15 @@
 void MacroAssembler::null_check(Register reg, int offset) {
   if (needs_explicit_null_check(offset)) {
     // provoke OS NULL exception if reg = NULL by
     // accessing M[reg] w/o changing any (non-CC) registers
     // NOTE: cmpl is plenty here to provoke a segv
+
+    if (ShenandoahVerifyReadsToFromSpace) {
+      oopDesc::bs()->interpreter_read_barrier(this, reg);
+    }
+
     cmpptr(rax, Address(reg, 0));
     // Note: should probably use testl(rax, Address(reg, 0));
     //       may be shorter code (however, this version of
     //       testl needs to be implemented first)
   } else {

@@ -4225,10 +4230,17 @@
                                            Register tmp2) {
 #ifdef _LP64
   assert(thread == r15_thread, "must be");
 #endif // _LP64
 
+  if (UseShenandoahGC) {
+    // No need for this in Shenandoah.
+    return;
+  }
+
+  assert(UseG1GC, "expect G1 GC");
+
   Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
                                        PtrQueue::byte_offset_of_index()));
   Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
                                        PtrQueue::byte_offset_of_buf()));
 

@@ -4409,22 +4421,29 @@
 
   verify_tlab();
 
   NOT_LP64(get_thread(thread));
 
+  uint oop_extra_words = Universe::heap()->oop_extra_words();
+
   movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
   if (var_size_in_bytes == noreg) {
-    lea(end, Address(obj, con_size_in_bytes));
+    lea(end, Address(obj, con_size_in_bytes + oop_extra_words * HeapWordSize));
   } else {
+    if (oop_extra_words > 0) {
+      addq(var_size_in_bytes, oop_extra_words * HeapWordSize);
+    }
     lea(end, Address(obj, var_size_in_bytes, Address::times_1));
   }
   cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
   jcc(Assembler::above, slow_case);
 
   // update the tlab top pointer
   movptr(Address(thread, JavaThread::tlab_top_offset()), end);
 
+  Universe::heap()->compile_prepare_oop(this, obj);
+
   // recover var_size_in_bytes if necessary
   if (var_size_in_bytes == end) {
     subptr(var_size_in_bytes, obj);
   }
   verify_tlab();

@@ -5688,10 +5707,13 @@
 #endif // _LP64
 }
 
 
 void MacroAssembler::load_klass(Register dst, Register src) {
+  if (ShenandoahVerifyReadsToFromSpace) {
+    oopDesc::bs()->interpreter_read_barrier(this, src);
+  }
 #ifdef _LP64
   if (UseCompressedClassPointers) {
     movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
     decode_klass_not_null(dst);
   } else
< prev index next >