< prev index next > src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.cpp
Print this page
#include "gc/shared/gc_globals.hpp"
#include "interpreter/interp_masm.hpp"
#define __ masm->
! void CardTableBarrierSetAssembler::store_check(MacroAssembler* masm, Register obj, Address dst) {
!
BarrierSet* bs = BarrierSet::barrier_set();
assert(bs->kind() == BarrierSet::CardTableBarrierSet, "Wrong barrier set kind");
__ lsr(obj, obj, CardTable::card_shift());
assert(CardTable::dirty_card_val() == 0, "must be");
! __ load_byte_map_base(rscratch1);
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 CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators,
Register start, Register count, Register scratch, RegSet saved_regs) {
#include "gc/shared/gc_globals.hpp"
#include "interpreter/interp_masm.hpp"
#define __ masm->
! void CardTableBarrierSetAssembler::store_check(MacroAssembler* masm, Register obj, Address dst, Register rscratch) {
! precond(rscratch != noreg);
BarrierSet* bs = BarrierSet::barrier_set();
assert(bs->kind() == BarrierSet::CardTableBarrierSet, "Wrong barrier set kind");
__ lsr(obj, obj, CardTable::card_shift());
assert(CardTable::dirty_card_val() == 0, "must be");
! __ load_byte_map_base(rscratch);
if (UseCondCardMark) {
+ precond(rscratch != rscratch2);
Label L_already_dirty;
! __ ldrb(rscratch2, Address(obj, rscratch));
__ cbz(rscratch2, L_already_dirty);
! __ strb(zr, Address(obj, rscratch));
__ bind(L_already_dirty);
} else {
! __ strb(zr, Address(obj, rscratch));
}
}
void CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators,
Register start, Register count, Register scratch, RegSet saved_regs) {
bool needs_post_barrier = val != noreg && in_heap;
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
if (needs_post_barrier) {
// flatten object address if needed
if (!precise || (dst.index() == noreg && dst.offset() == 0)) {
! store_check(masm, dst.base(), dst);
} else {
__ lea(tmp3, dst);
! store_check(masm, tmp3, dst);
}
}
}
bool needs_post_barrier = val != noreg && in_heap;
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
if (needs_post_barrier) {
// flatten object address if needed
if (!precise || (dst.index() == noreg && dst.offset() == 0)) {
! store_check(masm, dst.base(), dst, tmp2);
} else {
__ lea(tmp3, dst);
! store_check(masm, tmp3, dst, tmp2);
}
}
}
< prev index next >