< prev index next >

src/cpu/x86/vm/templateInterpreter_x86_64.cpp

Print this page

        

@@ -543,10 +543,11 @@
       __ bind(L);
     }
 #endif // ASSERT
 
     __ bind(done);
+    oopDesc::bs()->interpreter_write_barrier(_masm, rax);
   }
 
   // add space for monitor & lock
   __ subptr(rsp, entry_size); // add space for a monitor entry
   __ movptr(monitor_block_top, rsp);  // set new monitor block top

@@ -635,21 +636,23 @@
   address entry = __ pc();
 
   const int referent_offset = java_lang_ref_Reference::referent_offset;
   guarantee(referent_offset > 0, "referent offset not initialized");
 
-  if (UseG1GC) {
+  if (UseG1GC || UseShenandoahGC) {
     Label slow_path;
     // rbx: method
 
     // Check if local 0 != NULL
     // If the receiver is null then it is OK to jump to the slow path.
     __ movptr(rax, Address(rsp, wordSize));
 
     __ testptr(rax, rax);
     __ jcc(Assembler::zero, slow_path);
 
+    oopDesc::bs()->interpreter_read_barrier_not_null(_masm, rax);
+
     // rax: local 0
     // rbx: method (but can be used as scratch now)
     // rdx: scratch
     // rdi: scratch
 

@@ -776,10 +779,11 @@
       __ movl2ptr(off, Address(rsp, 2*wordSize)); // offset
       __ addq(buf, off); // + offset
       __ movl(crc,   Address(rsp, 5*wordSize)); // Initial CRC
     } else {
       __ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array
+      oopDesc::bs()->interpreter_read_barrier_not_null(_masm, buf);
       __ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size
       __ movl2ptr(off, Address(rsp, 2*wordSize)); // offset
       __ addq(buf, off); // + offset
       __ movl(crc,   Address(rsp, 4*wordSize)); // Initial CRC
     }
< prev index next >