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
94 public:
95 ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result) :
96 _obj(obj), _result(result)
97 {
98 assert(_obj->is_register(), "should be register");
99 assert(_result->is_register(), "should be register");
100 }
101
102 LIR_Opr obj() const { return _obj; }
103 LIR_Opr result() const { return _result; }
104
105 virtual void emit_code(LIR_Assembler* e);
106 virtual void visit(LIR_OpVisitState* visitor) {
107 visitor->do_slow_case();
108 visitor->do_input(_obj);
109 visitor->do_temp(_result);
110 }
111 #ifndef PRODUCT
112 virtual void print_name(outputStream* out) const { out->print("ShenandoahLoadReferenceBarrierStub"); }
113 #endif // PRODUCT
114 };
115
116 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
117 friend class LIR_OpVisitState;
118
119 private:
120 LIR_Opr _addr;
121 LIR_Opr _cmp_value;
122 LIR_Opr _new_value;
123 LIR_Opr _tmp1;
124 LIR_Opr _tmp2;
125
126 public:
127 LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
128 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
129 : LIR_Op(lir_none, result, NULL) // no info
157
158 virtual void emit_code(LIR_Assembler* masm);
159
160 virtual void print_instr(outputStream* out) const {
161 addr()->print(out); out->print(" ");
162 cmp_value()->print(out); out->print(" ");
163 new_value()->print(out); out->print(" ");
164 tmp1()->print(out); out->print(" ");
165 tmp2()->print(out); out->print(" ");
166 }
167 #ifndef PRODUCT
168 virtual const char* name() const {
169 return "shenandoah_cas_obj";
170 }
171 #endif // PRODUCT
172 };
173
174 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
175 private:
176 CodeBlob* _pre_barrier_c1_runtime_code_blob;
177
178 void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
179
180 LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj);
181 LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
182
183 LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj);
184
185 LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
186
187 public:
188 CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
189
190 protected:
191
192 virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
193 virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
194
195 virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
196
197 virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
198
199 public:
200
201 virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
202 virtual const char* rtcall_name_for_address(address entry);
203 };
204
205 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
|
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 LIR_Opr _tmp1;
94 LIR_Opr _tmp2;
95
96 public:
97 ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2) :
98 _obj(obj), _result(result), _tmp1(tmp1), _tmp2(tmp2)
99 {
100 assert(_obj->is_register(), "should be register");
101 assert(_result->is_register(), "should be register");
102 assert(_tmp1->is_register(), "should be register");
103 assert(_tmp2->is_register(), "should be register");
104 }
105
106 LIR_Opr obj() const { return _obj; }
107 LIR_Opr result() const { return _result; }
108 LIR_Opr tmp1() const { return _tmp1; }
109 LIR_Opr tmp2() const { return _tmp2; }
110
111 virtual void emit_code(LIR_Assembler* e);
112 virtual void visit(LIR_OpVisitState* visitor) {
113 visitor->do_slow_case();
114 visitor->do_input(_obj);
115 visitor->do_temp(_result);
116 visitor->do_temp(_tmp1);
117 visitor->do_temp(_tmp2);
118 }
119 #ifndef PRODUCT
120 virtual void print_name(outputStream* out) const { out->print("ShenandoahLoadReferenceBarrierStub"); }
121 #endif // PRODUCT
122 };
123
124 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
125 friend class LIR_OpVisitState;
126
127 private:
128 LIR_Opr _addr;
129 LIR_Opr _cmp_value;
130 LIR_Opr _new_value;
131 LIR_Opr _tmp1;
132 LIR_Opr _tmp2;
133
134 public:
135 LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
136 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
137 : LIR_Op(lir_none, result, NULL) // no info
165
166 virtual void emit_code(LIR_Assembler* masm);
167
168 virtual void print_instr(outputStream* out) const {
169 addr()->print(out); out->print(" ");
170 cmp_value()->print(out); out->print(" ");
171 new_value()->print(out); out->print(" ");
172 tmp1()->print(out); out->print(" ");
173 tmp2()->print(out); out->print(" ");
174 }
175 #ifndef PRODUCT
176 virtual const char* name() const {
177 return "shenandoah_cas_obj";
178 }
179 #endif // PRODUCT
180 };
181
182 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
183 private:
184 CodeBlob* _pre_barrier_c1_runtime_code_blob;
185 CodeBlob* _load_reference_barrier_rt_code_blob;
186
187 void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
188
189 LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj);
190 LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
191
192 LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj);
193
194 LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
195
196 public:
197 CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
198 CodeBlob* load_reference_barrier_rt_code_blob() { return _load_reference_barrier_rt_code_blob; }
199
200 protected:
201
202 virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
203 virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
204
205 virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
206
207 virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
208
209 public:
210
211 virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
212 virtual const char* rtcall_name_for_address(address entry);
213 };
214
215 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
|