68 if (_do_load) {
69 // don't pass in the code emit info since it's processed in the fast
70 // path
71 if (_info != NULL)
72 visitor->do_slow_case(_info);
73 else
74 visitor->do_slow_case();
75
76 visitor->do_input(_addr);
77 visitor->do_temp(_pre_val);
78 } else {
79 visitor->do_slow_case();
80 visitor->do_input(_pre_val);
81 }
82 }
83 #ifndef PRODUCT
84 virtual void print_name(outputStream* out) const { out->print("ShenandoahPreBarrierStub"); }
85 #endif // PRODUCT
86 };
87
88 class ShenandoahWriteBarrierStub: public CodeStub {
89 friend class ShenandoahBarrierSetC1;
90 private:
91 LIR_Opr _obj;
92 LIR_Opr _result;
93 CodeEmitInfo* _info;
94 bool _needs_null_check;
95
96 public:
97 ShenandoahWriteBarrierStub(LIR_Opr obj, LIR_Opr result, CodeEmitInfo* info, bool needs_null_check) :
98 _obj(obj), _result(result), _info(info), _needs_null_check(needs_null_check)
99 {
100 assert(_obj->is_register(), "should be register");
101 assert(_result->is_register(), "should be register");
102 }
103
104 LIR_Opr obj() const { return _obj; }
105 LIR_Opr result() const { return _result; }
106 CodeEmitInfo* info() const { return _info; }
107 bool needs_null_check() const { return _needs_null_check; }
108
109 virtual void emit_code(LIR_Assembler* e);
110 virtual void visit(LIR_OpVisitState* visitor) {
111 visitor->do_slow_case();
112 visitor->do_input(_obj);
113 visitor->do_temp(_result);
114 }
115 #ifndef PRODUCT
116 virtual void print_name(outputStream* out) const { out->print("ShenandoahWritePreBarrierStub"); }
117 #endif // PRODUCT
118 };
119
120 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
121 friend class LIR_OpVisitState;
122
123 private:
124 LIR_Opr _addr;
125 LIR_Opr _cmp_value;
126 LIR_Opr _new_value;
127 LIR_Opr _tmp1;
128 LIR_Opr _tmp2;
129
130 public:
131 LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
132 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
133 : LIR_Op(lir_none, result, NULL) // no info
134 , _addr(addr)
135 , _cmp_value(cmp_value)
136 , _new_value(new_value)
164 virtual void print_instr(outputStream* out) const {
165 addr()->print(out); out->print(" ");
166 cmp_value()->print(out); out->print(" ");
167 new_value()->print(out); out->print(" ");
168 tmp1()->print(out); out->print(" ");
169 tmp2()->print(out); out->print(" ");
170 }
171 #ifndef PRODUCT
172 virtual const char* name() const {
173 return "shenandoah_cas_obj";
174 }
175 #endif // PRODUCT
176 };
177
178 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
179 private:
180 CodeBlob* _pre_barrier_c1_runtime_code_blob;
181
182 void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
183
184 LIR_Opr read_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
185 LIR_Opr write_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
186 LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
187
188 LIR_Opr read_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
189 LIR_Opr write_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
190
191 LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
192
193 public:
194 CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
195
196 protected:
197 virtual LIR_Opr resolve_address(LIRAccess& access, bool resolve_in_register);
198
199 virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
200 virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
201
202 virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
203
204 virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
205 virtual LIR_Opr atomic_add_at_resolved(LIRAccess& access, LIRItem& value);
206
207 public:
208 virtual LIR_Opr resolve(LIRGenerator* gen, DecoratorSet decorators, LIR_Opr obj);
209
210 virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
211 };
212
213 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
|
68 if (_do_load) {
69 // don't pass in the code emit info since it's processed in the fast
70 // path
71 if (_info != NULL)
72 visitor->do_slow_case(_info);
73 else
74 visitor->do_slow_case();
75
76 visitor->do_input(_addr);
77 visitor->do_temp(_pre_val);
78 } else {
79 visitor->do_slow_case();
80 visitor->do_input(_pre_val);
81 }
82 }
83 #ifndef PRODUCT
84 virtual void print_name(outputStream* out) const { out->print("ShenandoahPreBarrierStub"); }
85 #endif // PRODUCT
86 };
87
88 class ShenandoahLoadReferenceBarrierStub: public CodeStub {
89 friend class ShenandoahBarrierSetC1;
90 private:
91 LIR_Opr _obj;
92 LIR_Opr _result;
93 CodeEmitInfo* _info;
94 bool _needs_null_check;
95
96 public:
97 ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result, CodeEmitInfo* info, bool needs_null_check) :
98 _obj(obj), _result(result), _info(info), _needs_null_check(needs_null_check)
99 {
100 assert(_obj->is_register(), "should be register");
101 assert(_result->is_register(), "should be register");
102 }
103
104 LIR_Opr obj() const { return _obj; }
105 LIR_Opr result() const { return _result; }
106 CodeEmitInfo* info() const { return _info; }
107 bool needs_null_check() const { return _needs_null_check; }
108
109 virtual void emit_code(LIR_Assembler* e);
110 virtual void visit(LIR_OpVisitState* visitor) {
111 visitor->do_slow_case();
112 visitor->do_input(_obj);
113 visitor->do_temp(_result);
114 }
115 #ifndef PRODUCT
116 virtual void print_name(outputStream* out) const { out->print("ShenandoahLoadReferenceBarrierStub"); }
117 #endif // PRODUCT
118 };
119
120 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
121 friend class LIR_OpVisitState;
122
123 private:
124 LIR_Opr _addr;
125 LIR_Opr _cmp_value;
126 LIR_Opr _new_value;
127 LIR_Opr _tmp1;
128 LIR_Opr _tmp2;
129
130 public:
131 LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
132 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
133 : LIR_Op(lir_none, result, NULL) // no info
134 , _addr(addr)
135 , _cmp_value(cmp_value)
136 , _new_value(new_value)
164 virtual void print_instr(outputStream* out) const {
165 addr()->print(out); out->print(" ");
166 cmp_value()->print(out); out->print(" ");
167 new_value()->print(out); out->print(" ");
168 tmp1()->print(out); out->print(" ");
169 tmp2()->print(out); out->print(" ");
170 }
171 #ifndef PRODUCT
172 virtual const char* name() const {
173 return "shenandoah_cas_obj";
174 }
175 #endif // PRODUCT
176 };
177
178 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
179 private:
180 CodeBlob* _pre_barrier_c1_runtime_code_blob;
181
182 void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
183
184 LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
185 LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
186
187 LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, bool need_null_check);
188
189 LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
190
191 public:
192 CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
193
194 protected:
195
196 virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
197 virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
198
199 virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
200
201 virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
202
203 public:
204
205 virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
206 };
207
208 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
|