< prev index next >

src/cpu/sparc/vm/c1_Runtime1_sparc.cpp

Print this page




 913       {
 914         BarrierSet* bs = Universe::heap()->barrier_set();
 915         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 916           __ save_frame(0);
 917           __ set((int)id, O1);
 918           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 919           __ should_not_reach_here();
 920           break;
 921         }
 922 
 923         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 924 
 925         Register addr = G4;
 926         Register cardtable = G5;
 927         Register tmp  = G1_scratch;
 928         Register tmp2 = G3_scratch;
 929         jbyte* byte_map_base = barrier_set_cast<CardTableModRefBS>(bs)->byte_map_base;
 930 
 931         Label not_already_dirty, restart, refill, young_card;
 932 
 933 #ifdef _LP64
 934         __ srlx(addr, CardTableModRefBS::card_shift, addr);
 935 #else
 936         __ srl(addr, CardTableModRefBS::card_shift, addr);
 937 #endif
 938 
 939         AddressLiteral rs(byte_map_base);
 940         __ set(rs, cardtable);         // cardtable := <card table base>
 941         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 942 
 943         __ cmp_and_br_short(tmp, G1SATBCardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card);
 944 
 945         __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
 946         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 947 
 948         assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
 949         __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
 950 
 951         __ bind(young_card);
 952         // We didn't take the branch, so we're already dirty: return.
 953         // Use return-from-leaf
 954         __ retl();
 955         __ delayed()->nop();
 956 
 957         // Not dirty.




 913       {
 914         BarrierSet* bs = Universe::heap()->barrier_set();
 915         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 916           __ save_frame(0);
 917           __ set((int)id, O1);
 918           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 919           __ should_not_reach_here();
 920           break;
 921         }
 922 
 923         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 924 
 925         Register addr = G4;
 926         Register cardtable = G5;
 927         Register tmp  = G1_scratch;
 928         Register tmp2 = G3_scratch;
 929         jbyte* byte_map_base = barrier_set_cast<CardTableModRefBS>(bs)->byte_map_base;
 930 
 931         Label not_already_dirty, restart, refill, young_card;
 932 

 933         __ srlx(addr, CardTableModRefBS::card_shift, addr);



 934 
 935         AddressLiteral rs(byte_map_base);
 936         __ set(rs, cardtable);         // cardtable := <card table base>
 937         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 938 
 939         __ cmp_and_br_short(tmp, G1SATBCardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card);
 940 
 941         __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
 942         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 943 
 944         assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
 945         __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
 946 
 947         __ bind(young_card);
 948         // We didn't take the branch, so we're already dirty: return.
 949         // Use return-from-leaf
 950         __ retl();
 951         __ delayed()->nop();
 952 
 953         // Not dirty.


< prev index next >