@@ -268,7 +268,7 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
268
268
__ bind (done);
269
269
}
270
270
271
- void ShenandoahBarrierSetAssembler::load_reference_barrier (MacroAssembler* masm, Register dst, Address src, bool weak ) {
271
+ void ShenandoahBarrierSetAssembler::load_reference_barrier (MacroAssembler* masm, Register dst, Address src, ShenandoahBarrierSet::AccessKind kind ) {
272
272
assert (ShenandoahLoadRefBarrier, " Should be enabled" );
273
273
274
274
Label heap_stable, not_cset;
@@ -292,7 +292,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
292
292
__ jcc (Assembler::zero, heap_stable);
293
293
294
294
Register tmp1 = noreg;
295
- if (!weak ) {
295
+ if (kind == ShenandoahBarrierSet::AccessKind::NORMAL ) {
296
296
// Test for object in cset
297
297
// Allocate tmp-reg.
298
298
for (int i = 0 ; i < 8 ; i++) {
@@ -338,14 +338,26 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
338
338
__ lea (tmp2, src);
339
339
340
340
save_xmm_registers (masm);
341
- if (weak) {
342
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), dst, tmp2);
343
- } else {
344
- if (UseCompressedOops) {
345
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), dst, tmp2);
346
- } else {
347
- __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), dst, tmp2);
348
- }
341
+ switch (kind) {
342
+ case ShenandoahBarrierSet::AccessKind::NORMAL:
343
+ if (UseCompressedOops) {
344
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), dst, tmp2);
345
+ } else {
346
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), dst, tmp2);
347
+ }
348
+ break ;
349
+ case ShenandoahBarrierSet::AccessKind::WEAK:
350
+ if (UseCompressedOops) {
351
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow), dst, tmp2);
352
+ } else {
353
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), dst, tmp2);
354
+ }
355
+ break ;
356
+ case ShenandoahBarrierSet::AccessKind::NATIVE:
357
+ __ super_call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), dst, tmp2);
358
+ break ;
359
+ default :
360
+ ShouldNotReachHere ();
349
361
}
350
362
restore_xmm_registers (masm);
351
363
@@ -370,7 +382,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
370
382
371
383
__ bind (not_cset);
372
384
373
- if (!weak ) {
385
+ if (kind == ShenandoahBarrierSet::AccessKind::NORMAL ) {
374
386
__ pop (tmp1);
375
387
}
376
388
@@ -467,8 +479,8 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
467
479
468
480
BarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp_thread);
469
481
470
- bool weak = ShenandoahBarrierSet::use_load_reference_barrier_weak (decorators, type);
471
- load_reference_barrier (masm, dst, src, weak );
482
+ ShenandoahBarrierSet::AccessKind kind = ShenandoahBarrierSet::access_kind (decorators, type);
483
+ load_reference_barrier (masm, dst, src, kind );
472
484
473
485
// Move loaded oop to final destination
474
486
if (dst != result_dst) {
@@ -818,10 +830,18 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
818
830
__ bind (slow_path);
819
831
ce->store_parameter (res, 0 );
820
832
ce->store_parameter (addr, 1 );
821
- if (stub->is_weak ()) {
822
- __ call (RuntimeAddress (bs->load_reference_barrier_weak_rt_code_blob ()->code_begin ()));
823
- } else {
824
- __ call (RuntimeAddress (bs->load_reference_barrier_rt_code_blob ()->code_begin ()));
833
+ switch (stub->kind ()) {
834
+ case ShenandoahBarrierSet::AccessKind::NORMAL:
835
+ __ call (RuntimeAddress (bs->load_reference_barrier_normal_rt_code_blob ()->code_begin ()));
836
+ break ;
837
+ case ShenandoahBarrierSet::AccessKind::WEAK:
838
+ __ call (RuntimeAddress (bs->load_reference_barrier_weak_rt_code_blob ()->code_begin ()));
839
+ break ;
840
+ case ShenandoahBarrierSet::AccessKind::NATIVE:
841
+ __ call (RuntimeAddress (bs->load_reference_barrier_native_rt_code_blob ()->code_begin ()));
842
+ break ;
843
+ default :
844
+ ShouldNotReachHere ();
825
845
}
826
846
__ jmp (*stub->continuation ());
827
847
}
@@ -886,7 +906,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
886
906
__ epilogue ();
887
907
}
888
908
889
- void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub (StubAssembler* sasm, bool is_weak ) {
909
+ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_stub (StubAssembler* sasm, ShenandoahBarrierSet::AccessKind kind ) {
890
910
__ prologue (" shenandoah_load_reference_barrier" , false );
891
911
// arg0 : object to be resolved
892
912
@@ -895,20 +915,40 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
895
915
#ifdef _LP64
896
916
__ load_parameter (0 , c_rarg0);
897
917
__ load_parameter (1 , c_rarg1);
898
- if (is_weak) {
899
- __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), c_rarg0, c_rarg1);
900
- } else if (UseCompressedOops) {
901
- __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), c_rarg0, c_rarg1);
902
- } else {
903
- __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), c_rarg0, c_rarg1);
918
+ switch (kind) {
919
+ case ShenandoahBarrierSet::AccessKind::NORMAL:
920
+ if (UseCompressedOops) {
921
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_narrow), c_rarg0, c_rarg1);
922
+ } else {
923
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), c_rarg0, c_rarg1);
924
+ }
925
+ break ;
926
+ case ShenandoahBarrierSet::AccessKind::WEAK:
927
+ if (UseCompressedOops) {
928
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak_narrow), c_rarg0, c_rarg1);
929
+ } else {
930
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), c_rarg0, c_rarg1);
931
+ }
932
+ break ;
933
+ case ShenandoahBarrierSet::AccessKind::NATIVE:
934
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), c_rarg0, c_rarg1);
935
+ break ;
936
+ default :
937
+ ShouldNotReachHere ();
904
938
}
905
939
#else
906
940
__ load_parameter (0 , rax);
907
941
__ load_parameter (1 , rbx);
908
- if (is_weak) {
909
- __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), rax, rbx);
910
- } else {
911
- __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), rax, rbx);
942
+ switch (kind) {
943
+ case ShenandoahBarrierSet::AccessKind::NORMAL:
944
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier), rax, rbx);
945
+ break ;
946
+ case ShenandoahBarrierSet::AccessKind::WEAK:
947
+ case ShenandoahBarrierSet::AccessKind::NATIVE:
948
+ __ call_VM_leaf (CAST_FROM_FN_PTR (address, ShenandoahRuntime::load_reference_barrier_weak), rax, rbx);
949
+ break ;
950
+ default :
951
+ ShouldNotReachHere ();
912
952
}
913
953
#endif
914
954
0 commit comments