src/cpu/x86/vm/assembler_x86_64.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
6644928 Cdiff src/cpu/x86/vm/assembler_x86_64.cpp
src/cpu/x86/vm/assembler_x86_64.cpp
Print this page
*** 4425,4437 ****
void MacroAssembler::store_check_part_2(Register obj) {
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
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);
}
void MacroAssembler::c2bool(Register x) {
// implements x == 0 ? 0 : 1
// note: must only look at least-significant byte of x
--- 4425,4460 ----
void MacroAssembler::store_check_part_2(Register obj) {
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
!
! // 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);
movb(as_Address(ArrayAddress(cardtable, index)), 0);
+ }
+
}
void MacroAssembler::c2bool(Register x) {
// implements x == 0 ? 0 : 1
// note: must only look at least-significant byte of x
src/cpu/x86/vm/assembler_x86_64.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File