8185591: guarantee(_byte_map[_guard_index] == last_card) failed: card table guard has been modified
Properly handle zero count in gen_write_ref_array_post_barrier() Reviewed-by: tschatzl, kbarrett
This commit is contained in:
parent
faff99f2fc
commit
d15086130b
@ -2968,7 +2968,9 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
|
CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
|
||||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||||
|
|
||||||
Label L_cardtable_loop;
|
Label L_cardtable_loop, L_done;
|
||||||
|
|
||||||
|
__ cbz_32(count, L_done); // zero count - nothing to do
|
||||||
|
|
||||||
__ add_ptr_scaled_int32(count, addr, count, LogBytesPerHeapOop);
|
__ add_ptr_scaled_int32(count, addr, count, LogBytesPerHeapOop);
|
||||||
__ sub(count, count, BytesPerHeapOop); // last addr
|
__ sub(count, count, BytesPerHeapOop); // last addr
|
||||||
@ -2987,6 +2989,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ strb(zero, Address(addr, 1, post_indexed));
|
__ strb(zero, Address(addr, 1, post_indexed));
|
||||||
__ subs(count, count, 1);
|
__ subs(count, count, 1);
|
||||||
__ b(L_cardtable_loop, ge);
|
__ b(L_cardtable_loop, ge);
|
||||||
|
__ BIND(L_done);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BarrierSet::ModRef:
|
case BarrierSet::ModRef:
|
||||||
|
@ -898,7 +898,9 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||||
assert_different_registers(addr, count, tmp);
|
assert_different_registers(addr, count, tmp);
|
||||||
|
|
||||||
Label L_loop;
|
Label L_loop, L_done;
|
||||||
|
|
||||||
|
__ cmp_and_br_short(count, 0, Assembler::equal, Assembler::pt, L_done); // zero count - nothing to do
|
||||||
|
|
||||||
__ sll_ptr(count, LogBytesPerHeapOop, count);
|
__ sll_ptr(count, LogBytesPerHeapOop, count);
|
||||||
__ sub(count, BytesPerHeapOop, count);
|
__ sub(count, BytesPerHeapOop, count);
|
||||||
@ -914,6 +916,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ subcc(count, 1, count);
|
__ subcc(count, 1, count);
|
||||||
__ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop);
|
__ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop);
|
||||||
__ delayed()->add(addr, 1, addr);
|
__ delayed()->add(addr, 1, addr);
|
||||||
|
__ BIND(L_done);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BarrierSet::ModRef:
|
case BarrierSet::ModRef:
|
||||||
|
@ -1264,9 +1264,12 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
|
CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
|
||||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||||
|
|
||||||
Label L_loop;
|
Label L_loop, L_done;
|
||||||
const Register end = count;
|
const Register end = count;
|
||||||
|
|
||||||
|
__ testl(count, count);
|
||||||
|
__ jcc(Assembler::zero, L_done); // zero count - nothing to do
|
||||||
|
|
||||||
__ leaq(end, Address(start, count, TIMES_OOP, 0)); // end == start+count*oop_size
|
__ leaq(end, Address(start, count, TIMES_OOP, 0)); // end == start+count*oop_size
|
||||||
__ subptr(end, BytesPerHeapOop); // end - 1 to make inclusive
|
__ subptr(end, BytesPerHeapOop); // end - 1 to make inclusive
|
||||||
__ shrptr(start, CardTableModRefBS::card_shift);
|
__ shrptr(start, CardTableModRefBS::card_shift);
|
||||||
@ -1280,6 +1283,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ movb(Address(start, count, Address::times_1), 0);
|
__ movb(Address(start, count, Address::times_1), 0);
|
||||||
__ decrement(count);
|
__ decrement(count);
|
||||||
__ jcc(Assembler::greaterEqual, L_loop);
|
__ jcc(Assembler::greaterEqual, L_loop);
|
||||||
|
__ BIND(L_done);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user