src/cpu/sparc/vm/macroAssembler_sparc.cpp

Print this page
rev 5363 : imported patch filtering.diff


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