src/cpu/x86/vm/c1_Runtime1_x86.cpp

changeset 5860
69944b868a32
parent 5628
f98f5d48f511
child 6155
61746b5f0ed3
     1.1 --- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Fri Oct 04 13:33:02 2013 +0200
     1.2 +++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Tue Oct 08 17:35:51 2013 +0200
     1.3 @@ -38,6 +38,9 @@
     1.4  #include "runtime/vframeArray.hpp"
     1.5  #include "utilities/macros.hpp"
     1.6  #include "vmreg_x86.inline.hpp"
     1.7 +#if INCLUDE_ALL_GCS
     1.8 +#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
     1.9 +#endif
    1.10  
    1.11  
    1.12  // Implementation of StubAssembler
    1.13 @@ -1753,13 +1756,17 @@
    1.14          __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
    1.15  #endif
    1.16  
    1.17 -        __ cmpb(Address(card_addr, 0), 0);
    1.18 +        __ cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val());
    1.19 +        __ jcc(Assembler::equal, done);
    1.20 +
    1.21 +        __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
    1.22 +        __ cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
    1.23          __ jcc(Assembler::equal, done);
    1.24  
    1.25          // storing region crossing non-NULL, card is clean.
    1.26          // dirty card and log.
    1.27  
    1.28 -        __ movb(Address(card_addr, 0), 0);
    1.29 +        __ movb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
    1.30  
    1.31          __ cmpl(queue_index, 0);
    1.32          __ jcc(Assembler::equal, runtime);

mercurial