3735 save_frame(0);
3736 call(satb_log_enqueue_frameless);
3737 delayed()->mov(pre_val->after_save(), O0);
3738 restore();
3739 }
3740
3741 bind(filtered);
3742 }
3743
3744 static address dirty_card_log_enqueue = 0;
3745 static u_char* dirty_card_log_enqueue_end = 0;
3746
3747 // This gets to assume that o0 contains the object address.
3748 static void generate_dirty_card_log_enqueue(jbyte* byte_map_base) {
3749 BufferBlob* bb = BufferBlob::create("dirty_card_enqueue", EnqueueCodeSize*2);
3750 CodeBuffer buf(bb);
3751 MacroAssembler masm(&buf);
3752 #define __ masm.
3753 address start = __ pc();
3754
3755 Label not_already_dirty, restart, refill;
3756
3757 #ifdef _LP64
3758 __ srlx(O0, CardTableModRefBS::card_shift, O0);
3759 #else
3760 __ srl(O0, CardTableModRefBS::card_shift, O0);
3761 #endif
3762 AddressLiteral addrlit(byte_map_base);
3763 __ set(addrlit, O1); // O1 := <card table base>
3764 __ ldub(O0, O1, O2); // O2 := [O0 + O1]
3765
3766 assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
3767 __ cmp_and_br_short(O2, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
3768
3769 // We didn't take the branch, so we're already dirty: return.
3770 // Use return-from-leaf
3771 __ retl();
3772 __ delayed()->nop();
3773
3774 // Not dirty.
3775 __ bind(not_already_dirty);
3776
3777 // Get O0 + O1 into a reg by itself
3778 __ add(O0, O1, O3);
3779
3780 // First, dirty it.
3781 __ stb(G0, O3, G0); // [cardPtr] := 0 (i.e., dirty).
3782
3783 int dirty_card_q_index_byte_offset =
3784 in_bytes(JavaThread::dirty_card_queue_offset() +
3785 PtrQueue::byte_offset_of_index());
3786 int dirty_card_q_buf_byte_offset =
3787 in_bytes(JavaThread::dirty_card_queue_offset() +
3788 PtrQueue::byte_offset_of_buf());
|
3735 save_frame(0);
3736 call(satb_log_enqueue_frameless);
3737 delayed()->mov(pre_val->after_save(), O0);
3738 restore();
3739 }
3740
3741 bind(filtered);
3742 }
3743
3744 static address dirty_card_log_enqueue = 0;
3745 static u_char* dirty_card_log_enqueue_end = 0;
3746
3747 // This gets to assume that o0 contains the object address.
3748 static void generate_dirty_card_log_enqueue(jbyte* byte_map_base) {
3749 BufferBlob* bb = BufferBlob::create("dirty_card_enqueue", EnqueueCodeSize*2);
3750 CodeBuffer buf(bb);
3751 MacroAssembler masm(&buf);
3752 #define __ masm.
3753 address start = __ pc();
3754
3755 Label not_already_dirty, restart, refill, young_card;
3756
3757 #ifdef _LP64
3758 __ srlx(O0, CardTableModRefBS::card_shift, O0);
3759 #else
3760 __ srl(O0, CardTableModRefBS::card_shift, O0);
3761 #endif
3762 AddressLiteral addrlit(byte_map_base);
3763 __ set(addrlit, O1); // O1 := <card table base>
3764 __ ldub(O0, O1, O2); // O2 := [O0 + O1]
3765
3766 __ cmp_and_br_short(O2, G1SATBCardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card);
3767
3768 __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
3769 __ ldub(O0, O1, O2); // O2 := [O0 + O1]
3770
3771 assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
3772 __ cmp_and_br_short(O2, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
3773
3774 __ bind(young_card);
3775 // We didn't take the branch, so we're already dirty: return.
3776 // Use return-from-leaf
3777 __ retl();
3778 __ delayed()->nop();
3779
3780 // Not dirty.
3781 __ bind(not_already_dirty);
3782
3783 // Get O0 + O1 into a reg by itself
3784 __ add(O0, O1, O3);
3785
3786 // First, dirty it.
3787 __ stb(G0, O3, G0); // [cardPtr] := 0 (i.e., dirty).
3788
3789 int dirty_card_q_index_byte_offset =
3790 in_bytes(JavaThread::dirty_card_queue_offset() +
3791 PtrQueue::byte_offset_of_index());
3792 int dirty_card_q_buf_byte_offset =
3793 in_bytes(JavaThread::dirty_card_queue_offset() +
3794 PtrQueue::byte_offset_of_buf());
|