--- old/src/cpu/x86/vm/c1_Runtime1_x86.cpp 2015-08-12 14:08:58.000000000 +0200 +++ new/src/cpu/x86/vm/c1_Runtime1_x86.cpp 2015-08-12 14:08:58.000000000 +0200 @@ -1774,12 +1774,17 @@ NOT_LP64(__ get_thread(thread);) - __ 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); + if (G1ElideMembar) { + __ cmpb(Address(card_addr, 0), (int)CardTableModRefBS::clean_card_val()); + __ jcc(Assembler::notEqual, done); + } else { + __ 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 region crossing non-NULL, card is clean. // dirty card and log.