200
201 int get_stub_size();
202 void post_init(int offset);
203
204 public:
205 ShenandoahBarrierStubC2(const MachNode* node, Register obj, Address addr, bool narrow, bool do_load, int offset) :
206 BarrierStubC2(node),
207 _obj(obj),
208 _addr(addr),
209 _do_load(do_load),
210 _narrow(narrow),
211 _maybe_null(maybe_null(node)),
212 _needs_load_ref_barrier(needs_load_ref_barrier(node)),
213 _needs_load_ref_weak_barrier(needs_load_ref_barrier_weak(node)),
214 _needs_keep_alive_barrier(needs_keep_alive_barrier(node)),
215 _fastpath_branch_offset(offset),
216 _test_and_branch_reachable(),
217 _skip_trampoline(),
218 _test_and_branch_reachable_entry(),
219 _save_slots_idx(0) {
220 assert(!_narrow || is_heap_access(node), "Only heap accesses can be narrow");
221 post_init(offset);
222 }
223
224 static bool is_heap_access(const MachNode* node) {
225 return (node->barrier_data() & ShenandoahBitNative) == 0;
226 }
227 static bool needs_slow_barrier(const MachNode* node) {
228 return needs_load_ref_barrier(node) || needs_keep_alive_barrier(node);
229 }
230 static bool needs_load_ref_barrier(const MachNode* node) {
231 return (node->barrier_data() & (ShenandoahBitStrong | ShenandoahBitWeak | ShenandoahBitPhantom)) != 0;
232 }
233 static bool needs_load_ref_barrier_weak(const MachNode* node) {
234 return (node->barrier_data() & (ShenandoahBitWeak | ShenandoahBitPhantom)) != 0;
235 }
236 static bool needs_keep_alive_barrier(const MachNode* node) {
237 return (node->barrier_data() & ShenandoahBitKeepAlive) != 0;
238 }
239 static bool needs_card_barrier(const MachNode* node) {
240 return (node->barrier_data() & ShenandoahBitCardMark) != 0;
241 }
242 static bool maybe_null(const MachNode* node) {
243 return (node->barrier_data() & ShenandoahBitNotNull) == 0;
244 }
245
246 static ShenandoahBarrierStubC2* create(const MachNode* node, Register obj, Address addr, bool narrow, bool do_load, int offset = 0);
247 void emit_code(MacroAssembler& masm);
248
249 void enter_if_gc_state(MacroAssembler& masm, const char test_state);
250 };
251 #endif // SHARE_GC_SHENANDOAH_C2_SHENANDOAHBARRIERSETC2_HPP
|
200
201 int get_stub_size();
202 void post_init(int offset);
203
204 public:
205 ShenandoahBarrierStubC2(const MachNode* node, Register obj, Address addr, bool narrow, bool do_load, int offset) :
206 BarrierStubC2(node),
207 _obj(obj),
208 _addr(addr),
209 _do_load(do_load),
210 _narrow(narrow),
211 _maybe_null(maybe_null(node)),
212 _needs_load_ref_barrier(needs_load_ref_barrier(node)),
213 _needs_load_ref_weak_barrier(needs_load_ref_barrier_weak(node)),
214 _needs_keep_alive_barrier(needs_keep_alive_barrier(node)),
215 _fastpath_branch_offset(offset),
216 _test_and_branch_reachable(),
217 _skip_trampoline(),
218 _test_and_branch_reachable_entry(),
219 _save_slots_idx(0) {
220 assert(!ShenandoahSkipBarriers, "Do not touch stubs when disabled");
221 assert(!_narrow || is_heap_access(node), "Only heap accesses can be narrow");
222 post_init(offset);
223 }
224
225 static bool is_heap_access(const MachNode* node) {
226 return (node->barrier_data() & ShenandoahBitNative) == 0;
227 }
228 static bool needs_slow_barrier(const MachNode* node) {
229 return !ShenandoahSkipBarriers && (needs_load_ref_barrier(node) || needs_keep_alive_barrier(node));
230 }
231 static bool needs_load_ref_barrier(const MachNode* node) {
232 return (node->barrier_data() & (ShenandoahBitStrong | ShenandoahBitWeak | ShenandoahBitPhantom)) != 0;
233 }
234 static bool needs_load_ref_barrier_weak(const MachNode* node) {
235 return (node->barrier_data() & (ShenandoahBitWeak | ShenandoahBitPhantom)) != 0;
236 }
237 static bool needs_keep_alive_barrier(const MachNode* node) {
238 return (node->barrier_data() & ShenandoahBitKeepAlive) != 0;
239 }
240 static bool needs_card_barrier(const MachNode* node) {
241 return !ShenandoahSkipBarriers && ((node->barrier_data() & ShenandoahBitCardMark) != 0);
242 }
243 static bool maybe_null(const MachNode* node) {
244 return (node->barrier_data() & ShenandoahBitNotNull) == 0;
245 }
246
247 static ShenandoahBarrierStubC2* create(const MachNode* node, Register obj, Address addr, bool narrow, bool do_load, int offset = 0);
248 void emit_code(MacroAssembler& masm);
249
250 void enter_if_gc_state(MacroAssembler& masm, const char test_state);
251 };
252 #endif // SHARE_GC_SHENANDOAH_C2_SHENANDOAHBARRIERSETC2_HPP
|