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();