@@ -261,24 +261,32 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
261261
262262 // Test for in-cset
263263 if (is_strong) {
264- __ mov (rscratch2, ShenandoahHeap::in_cset_fast_test_addr ());
265- __ lsr (rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
264+ if (AOTCodeCache::is_on_for_dump ()) {
265+ __ lea (rscratch2, ExternalAddress (AOTRuntimeConstants::cset_base_address ()));
266+ __ ldr (rscratch2, Address (rscratch2));
267+ __ lea (rscratch1, ExternalAddress (AOTRuntimeConstants::grain_shift_address ()));
268+ __ ldrw (rscratch1, Address (rscratch1));
269+ __ lsrv (rscratch1, r0, rscratch1);
270+ } else {
271+ __ mov (rscratch2, ShenandoahHeap::in_cset_fast_test_addr ());
272+ __ lsr (rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
273+ }
266274 __ ldrb (rscratch2, Address (rscratch2, rscratch1));
267275 __ tbz (rscratch2, 0 , not_cset);
268276 }
269277
270278 __ push_call_clobbered_registers ();
271279 if (is_strong) {
272280 if (is_narrow) {
273- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
281+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow) ));
274282 } else {
275- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong));
283+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong) ));
276284 }
277285 } else if (is_weak) {
278286 if (is_narrow) {
279- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
287+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow) ));
280288 } else {
281- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
289+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak) ));
282290 }
283291 } else {
284292 assert (is_phantom, " only remaining strength" );
@@ -709,8 +717,16 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
709717
710718 if (is_strong) {
711719 // Check for object in cset.
712- __ mov (tmp2, ShenandoahHeap::in_cset_fast_test_addr ());
713- __ lsr (tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
720+ if (AOTCodeCache::is_on_for_dump ()) {
721+ __ lea (tmp2, ExternalAddress (AOTRuntimeConstants::cset_base_address ()));
722+ __ ldr (tmp2, Address (tmp2));
723+ __ lea (tmp1, ExternalAddress (AOTRuntimeConstants::grain_shift_address ()));
724+ __ ldrw (tmp1, Address (tmp1));
725+ __ lsrv (tmp1, res, tmp1);
726+ } else {
727+ __ mov (tmp2, ShenandoahHeap::in_cset_fast_test_addr ());
728+ __ lsr (tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
729+ }
714730 __ ldrb (tmp2, Address (tmp2, tmp1));
715731 __ cbz (tmp2, *stub->continuation ());
716732 }
@@ -795,25 +811,25 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
795811 bool is_native = ShenandoahBarrierSet::is_native_access (decorators);
796812 if (is_strong) {
797813 if (is_native) {
798- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong));
814+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong) ));
799815 } else {
800816 if (UseCompressedOops) {
801- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
817+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow) ));
802818 } else {
803- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong));
819+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong) ));
804820 }
805821 }
806822 } else if (is_weak) {
807823 assert (!is_native, " weak must not be called off-heap" );
808824 if (UseCompressedOops) {
809- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
825+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow) ));
810826 } else {
811- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
827+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak) ));
812828 }
813829 } else {
814830 assert (is_phantom, " only remaining strength" );
815831 assert (is_native, " phantom must only be called off-heap" );
816- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_phantom));
832+ __ lea (lr, RuntimeAddress ( CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_phantom) ));
817833 }
818834 __ blr (lr);
819835 __ mov (rscratch1, r0);
0 commit comments