< prev index next >

src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.hpp

Print this page

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
< prev index next >