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.
|