< 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 >