1.1 --- a/src/cpu/sparc/vm/macroAssembler_sparc.cpp Fri Oct 04 13:33:02 2013 +0200 1.2 +++ b/src/cpu/sparc/vm/macroAssembler_sparc.cpp Tue Oct 08 17:35:51 2013 +0200 1.3 @@ -3752,7 +3752,7 @@ 1.4 #define __ masm. 1.5 address start = __ pc(); 1.6 1.7 - Label not_already_dirty, restart, refill; 1.8 + Label not_already_dirty, restart, refill, young_card; 1.9 1.10 #ifdef _LP64 1.11 __ srlx(O0, CardTableModRefBS::card_shift, O0); 1.12 @@ -3763,9 +3763,15 @@ 1.13 __ set(addrlit, O1); // O1 := <card table base> 1.14 __ ldub(O0, O1, O2); // O2 := [O0 + O1] 1.15 1.16 + __ cmp_and_br_short(O2, G1SATBCardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card); 1.17 + 1.18 + __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad)); 1.19 + __ ldub(O0, O1, O2); // O2 := [O0 + O1] 1.20 + 1.21 assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code"); 1.22 __ cmp_and_br_short(O2, G0, Assembler::notEqual, Assembler::pt, not_already_dirty); 1.23 1.24 + __ bind(young_card); 1.25 // We didn't take the branch, so we're already dirty: return. 1.26 // Use return-from-leaf 1.27 __ retl();