src/cpu/ppc/vm/c1_Runtime1_ppc.cpp
Print this page
*** 725,749 ****
}
break;
#if INCLUDE_ALL_GCS
case g1_pre_barrier_slow_id:
{
BarrierSet* bs = Universe::heap()->barrier_set();
if (bs->kind() != BarrierSet::G1SATBCTLogging) {
goto unimplemented_entry;
}
__ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
// Using stack slots: pre_val (pre-pushed), spill tmp, spill tmp2.
const int stack_slots = 3;
Register pre_val = R0; // previous value of memory
Register tmp = R14;
Register tmp2 = R15;
! Label refill, restart;
int satb_q_index_byte_offset =
in_bytes(JavaThread::satb_mark_queue_offset() +
SATBMarkQueue::byte_offset_of_index());
int satb_q_buf_byte_offset =
in_bytes(JavaThread::satb_mark_queue_offset() +
--- 725,758 ----
}
break;
#if INCLUDE_ALL_GCS
case g1_pre_barrier_slow_id:
+ case g1_pre_barrier_slow_with_recheck_id:
{
BarrierSet* bs = Universe::heap()->barrier_set();
if (bs->kind() != BarrierSet::G1SATBCTLogging) {
goto unimplemented_entry;
}
+ if (id == g1_pre_barrier_slow_id) {
__ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
+ } else {
+ __ set_info("g1_pre_barrier_slow_with_recheck_id", dont_gc_arguments);
+ }
// Using stack slots: pre_val (pre-pushed), spill tmp, spill tmp2.
const int stack_slots = 3;
Register pre_val = R0; // previous value of memory
Register tmp = R14;
Register tmp2 = R15;
! Label refill, restart, marking_not_active;;
!
! int satb_q_active_byte_offset =
! in_bytes(JavaThread::satb_mark_queue_offset() +
! SATBMarkQueue::byte_offset_of_active());
int satb_q_index_byte_offset =
in_bytes(JavaThread::satb_mark_queue_offset() +
SATBMarkQueue::byte_offset_of_index());
int satb_q_buf_byte_offset =
in_bytes(JavaThread::satb_mark_queue_offset() +
*** 751,760 ****
--- 760,781 ----
// Spill
__ std(tmp, -16, R1_SP);
__ std(tmp2, -24, R1_SP);
+ if (id == g1_pre_barrier_slow_with_recheck_id) {
+ // Is marking still active?
+ if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
+ __ lwz(tmp, satb_q_active_byte_offset, R16_thread);
+ } else {
+ guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
+ __ lbz(tmp, satb_q_active_byte_offset, R16_thread);
+ }
+ __ cmpdi(CCR0, tmp, 0);
+ __ beq(CCR0, marking_not_active);
+ }
+
__ bind(restart);
// Load the index into the SATB buffer. SATBMarkQueue::_index is a
// size_t so ld_ptr is appropriate.
__ ld(tmp, satb_q_index_byte_offset, R16_thread);
*** 767,776 ****
--- 788,798 ----
__ addi(tmp, tmp, -oopSize);
__ std(tmp, satb_q_index_byte_offset, R16_thread);
__ stdx(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card>
+ __ bind(marking_not_active);
// Restore temp registers and return-from-leaf.
__ ld(tmp2, -24, R1_SP);
__ ld(tmp, -16, R1_SP);
__ blr();