src/cpu/sparc/vm/c1_Runtime1_sparc.cpp

Print this page
rev 4975 : imported patch refactor-and-sparc.diff


 889 
 890     case g1_post_barrier_slow_id:
 891       {
 892         BarrierSet* bs = Universe::heap()->barrier_set();
 893         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 894           __ save_frame(0);
 895           __ set((int)id, O1);
 896           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 897           __ should_not_reach_here();
 898           break;
 899         }
 900 
 901         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 902 
 903         Register addr = G4;
 904         Register cardtable = G5;
 905         Register tmp  = G1_scratch;
 906         Register tmp2 = G3_scratch;
 907         jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
 908 
 909         Label not_already_dirty, restart, refill;
 910 
 911 #ifdef _LP64
 912         __ srlx(addr, CardTableModRefBS::card_shift, addr);
 913 #else
 914         __ srl(addr, CardTableModRefBS::card_shift, addr);
 915 #endif
 916 
 917         AddressLiteral rs(byte_map_base);
 918         __ set(rs, cardtable);         // cardtable := <card table base>
 919         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 920 





 921         assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
 922         __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
 923 

 924         // We didn't take the branch, so we're already dirty: return.
 925         // Use return-from-leaf
 926         __ retl();
 927         __ delayed()->nop();
 928 
 929         // Not dirty.
 930         __ bind(not_already_dirty);
 931 
 932         // Get cardtable + tmp into a reg by itself
 933         __ add(addr, cardtable, tmp2);
 934 
 935         // First, dirty it.
 936         __ stb(G0, tmp2, 0);  // [cardPtr] := 0  (i.e., dirty).
 937 
 938         Register tmp3 = cardtable;
 939         Register tmp4 = tmp;
 940 
 941         // these registers are now dead
 942         addr = cardtable = tmp = noreg;
 943 




 889 
 890     case g1_post_barrier_slow_id:
 891       {
 892         BarrierSet* bs = Universe::heap()->barrier_set();
 893         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 894           __ save_frame(0);
 895           __ set((int)id, O1);
 896           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 897           __ should_not_reach_here();
 898           break;
 899         }
 900 
 901         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 902 
 903         Register addr = G4;
 904         Register cardtable = G5;
 905         Register tmp  = G1_scratch;
 906         Register tmp2 = G3_scratch;
 907         jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
 908 
 909         Label not_already_dirty, restart, refill, young_card;
 910 
 911 #ifdef _LP64
 912         __ srlx(addr, CardTableModRefBS::card_shift, addr);
 913 #else
 914         __ srl(addr, CardTableModRefBS::card_shift, addr);
 915 #endif
 916 
 917         AddressLiteral rs(byte_map_base);
 918         __ set(rs, cardtable);         // cardtable := <card table base>
 919         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 920 
 921         __ cmp_and_br_short(tmp, CardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card);
 922 
 923         __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
 924         __ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
 925 
 926         assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
 927         __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
 928 
 929         __ bind(young_card);
 930         // We didn't take the branch, so we're already dirty: return.
 931         // Use return-from-leaf
 932         __ retl();
 933         __ delayed()->nop();
 934 
 935         // Not dirty.
 936         __ bind(not_already_dirty);
 937 
 938         // Get cardtable + tmp into a reg by itself
 939         __ add(addr, cardtable, tmp2);
 940 
 941         // First, dirty it.
 942         __ stb(G0, tmp2, 0);  // [cardPtr] := 0  (i.e., dirty).
 943 
 944         Register tmp3 = cardtable;
 945         Register tmp4 = tmp;
 946 
 947         // these registers are now dead
 948         addr = cardtable = tmp = noreg;
 949