< prev index next >

src/hotspot/cpu/aarch64/gc/shared/cardTableBarrierSetAssembler_aarch64.cpp

Print this page
*** 30,29 ***
  #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) {
--- 30,30 ---
  #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) {

*** 86,12 ***
    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);
      }
    }
  }
--- 87,12 ---
    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 >