src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page

        

*** 2559,2603 **** 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())); --- 2559,2602 ---- 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()));