src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
Print this page
*** 2886,2930 ****
adrp(rscratch1, src2, offset);
ldr(rscratch1, Address(rscratch1, offset));
cmp(src1, rscratch1);
}
- void MacroAssembler::store_check(Register obj) {
- // Does a store check for the oop in register obj. The content of
- // register obj is destroyed afterwards.
- store_check_part_1(obj);
- store_check_part_2(obj);
- }
-
void MacroAssembler::store_check(Register obj, Address dst) {
store_check(obj);
}
- // split the store check operation so that other instructions can be scheduled inbetween
- void MacroAssembler::store_check_part_1(Register obj) {
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
- lsr(obj, obj, CardTableModRefBS::card_shift);
- }
! 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.
!
! // FIXME: It's not likely that disp will fit into an offset so we
! // don't bother to check, but it could save an instruction.
! intptr_t disp = (intptr_t) ct->byte_map_base;
! mov(rscratch1, disp);
strb(zr, Address(obj, rscratch1));
}
void MacroAssembler::load_klass(Register dst, Register src) {
if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));
--- 2886,2929 ----
adrp(rscratch1, src2, offset);
ldr(rscratch1, Address(rscratch1, offset));
cmp(src1, rscratch1);
}
void MacroAssembler::store_check(Register obj, Address dst) {
store_check(obj);
}
+ void MacroAssembler::store_check(Register obj) {
+ // Does a store check for the oop in register obj. The content of
+ // register obj is destroyed afterwards.
BarrierSet* bs = Universe::heap()->barrier_set();
assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind");
! CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
! lsr(obj, obj, CardTableModRefBS::card_shift);
!
! assert(CardTableModRefBS::dirty_card_val() == 0, "must be");
!
! {
! ExternalAddress cardtable((address) ct->byte_map_base);
! unsigned long offset;
! adrp(rscratch1, cardtable, offset);
! assert(offset == 0, "byte_map_base is misaligned");
! }
!
! if (UseCondCardMark) {
! Label L_already_dirty;
! ldrb(rscratch2, Address(obj, rscratch1));
! cbz(rscratch2, L_already_dirty);
! strb(zr, Address(obj, rscratch1));
! bind(L_already_dirty);
! } else {
strb(zr, Address(obj, rscratch1));
+ }
}
void MacroAssembler::load_klass(Register dst, Register src) {
if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));