< prev index next >

src/cpu/x86/vm/templateInterpreter_x86_32.cpp

Print this page

        

@@ -744,10 +744,25 @@
     __ jcc(Assembler::notEqual, notChar);
     __ load_unsigned_short(rax, field_address);
     __ jmp(xreturn_path);
 
     __ bind(notChar);
+
+#if INCLUDE_ALL_GCS
+    if (UseShenandoahGC) {
+      Label notObj;
+
+      // Needs GC barriers
+      __ cmpl(rdx, atos);
+      __ jcc(Assembler::notEqual, notObj);
+      __ load_heap_oop(rax, field_address);
+      __ jmp(xreturn_path);
+
+      __ bind(notObj);
+    }
+#endif
+
 #ifdef ASSERT
     Label okay;
     __ cmpl(rdx, atos);
     __ jcc(Assembler::equal, okay);
     __ cmpl(rdx, itos);

@@ -812,11 +827,11 @@
   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;
 
     // 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));

@@ -836,21 +851,29 @@
     // calls the runtime
     __ push(rsi);
 
     // Load the value of the referent field.
     const Address field_address(rax, referent_offset);
+#if INCLUDE_ALL_GCS
+    if (UseShenandoahGC) {
+      // Needs GC barriers
+      __ load_heap_oop(rax, field_address);
+    } else
+#endif
     __ movptr(rax, field_address);
 
     // Generate the G1 pre-barrier code to log the value of
     // the referent field in an SATB buffer.
+    if (!UseShenandoahGC || ShenandoahKeepAliveBarrier) {
     __ get_thread(rcx);
     __ g1_write_barrier_pre(noreg /* obj */,
                             rax /* pre_val */,
                             rcx /* thread */,
                             rbx /* tmp */,
                             true /* tosca_save */,
                             true /* expand_call */);
+    }
 
     // _areturn
     __ pop(rsi);                // get sender sp
     __ pop(rdi);                // get return address
     __ mov(rsp, rsi);           // set sp to sender sp
< prev index next >