< prev index next >

src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp

Print this page

        

*** 273,319 **** } void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) { if (tmp3 == noreg) { ! tmp3 = r8; } // flatten object address if needed if (dst.index() == noreg && dst.offset() == 0) { ! if (dst.base() != r3) { ! __ mov(r3, dst.base()); } } else { ! __ lea(r3, dst); } g1_write_barrier_pre(masm, ! r3 /* obj */, tmp2 /* pre_val */, rthread /* thread */, ! tmp1 /* tmp */, val != noreg /* tosca_live */, false /* expand_call */); if (val == noreg) { ! BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), noreg, noreg, noreg, noreg); } else { // G1 barrier needs uncompressed oop for region cross check. Register new_val = val; if (UseCompressedOops) { ! new_val = rscratch2; __ mov(new_val, val); } ! BarrierSetAssembler::store_at(masm, decorators, type, Address(r3, 0), val, noreg, noreg, noreg); g1_write_barrier_post(masm, ! r3 /* store_adr */, new_val /* new_val */, rthread /* thread */, ! tmp1 /* tmp */, ! tmp2 /* tmp2 */); } } #ifdef COMPILER1 --- 273,339 ---- } void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) { + bool in_heap = (decorators & IN_HEAP) != 0; + bool as_normal = (decorators & AS_NORMAL) != 0; + assert((decorators & IS_DEST_UNINITIALIZED) == 0, "unsupported"); + + bool needs_pre_barrier = as_normal; + bool needs_post_barrier = (val != noreg && in_heap); + + if (tmp3 == noreg) { ! tmp3 = rscratch2; } + // assert_different_registers(val, tmp1, tmp2, tmp3, rscratch1, rscratch2); + assert_different_registers(val, tmp1, tmp2, tmp3); // flatten object address if needed if (dst.index() == noreg && dst.offset() == 0) { ! if (dst.base() != tmp1) { ! __ mov(tmp1, dst.base()); } } else { ! __ lea(tmp1, dst); } + + if (needs_pre_barrier) { g1_write_barrier_pre(masm, ! tmp1 /* obj */, tmp2 /* pre_val */, rthread /* thread */, ! tmp3 /* tmp */, val != noreg /* tosca_live */, false /* expand_call */); + } if (val == noreg) { ! BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), noreg, noreg, noreg, noreg); } else { // G1 barrier needs uncompressed oop for region cross check. Register new_val = val; + if (needs_post_barrier) { if (UseCompressedOops) { ! // FIXME: Refactor the code to avoid usage of r19 and stay within tmpX ! new_val = r19; __ mov(new_val, val); } ! } ! ! BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp1, 0), val, noreg, noreg, noreg); ! ! if (needs_post_barrier) { g1_write_barrier_post(masm, ! tmp1 /* store_adr */, new_val /* new_val */, rthread /* thread */, ! tmp2 /* tmp */, ! tmp3 /* tmp2 */); ! } } } #ifdef COMPILER1
< prev index next >