< prev index next >

src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp

Print this page
rev 55922 : 8228369: Shenandoah: Refactor LRB C1 stubs
rev 55923 : imported patch JDK-8228369-03.patch


  30 #include "gc/shenandoah/shenandoahRuntime.hpp"
  31 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  32 #include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
  33 
  34 #ifdef ASSERT
  35 #define __ gen->lir(__FILE__, __LINE__)->
  36 #else
  37 #define __ gen->lir()->
  38 #endif
  39 
  40 void ShenandoahPreBarrierStub::emit_code(LIR_Assembler* ce) {
  41   ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
  42   bs->gen_pre_barrier_stub(ce, this);
  43 }
  44 
  45 void ShenandoahLoadReferenceBarrierStub::emit_code(LIR_Assembler* ce) {
  46   ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
  47   bs->gen_load_reference_barrier_stub(ce, this);
  48 }
  49 




  50 void ShenandoahBarrierSetC1::pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val) {
  51   // First we test whether marking is in progress.
  52   BasicType flag_type;
  53   bool patch = (decorators & C1_NEEDS_PATCHING) != 0;
  54   bool do_load = pre_val == LIR_OprFact::illegalOpr;
  55   if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
  56     flag_type = T_INT;
  57   } else {
  58     guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1,
  59               "Assumption");
  60     // Use unsigned type T_BOOLEAN here rather than signed T_BYTE since some platforms, eg. ARM,
  61     // need to use unsigned instructions to use the large offset to load the satb_mark_queue.
  62     flag_type = T_BOOLEAN;
  63   }
  64   LIR_Opr thrd = gen->getThreadPointer();
  65   LIR_Address* mark_active_flag_addr =
  66     new LIR_Address(thrd,
  67                     in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()),
  68                     flag_type);
  69   // Read the marking-in-progress flag.




  30 #include "gc/shenandoah/shenandoahRuntime.hpp"
  31 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  32 #include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
  33 
  34 #ifdef ASSERT
  35 #define __ gen->lir(__FILE__, __LINE__)->
  36 #else
  37 #define __ gen->lir()->
  38 #endif
  39 
  40 void ShenandoahPreBarrierStub::emit_code(LIR_Assembler* ce) {
  41   ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
  42   bs->gen_pre_barrier_stub(ce, this);
  43 }
  44 
  45 void ShenandoahLoadReferenceBarrierStub::emit_code(LIR_Assembler* ce) {
  46   ShenandoahBarrierSetAssembler* bs = (ShenandoahBarrierSetAssembler*)BarrierSet::barrier_set()->barrier_set_assembler();
  47   bs->gen_load_reference_barrier_stub(ce, this);
  48 }
  49 
  50 ShenandoahBarrierSetC1::ShenandoahBarrierSetC1() :
  51   _pre_barrier_c1_runtime_code_blob(NULL),
  52   _load_reference_barrier_rt_code_blob(NULL) {}
  53 
  54 void ShenandoahBarrierSetC1::pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val) {
  55   // First we test whether marking is in progress.
  56   BasicType flag_type;
  57   bool patch = (decorators & C1_NEEDS_PATCHING) != 0;
  58   bool do_load = pre_val == LIR_OprFact::illegalOpr;
  59   if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
  60     flag_type = T_INT;
  61   } else {
  62     guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1,
  63               "Assumption");
  64     // Use unsigned type T_BOOLEAN here rather than signed T_BYTE since some platforms, eg. ARM,
  65     // need to use unsigned instructions to use the large offset to load the satb_mark_queue.
  66     flag_type = T_BOOLEAN;
  67   }
  68   LIR_Opr thrd = gen->getThreadPointer();
  69   LIR_Address* mark_active_flag_addr =
  70     new LIR_Address(thrd,
  71                     in_bytes(ShenandoahThreadLocalData::satb_mark_queue_active_offset()),
  72                     flag_type);
  73   // Read the marking-in-progress flag.


< prev index next >