src/cpu/sparc/vm/macroAssembler_sparc.cpp

changeset 5860
69944b868a32
parent 5694
7944aba7ba41
child 5980
252d541466ea
child 6029
209aa13ab8c0
     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();

mercurial