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.
|