< prev index next >

src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp

Print this page

        

@@ -273,47 +273,67 @@
 }
 
 void G1BarrierSetAssembler::oop_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 as_normal = (decorators & AS_NORMAL) != 0;
+  assert((decorators & IS_DEST_UNINITIALIZED) == 0, "unsupported");
+
+  bool needs_pre_barrier = as_normal;
+  bool needs_post_barrier = (val != noreg && in_heap);
+
+
    if (tmp3 == noreg) {
-       tmp3 = r8;  
+     tmp3 = rscratch2;
    }
+   // assert_different_registers(val, tmp1, tmp2, tmp3, rscratch1, rscratch2);
+   assert_different_registers(val, tmp1, tmp2, tmp3);
 
   // flatten object address if needed
   if (dst.index() == noreg && dst.offset() == 0) {
-    if (dst.base() != r3) {
-      __ mov(r3, dst.base());
+    if (dst.base() != tmp1) {
+      __ mov(tmp1, dst.base());
     }
   } else {
-    __ lea(r3, dst);
+    __ lea(tmp1, dst);
   }
 
+
+  if (needs_pre_barrier) {
   g1_write_barrier_pre(masm,
-                       r3 /* obj */,
+                       tmp1 /* obj */,
                        tmp2 /* pre_val */,
                        rthread /* thread */,
-                       tmp1  /* tmp */,
+                       tmp3  /* tmp */,
                        val != noreg /* tosca_live */,
                        false /* expand_call */);
+  }
 
   if (val == noreg) {
-    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), noreg, noreg, noreg, noreg);
+    BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), noreg, noreg, noreg, noreg);
   } else {
     // G1 barrier needs uncompressed oop for region cross check.
     Register new_val = val;
+    if (needs_post_barrier) {
     if (UseCompressedOops) {
-      new_val = rscratch2;
+        // FIXME: Refactor the code to avoid usage of r19 and stay within tmpX
+        new_val = r19;
       __ mov(new_val, val);
     }
-    BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), val, noreg, noreg, noreg);
+   }
+
+   BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg, noreg);
+
+    if (needs_post_barrier) {
     g1_write_barrier_post(masm,
-                          r3 /* store_adr */,
+                          tmp1 /* store_adr */,
                           new_val /* new_val */,
                           rthread /* thread */,
-                          tmp1 /* tmp */,
-                          tmp2 /* tmp2 */);
+                          tmp2 /* tmp */,
+                          tmp3 /* tmp2 */);
+   }
   }
 
 }
 
 #ifdef COMPILER1
< prev index next >