< prev index next >

src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

Print this page

        

@@ -41,10 +41,14 @@
 #define __ gen()->lir(__FILE__, __LINE__)->
 #else
 #define __ gen()->lir()->
 #endif
 
+#if INCLUDE_ALL_GCS
+#include "gc_implementation/shenandoah/c1/shenandoahBarrierSetC1.hpp"
+#endif
+
 // Item will be loaded into a byte register; Intel only
 void LIRItem::load_byte_item() {
   load_item();
   LIR_Opr res = result();
 

@@ -784,12 +788,23 @@
     pre_barrier(addr, LIR_OprFact::illegalOpr /* pre_val */,
                 true /* do_load */, false /* patch */, NULL);
   }
 
   LIR_Opr ill = LIR_OprFact::illegalOpr;  // for convenience
-  if (type == objectType)
+  if (type == objectType) {
+#if INCLUDE_ALL_GCS
+    if (UseShenandoahGC && ShenandoahCASBarrier) {
+      LIR_Opr result = rlock_result(x);
+      __ cas_obj(addr, cmp.result(), val.result(), new_register(T_OBJECT), new_register(T_OBJECT), result);
+      // Shenandoah C1 barrier would do all result management itself, shortcut here.
+      return;
+    } else
+#endif
+    {
     __ cas_obj(addr, cmp.result(), val.result(), ill, ill);
+    }
+  }
   else if (type == intType)
     __ cas_int(addr, cmp.result(), val.result(), ill, ill);
   else if (type == longType)
     __ cas_long(addr, cmp.result(), val.result(), ill, ill);
   else {

@@ -1483,10 +1498,18 @@
       // Do the pre-write barrier, if any.
       pre_barrier(LIR_OprFact::address(addr), LIR_OprFact::illegalOpr /* pre_val */,
                   true /* do_load */, false /* patch */, NULL);
     }
     __ xchg(LIR_OprFact::address(addr), dst, dst, LIR_OprFact::illegalOpr);
+
+#if INCLUDE_ALL_GCS
+    if (UseShenandoahGC && is_obj) {
+      LIR_Opr tmp = ShenandoahBarrierSet::barrier_set()->bsc1()->load_reference_barrier(this, dst);
+      __ move(tmp, dst);
+    }
+#endif
+
     if (is_obj) {
       // Seems to be a precise address
       post_barrier(LIR_OprFact::address(addr), data);
     }
   }
< prev index next >