Merge
This commit is contained in:
commit
997563be5d
@ -3405,10 +3405,16 @@ void MacroAssembler::store_check_part_2(Register obj) {
|
|||||||
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
|
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
|
||||||
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
||||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||||
ExternalAddress cardtable((address)ct->byte_map_base);
|
|
||||||
Address index(noreg, obj, Address::times_1);
|
|
||||||
|
|
||||||
movb(as_Address(ArrayAddress(cardtable, index)), 0);
|
// The calculation for byte_map_base is as follows:
|
||||||
|
// byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
|
||||||
|
// So this essentially converts an address to a displacement and
|
||||||
|
// it will never need to be relocated. On 64bit however the value may be too
|
||||||
|
// large for a 32bit displacement
|
||||||
|
|
||||||
|
intptr_t disp = (intptr_t) ct->byte_map_base;
|
||||||
|
Address cardtable(noreg, obj, Address::times_1, disp);
|
||||||
|
movb(cardtable, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4436,9 +4436,32 @@ void MacroAssembler::store_check_part_2(Register obj) {
|
|||||||
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
|
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
|
||||||
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
||||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||||
ExternalAddress cardtable((address)ct->byte_map_base);
|
|
||||||
|
// The calculation for byte_map_base is as follows:
|
||||||
|
// byte_map_base = _byte_map - (uintptr_t(low_bound) >> card_shift);
|
||||||
|
// So this essentially converts an address to a displacement and
|
||||||
|
// it will never need to be relocated. On 64bit however the value may be too
|
||||||
|
// large for a 32bit displacement
|
||||||
|
|
||||||
|
intptr_t disp = (intptr_t) ct->byte_map_base;
|
||||||
|
if (is_simm32(disp)) {
|
||||||
|
Address cardtable(noreg, obj, Address::times_1, disp);
|
||||||
|
movb(cardtable, 0);
|
||||||
|
} else {
|
||||||
|
// By doing it as an ExternalAddress disp could be converted to a rip-relative
|
||||||
|
// displacement and done in a single instruction given favorable mapping and
|
||||||
|
// a smarter version of as_Address. Worst case it is two instructions which
|
||||||
|
// is no worse off then loading disp into a register and doing as a simple
|
||||||
|
// Address() as above.
|
||||||
|
// We can't do as ExternalAddress as the only style since if disp == 0 we'll
|
||||||
|
// assert since NULL isn't acceptable in a reloci (see 6644928). In any case
|
||||||
|
// in some cases we'll get a single instruction version.
|
||||||
|
|
||||||
|
ExternalAddress cardtable((address)disp);
|
||||||
Address index(noreg, obj, Address::times_1);
|
Address index(noreg, obj, Address::times_1);
|
||||||
movb(as_Address(ArrayAddress(cardtable, index)), 0);
|
movb(as_Address(ArrayAddress(cardtable, index)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::c2bool(Register x) {
|
void MacroAssembler::c2bool(Register x) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user