< prev index next >

src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page
rev 12152 : [mq]: verification.patch
rev 12153 : imported patch shared_sb_stub.patch

@@ -3808,10 +3808,46 @@
   pop(store_addr->bit(true) | new_val->bit(true), sp);
 
   bind(done);
 }
 
+void MacroAssembler::shenandoah_write_barrier(Register dst) {
+  assert(UseShenandoahGC, "must only be called with Shenandoah GC active");
+  assert(dst != rscratch1, "need rscratch1");
+  assert(dst != rscratch2, "need rscratch2");
+
+  Label done;
+
+  // Check for evacuation-in-progress
+  Address evacuation_in_progress = Address(rthread, in_bytes(JavaThread::evacuation_in_progress_offset()));
+  ldrb(rscratch1, evacuation_in_progress);
+  membar(Assembler::LoadLoad);
+
+  // The read-barrier.
+  ldr(dst, Address(dst, BrooksPointer::byte_offset()));
+
+  // Evac-check ...
+  cbzw(rscratch1, done);
+
+  RegSet to_save = RegSet::of(r0);
+  if (dst != r0) {
+    push(to_save, sp);
+    mov(r0, dst);
+  }
+
+  assert(StubRoutines::aarch64::shenandoah_wb() != NULL, "need write barrier stub");
+  far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::aarch64::shenandoah_wb())));
+
+  if (dst != r0) {
+    mov(dst, r0);
+    pop(to_save, sp);
+  }
+  block_comment("} Shenandoah write barrier");
+
+  bind(done);
+}
+
 #endif // INCLUDE_ALL_GCS
 
 Address MacroAssembler::allocate_metadata_address(Metadata* obj) {
   assert(oop_recorder() != NULL, "this assembler needs a Recorder");
   int index = oop_recorder()->allocate_metadata_index(obj);
< prev index next >