@@ -268,7 +268,7 @@ void ShenandoahBarrierSetAssembler::satb_write_barrier_pre(MacroAssembler* masm,
268268 __ bind (done);
269269}
270270
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 ) {
272272 assert (ShenandoahLoadRefBarrier, " Should be enabled" );
273273
274274 Label heap_stable, not_cset;
@@ -292,7 +292,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
292292 __ jcc (Assembler::zero, heap_stable);
293293
294294 Register tmp1 = noreg;
295- if (!weak ) {
295+ if (kind == ShenandoahBarrierSet::AccessKind::NORMAL ) {
296296 // Test for object in cset
297297 // Allocate tmp-reg.
298298 for (int i = 0 ; i < 8 ; i++) {
@@ -338,14 +338,26 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
338338 __ lea (tmp2, src);
339339
340340 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 ();
349361 }
350362 restore_xmm_registers (masm);
351363
@@ -370,7 +382,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
370382
371383 __ bind (not_cset);
372384
373- if (!weak ) {
385+ if (kind == ShenandoahBarrierSet::AccessKind::NORMAL ) {
374386 __ pop (tmp1);
375387 }
376388
@@ -467,8 +479,8 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
467479
468480 BarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp_thread);
469481
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 );
472484
473485 // Move loaded oop to final destination
474486 if (dst != result_dst) {
@@ -818,10 +830,18 @@ void ShenandoahBarrierSetAssembler::gen_load_reference_barrier_stub(LIR_Assemble
818830 __ bind (slow_path);
819831 ce->store_parameter (res, 0 );
820832 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 ();
825845 }
826846 __ jmp (*stub->continuation ());
827847}
@@ -886,7 +906,7 @@ void ShenandoahBarrierSetAssembler::generate_c1_pre_barrier_runtime_stub(StubAss
886906 __ epilogue ();
887907}
888908
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 ) {
890910 __ prologue (" shenandoah_load_reference_barrier" , false );
891911 // arg0 : object to be resolved
892912
@@ -895,20 +915,40 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
895915#ifdef _LP64
896916 __ load_parameter (0 , c_rarg0);
897917 __ 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 ();
904938 }
905939#else
906940 __ load_parameter (0 , rax);
907941 __ 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 ();
912952 }
913953#endif
914954
0 commit comments