@@ -225,11 +225,17 @@ void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssemb
225
225
}
226
226
}
227
227
228
- void ShenandoahBarrierSetAssembler::load_reference_barrier (MacroAssembler* masm, Register dst, Address load_addr, ShenandoahBarrierSet::AccessKind kind ) {
228
+ void ShenandoahBarrierSetAssembler::load_reference_barrier (MacroAssembler* masm, Register dst, Address load_addr, DecoratorSet decorators ) {
229
229
assert (ShenandoahLoadRefBarrier, " Should be enabled" );
230
230
assert (dst != rscratch2, " need rscratch2" );
231
231
assert_different_registers (load_addr.base (), load_addr.index (), rscratch1, rscratch2);
232
232
233
+ bool is_strong = ShenandoahBarrierSet::is_strong_access (decorators);
234
+ bool is_weak = ShenandoahBarrierSet::is_weak_access (decorators);
235
+ bool is_phantom = ShenandoahBarrierSet::is_phantom_access (decorators);
236
+ bool is_native = ShenandoahBarrierSet::is_native_access (decorators);
237
+ bool is_narrow = UseCompressedOops && !is_native;
238
+
233
239
Label heap_stable, not_cset;
234
240
__ enter ();
235
241
Address gc_state (rthread, in_bytes (ShenandoahThreadLocalData::gc_state_offset ()));
@@ -252,34 +258,30 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
252
258
__ mov (r0, dst);
253
259
254
260
// Test for in-cset
255
- if (kind == ShenandoahBarrierSet::AccessKind::NORMAL ) {
261
+ if (is_strong ) {
256
262
__ mov (rscratch2, ShenandoahHeap::in_cset_fast_test_addr ());
257
263
__ lsr (rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
258
264
__ ldrb (rscratch2, Address (rscratch2, rscratch1));
259
265
__ tbz (rscratch2, 0 , not_cset);
260
266
}
261
267
262
268
__ push_call_clobbered_registers ();
263
- switch (kind) {
264
- case ShenandoahBarrierSet::AccessKind::NORMAL:
265
- if (UseCompressedOops) {
266
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow));
267
- } else {
268
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier));
269
- }
270
- break ;
271
- case ShenandoahBarrierSet::AccessKind::WEAK:
272
- if (UseCompressedOops) {
273
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
274
- } else {
275
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
276
- }
277
- break ;
278
- case ShenandoahBarrierSet::AccessKind::NATIVE:
269
+ if (is_strong) {
270
+ if (is_narrow) {
271
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow));
272
+ } else {
273
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong));
274
+ }
275
+ } else if (is_weak) {
276
+ if (is_narrow) {
277
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
278
+ } else {
279
279
__ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
280
- break ;
281
- default :
282
- ShouldNotReachHere ();
280
+ }
281
+ } else {
282
+ assert (is_phantom, " only remaining strength" );
283
+ assert (!is_narrow, " phantom access cannot be narrow" );
284
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
283
285
}
284
286
__ blr (lr);
285
287
__ mov (rscratch1, r0);
@@ -338,8 +340,7 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
338
340
339
341
BarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp_thread);
340
342
341
- ShenandoahBarrierSet::AccessKind kind = ShenandoahBarrierSet::access_kind (decorators, type);
342
- load_reference_barrier (masm, dst, src, kind);
343
+ load_reference_barrier (masm, dst, src, decorators);
343
344
344
345
if (dst != result_dst) {
345
346
__ mov (result_dst, dst);
@@ -617,6 +618,12 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
617
618
ShenandoahBarrierSetC1* bs = (ShenandoahBarrierSetC1*)BarrierSet::barrier_set ()->barrier_set_c1 ();
618
619
__ bind (*stub->entry ());
619
620
621
+ DecoratorSet decorators = stub->decorators ();
622
+ bool is_strong = ShenandoahBarrierSet::is_strong_access (decorators);
623
+ bool is_weak = ShenandoahBarrierSet::is_weak_access (decorators);
624
+ bool is_phantom = ShenandoahBarrierSet::is_phantom_access (decorators);
625
+ bool is_native = ShenandoahBarrierSet::is_native_access (decorators);
626
+
620
627
Register obj = stub->obj ()->as_register ();
621
628
Register res = stub->result ()->as_register ();
622
629
Register addr = stub->addr ()->as_pointer_register ();
@@ -629,42 +636,27 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
629
636
__ mov (res, obj);
630
637
}
631
638
632
- // Check for null.
633
- __ cbz (res, *stub->continuation ());
634
-
635
- // Check for object in cset.
636
- __ mov (tmp2, ShenandoahHeap::in_cset_fast_test_addr ());
637
- __ lsr (tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
638
- __ ldrb (tmp2, Address (tmp2, tmp1));
639
- __ cbz (tmp2, *stub->continuation ());
640
-
641
- // Check if object is already forwarded.
642
- Label slow_path;
643
- __ ldr (tmp1, Address (res, oopDesc::mark_offset_in_bytes ()));
644
- __ eon (tmp1, tmp1, zr);
645
- __ ands (zr, tmp1, markWord::lock_mask_in_place);
646
- __ br (Assembler::NE, slow_path);
647
-
648
- // Decode forwarded object.
649
- __ orr (tmp1, tmp1, markWord::marked_value);
650
- __ eon (res, tmp1, zr);
651
- __ b (*stub->continuation ());
639
+ if (is_strong) {
640
+ // Check for object in cset.
641
+ __ mov (tmp2, ShenandoahHeap::in_cset_fast_test_addr ());
642
+ __ lsr (tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint ());
643
+ __ ldrb (tmp2, Address (tmp2, tmp1));
644
+ __ cbz (tmp2, *stub->continuation ());
645
+ }
652
646
653
- __ bind (slow_path);
654
647
ce->store_parameter (res, 0 );
655
648
ce->store_parameter (addr, 1 );
656
- switch (stub->kind ()) {
657
- case ShenandoahBarrierSet::AccessKind::NORMAL:
658
- __ far_call (RuntimeAddress (bs->load_reference_barrier_normal_rt_code_blob ()->code_begin ()));
659
- break ;
660
- case ShenandoahBarrierSet::AccessKind::WEAK:
661
- __ far_call (RuntimeAddress (bs->load_reference_barrier_weak_rt_code_blob ()->code_begin ()));
662
- break ;
663
- case ShenandoahBarrierSet::AccessKind::NATIVE:
664
- __ far_call (RuntimeAddress (bs->load_reference_barrier_native_rt_code_blob ()->code_begin ()));
665
- break ;
666
- default :
667
- ShouldNotReachHere ();
649
+ if (is_strong) {
650
+ if (is_native) {
651
+ __ far_call (RuntimeAddress (bs->load_reference_barrier_strong_native_rt_code_blob ()->code_begin ()));
652
+ } else {
653
+ __ far_call (RuntimeAddress (bs->load_reference_barrier_strong_rt_code_blob ()->code_begin ()));
654
+ }
655
+ } else if (is_weak) {
656
+ __ far_call (RuntimeAddress (bs->load_reference_barrier_weak_rt_code_blob ()->code_begin ()));
657
+ } else {
658
+ assert (is_phantom, " only remaining strength" );
659
+ __ far_call (RuntimeAddress (bs->load_reference_barrier_phantom_rt_code_blob ()->code_begin ()));
668
660
}
669
661
670
662
__ b (*stub->continuation ());
@@ -720,33 +712,39 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
720
712
__ epilogue ();
721
713
}
722
714
723
- void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub (StubAssembler* sasm, ShenandoahBarrierSet::AccessKind kind ) {
715
+ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub (StubAssembler* sasm, DecoratorSet decorators ) {
724
716
__ prologue (" shenandoah_load_reference_barrier" , false );
725
717
// arg0 : object to be resolved
726
718
727
719
__ push_call_clobbered_registers ();
728
720
__ load_parameter (0 , r0);
729
721
__ load_parameter (1 , r1);
730
- switch (kind) {
731
- case ShenandoahBarrierSet::AccessKind::NORMAL:
732
- if (UseCompressedOops) {
733
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow) );
734
- } else {
735
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier));
736
- }
737
- break ;
738
- case ShenandoahBarrierSet::AccessKind::WEAK:
722
+
723
+ bool is_strong = ShenandoahBarrierSet::is_strong_access (decorators);
724
+ bool is_weak = ShenandoahBarrierSet::is_weak_access (decorators);
725
+ bool is_phantom = ShenandoahBarrierSet::is_phantom_access (decorators );
726
+ bool is_native = ShenandoahBarrierSet::is_native_access (decorators);
727
+ if (is_strong) {
728
+ if (is_native) {
729
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong)) ;
730
+ } else {
739
731
if (UseCompressedOops) {
740
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow ));
732
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong_narrow ));
741
733
} else {
742
- __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak ));
734
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_strong ));
743
735
}
744
- break ;
745
- case ShenandoahBarrierSet::AccessKind::NATIVE:
736
+ }
737
+ } else if (is_weak) {
738
+ assert (!is_native, " weak must not be called off-heap" );
739
+ if (UseCompressedOops) {
740
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow));
741
+ } else {
746
742
__ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak));
747
- break ;
748
- default :
749
- ShouldNotReachHere ();
743
+ }
744
+ } else {
745
+ assert (is_phantom, " only remaining strength" );
746
+ assert (is_native, " phantom must only be called off-heap" );
747
+ __ mov (lr, CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_phantom));
750
748
}
751
749
__ blr (lr);
752
750
__ mov (rscratch1, r0);
0 commit comments