--- old/src/cpu/x86/vm/macroAssembler_x86.cpp 2013-09-09 10:14:24.681343310 +0200 +++ new/src/cpu/x86/vm/macroAssembler_x86.cpp 2013-09-09 10:14:24.581341472 +0200 @@ -3388,9 +3388,14 @@ const Register card_addr = tmp; lea(card_addr, as_Address(ArrayAddress(cardtable, index))); #endif - cmpb(Address(card_addr, 0), 0); + cmpb(Address(card_addr, 0), (int)CardTableModRefBS::g1_young_card_val()); jcc(Assembler::equal, done); + membar(Assembler::Membar_mask_bits(Assembler::StoreLoad)); + cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val()); + jcc(Assembler::equal, done); + + // storing a region crossing, non-NULL oop, card is clean. // dirty card and log.