< prev index next >

src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.cpp

Print this page

        

@@ -74,26 +74,39 @@
 
 void BarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
                                    Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
   bool in_heap = (decorators & IN_HEAP) != 0;
   bool in_native = (decorators & IN_NATIVE) != 0;
+  bool is_not_null = (decorators & IS_NOT_NULL) != 0;
+
   switch (type) {
   case T_OBJECT:
   case T_ARRAY: {
-    val = val == noreg ? zr : val;
     if (in_heap) {
+      if (val == noreg) {
+        assert(!is_not_null, "inconsistent access");
+        if (UseCompressedOops) {
+          __ strw(zr, dst);
+        } else {
+          __ str(zr, dst);
+        }
+      } else {
       if (UseCompressedOops) {
         assert(!dst.uses(val), "not enough registers");
-        if (val != zr) {
+          if (is_not_null) {
+            __ encode_heap_oop_not_null(val);
+          } else {
           __ encode_heap_oop(val);
         }
         __ strw(val, dst);
       } else {
         __ str(val, dst);
       }
+      }
     } else {
       assert(in_native, "why else?");
+      assert(val != noreg, "not supported");
       __ str(val, dst);
     }
     break;
   }
   case T_BOOLEAN:

@@ -229,11 +242,11 @@
   }
   __ str(t1, Address(rthread, in_bytes(JavaThread::allocated_bytes_offset())));
 }
 
 void BarrierSetAssembler::nmethod_entry_barrier(MacroAssembler* masm)  {
-// DMS CHECK: 8210498: nmethod entry barriers is not implemented
+// FIXME: 8210498: nmethod entry barriers is not implemented
 #if 0
  BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
   if (bs_nm == NULL) {
     return;
   }
< prev index next >