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