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. |