< prev index next >
src/cpu/x86/vm/macroAssembler_x86.cpp
Print this page
rev 13055 : Implement barriers for maintaining connection matrix.
*** 43,52 ****
--- 43,53 ----
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
#include "gc/g1/g1CollectedHeap.inline.hpp"
#include "gc/g1/g1SATBCardTableModRefBS.hpp"
#include "gc/g1/heapRegion.hpp"
+ #include "gc/shenandoah/shenandoahConnectionMatrix.hpp"
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahHeapRegion.hpp"
#endif // INCLUDE_ALL_GCS
#include "crc32c.h"
#ifdef COMPILER2
*** 5347,5370 ****
if(tosca_live) pop(rax);
bind(done);
}
void MacroAssembler::g1_write_barrier_post(Register store_addr,
Register new_val,
Register thread,
Register tmp,
Register tmp2) {
#ifdef _LP64
assert(thread == r15_thread, "must be");
#endif // _LP64
- if (UseShenandoahGC) {
- // No need for this in Shenandoah.
- return;
- }
-
assert(UseG1GC, "expect G1 GC");
Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
--- 5348,5402 ----
if(tosca_live) pop(rax);
bind(done);
}
+ void MacroAssembler::shenandoah_write_barrier_post(Register store_addr,
+ Register new_val,
+ Register thread,
+ Register tmp,
+ Register tmp2) {
+ assert(UseShenandoahGC, "why else should we be here?");
+
+ if (! UseShenandoahMatrix) {
+ // No need for that barrier if not using matrix.
+ return;
+ }
+
+ Label done;
+ testptr(new_val, new_val);
+ jcc(Assembler::zero, done);
+ ShenandoahConnectionMatrix* matrix = ShenandoahHeap::heap()->connection_matrix();
+ address matrix_addr = matrix->matrix_addr();
+ movptr(rscratch1, (intptr_t) ShenandoahHeap::heap()->first_region_bottom());
+ // Compute from-region index
+ movptr(tmp, store_addr);
+ subptr(tmp, rscratch1);
+ shrptr(tmp, ShenandoahHeapRegion::RegionSizeShift);
+ // Compute to-region index
+ movptr(tmp2, new_val);
+ subptr(tmp2, rscratch1);
+ shrptr(tmp2, ShenandoahHeapRegion::RegionSizeShift);
+ // Compute matrix index
+ imulq(tmp, tmp, matrix->stride());
+ addq(tmp, tmp2);
+ movptr(rscratch1, (intptr_t) matrix_addr);
+ // Store true at _matrix[from * stride + to]
+ //movb(Address(rscratch1, tmp, Address::times_1), 3 /*true*/);
+ movbool(Address(rscratch1, tmp, Address::times_1), true);
+ bind(done);
+ }
+
void MacroAssembler::g1_write_barrier_post(Register store_addr,
Register new_val,
Register thread,
Register tmp,
Register tmp2) {
#ifdef _LP64
assert(thread == r15_thread, "must be");
#endif // _LP64
assert(UseG1GC, "expect G1 GC");
Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
< prev index next >