--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Apr 22 21:33:55 2015 +0300
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Apr 22 19:10:03 2015 +0300
@@ -1606,13 +1606,26 @@
} else {
__ unsigned_shift_right(addr, CardTableModRefBS::card_shift, tmp);
}
+
+ LIR_Address* card_addr;
if (can_inline_as_constant(card_table_base)) {
- __ move(LIR_OprFact::intConst(0),
- new LIR_Address(tmp, card_table_base->as_jint(), T_BYTE));
+ card_addr = new LIR_Address(tmp, card_table_base->as_jint(), T_BYTE);
} else {
- __ move(LIR_OprFact::intConst(0),
- new LIR_Address(tmp, load_constant(card_table_base),
- T_BYTE));
+ card_addr = new LIR_Address(tmp, load_constant(card_table_base), T_BYTE);
+ }
+
+ LIR_Opr dirty = LIR_OprFact::intConst(CardTableModRefBS::dirty_card_val());
+ if (UseCondCardMark) {
+ LIR_Opr cur_value = new_register(T_INT);
+ __ move(card_addr, cur_value);
+
+ LabelObj* L_already_dirty = new LabelObj();
+ __ cmp(lir_cond_equal, cur_value, dirty);
+ __ branch(lir_cond_equal, T_BYTE, L_already_dirty->label());
+ __ move(dirty, card_addr);
+ __ branch_destination(L_already_dirty->label());
+ } else {
+ __ move(dirty, card_addr);
}
#endif
}