src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page
rev 5363 : imported patch filtering.diff

*** 3387,3403 **** Address index(noreg, card_index, Address::times_1); const Register card_addr = tmp; lea(card_addr, as_Address(ArrayAddress(cardtable, index))); #endif ! cmpb(Address(card_addr, 0), 0); jcc(Assembler::equal, done); // storing a region crossing, non-NULL oop, card is clean. // dirty card and log. ! movb(Address(card_addr, 0), 0); cmpl(queue_index, 0); jcc(Assembler::equal, runtime); subl(queue_index, wordSize); movptr(tmp2, buffer); --- 3387,3408 ---- Address index(noreg, card_index, Address::times_1); const Register card_addr = tmp; lea(card_addr, as_Address(ArrayAddress(cardtable, index))); #endif ! cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::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. ! movb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val()); cmpl(queue_index, 0); jcc(Assembler::equal, runtime); subl(queue_index, wordSize); movptr(tmp2, buffer);