< prev index next >

src/hotspot/cpu/sparc/gc/g1/g1BarrierSetAssembler_sparc.cpp

Print this page
rev 50745 : imported patch remove_in_concurrent_root


 383   if (use_scr) {
 384     post_filter_masm->mov(store_addr, scr);
 385   } else {
 386     post_filter_masm->nop();
 387   }
 388   __ save_frame(0);
 389   __ call(dirty_card_log_enqueue);
 390   if (use_scr) {
 391     __ delayed()->mov(scr, O0);
 392   } else {
 393     __ delayed()->mov(store_addr->after_save(), O0);
 394   }
 395   __ restore();
 396 
 397   __ bind(filtered);
 398 }
 399 
 400 void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
 401                                          Register val, Address dst, Register tmp) {
 402   bool in_heap = (decorators & IN_HEAP) != 0;
 403   bool in_concurrent_root = (decorators & IN_CONCURRENT_ROOT) != 0;

 404 
 405   bool needs_pre_barrier = in_heap || in_concurrent_root;
 406   // No need for post barrier if storing NULL
 407   bool needs_post_barrier = val != G0 && in_heap;
 408 
 409   bool is_array = (decorators & IS_ARRAY) != 0;
 410   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
 411   bool precise = is_array || on_anonymous;
 412 
 413   Register index = dst.has_index() ? dst.index() : noreg;
 414   int disp = dst.has_disp() ? dst.disp() : 0;
 415 
 416   if (needs_pre_barrier) {
 417     // Load and record the previous value.
 418     g1_write_barrier_pre(masm, dst.base(), index, disp,
 419                          noreg /* pre_val */,
 420                          tmp, true /*preserve_o_regs*/);
 421   }
 422 
 423   Register new_val = val;
 424   if (needs_post_barrier) {
 425     // G1 barrier needs uncompressed oop for region cross check.




 383   if (use_scr) {
 384     post_filter_masm->mov(store_addr, scr);
 385   } else {
 386     post_filter_masm->nop();
 387   }
 388   __ save_frame(0);
 389   __ call(dirty_card_log_enqueue);
 390   if (use_scr) {
 391     __ delayed()->mov(scr, O0);
 392   } else {
 393     __ delayed()->mov(store_addr->after_save(), O0);
 394   }
 395   __ restore();
 396 
 397   __ bind(filtered);
 398 }
 399 
 400 void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
 401                                          Register val, Address dst, Register tmp) {
 402   bool in_heap = (decorators & IN_HEAP) != 0;
 403   bool as_normal = (decorators & AS_NORMAL) != 0;
 404   assert((decorators & IS_DEST_UNINITIALIZED) == 0, "unsupported");
 405 
 406   bool needs_pre_barrier = as_normal;
 407   // No need for post barrier if storing NULL
 408   bool needs_post_barrier = val != G0 && in_heap;
 409 
 410   bool is_array = (decorators & IS_ARRAY) != 0;
 411   bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
 412   bool precise = is_array || on_anonymous;
 413 
 414   Register index = dst.has_index() ? dst.index() : noreg;
 415   int disp = dst.has_disp() ? dst.disp() : 0;
 416 
 417   if (needs_pre_barrier) {
 418     // Load and record the previous value.
 419     g1_write_barrier_pre(masm, dst.base(), index, disp,
 420                          noreg /* pre_val */,
 421                          tmp, true /*preserve_o_regs*/);
 422   }
 423 
 424   Register new_val = val;
 425   if (needs_post_barrier) {
 426     // G1 barrier needs uncompressed oop for region cross check.


< prev index next >