src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
changeset 54766 1321f8cf9de5
parent 54763 2584e5772546
child 54979 f982c1a6582c
equal deleted inserted replaced
54765:cc6053cbd811 54766:1321f8cf9de5
    21  *
    21  *
    22  */
    22  */
    23 
    23 
    24 #include "precompiled.hpp"
    24 #include "precompiled.hpp"
    25 #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
    25 #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
       
    26 #include "gc/shenandoah/shenandoahForwarding.hpp"
    26 #include "gc/shenandoah/shenandoahHeap.hpp"
    27 #include "gc/shenandoah/shenandoahHeap.hpp"
    27 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
    28 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
    28 #include "gc/shenandoah/shenandoahHeuristics.hpp"
    29 #include "gc/shenandoah/shenandoahHeuristics.hpp"
    29 #include "gc/shenandoah/shenandoahRuntime.hpp"
    30 #include "gc/shenandoah/shenandoahRuntime.hpp"
    30 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
    31 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
   219 }
   220 }
   220 
   221 
   221 // IMPORTANT: This must preserve all registers, even rscratch1 and rscratch2.
   222 // IMPORTANT: This must preserve all registers, even rscratch1 and rscratch2.
   222 void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst) {
   223 void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst) {
   223   assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
   224   assert(ShenandoahLoadRefBarrier || ShenandoahCASBarrier, "Should be enabled");
   224   __ ldr(dst, Address(dst, ShenandoahBrooksPointer::byte_offset()));
   225   __ ldr(dst, Address(dst, ShenandoahForwarding::byte_offset()));
   225 }
   226 }
   226 
   227 
   227 void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Register tmp) {
   228 void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Register tmp) {
   228   assert(ShenandoahLoadRefBarrier, "Should be enabled");
   229   assert(ShenandoahLoadRefBarrier, "Should be enabled");
   229   assert(dst != rscratch2, "need rscratch2");
   230   assert(dst != rscratch2, "need rscratch2");
   353   assert_different_registers(obj, var_size_in_bytes);
   354   assert_different_registers(obj, var_size_in_bytes);
   354   Register end = t2;
   355   Register end = t2;
   355 
   356 
   356   __ ldr(obj, Address(rthread, JavaThread::tlab_top_offset()));
   357   __ ldr(obj, Address(rthread, JavaThread::tlab_top_offset()));
   357   if (var_size_in_bytes == noreg) {
   358   if (var_size_in_bytes == noreg) {
   358     __ lea(end, Address(obj, (int) (con_size_in_bytes + ShenandoahBrooksPointer::byte_size())));
   359     __ lea(end, Address(obj, (int) (con_size_in_bytes + ShenandoahForwarding::byte_size())));
   359   } else {
   360   } else {
   360     __ add(var_size_in_bytes, var_size_in_bytes, ShenandoahBrooksPointer::byte_size());
   361     __ add(var_size_in_bytes, var_size_in_bytes, ShenandoahForwarding::byte_size());
   361     __ lea(end, Address(obj, var_size_in_bytes));
   362     __ lea(end, Address(obj, var_size_in_bytes));
   362   }
   363   }
   363   __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
   364   __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
   364   __ cmp(end, rscratch1);
   365   __ cmp(end, rscratch1);
   365   __ br(Assembler::HI, slow_case);
   366   __ br(Assembler::HI, slow_case);
   366 
   367 
   367   // update the tlab top pointer
   368   // update the tlab top pointer
   368   __ str(end, Address(rthread, JavaThread::tlab_top_offset()));
   369   __ str(end, Address(rthread, JavaThread::tlab_top_offset()));
   369 
   370 
   370   __ add(obj, obj, ShenandoahBrooksPointer::byte_size());
   371   __ add(obj, obj, ShenandoahForwarding::byte_size());
   371   __ str(obj, Address(obj, ShenandoahBrooksPointer::byte_offset()));
   372   __ str(obj, Address(obj, ShenandoahForwarding::byte_offset()));
   372 
   373 
   373   // recover var_size_in_bytes if necessary
   374   // recover var_size_in_bytes if necessary
   374   if (var_size_in_bytes == end) {
   375   if (var_size_in_bytes == end) {
   375     __ sub(var_size_in_bytes, var_size_in_bytes, obj);
   376     __ sub(var_size_in_bytes, var_size_in_bytes, obj);
   376   }
   377   }