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 } |