621 #endif
622 __ movptr(Address(obj, BrooksPointer::byte_offset()), obj);
623
624 // recover var_size_in_bytes if necessary
625 if (var_size_in_bytes == end) {
626 __ subptr(var_size_in_bytes, obj);
627 }
628 __ verify_tlab();
629 }
630
631 void ShenandoahBarrierSetAssembler::resolve_for_read(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
632 bool oop_not_null = (decorators & IS_NOT_NULL) != 0;
633 if (oop_not_null) {
634 read_barrier_not_null(masm, obj);
635 } else {
636 read_barrier(masm, obj);
637 }
638 }
639
640 void ShenandoahBarrierSetAssembler::resolve_for_write(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
641 write_barrier(masm, obj);
642 }
643
644 // Special Shenandoah CAS implementation that handles false negatives
645 // due to concurrent evacuation.
646 #ifndef _LP64
647 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, DecoratorSet decorators,
648 Register res, Address addr, Register oldval, Register newval,
649 bool exchange, bool encode, Register tmp1, Register tmp2) {
650 // Shenandoah has no 32-bit version for this.
651 Unimplemented();
652 }
653 #else
654 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, DecoratorSet decorators,
655 Register res, Address addr, Register oldval, Register newval,
656 bool exchange, bool encode, Register tmp1, Register tmp2) {
657
658 if (!ShenandoahCASBarrier) {
659 BarrierSetAssembler::cmpxchg_oop(masm, decorators, res, addr, oldval, newval, exchange, encode, tmp1, tmp2);
660 return;
661 }
|
621 #endif
622 __ movptr(Address(obj, BrooksPointer::byte_offset()), obj);
623
624 // recover var_size_in_bytes if necessary
625 if (var_size_in_bytes == end) {
626 __ subptr(var_size_in_bytes, obj);
627 }
628 __ verify_tlab();
629 }
630
631 void ShenandoahBarrierSetAssembler::resolve_for_read(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
632 bool oop_not_null = (decorators & IS_NOT_NULL) != 0;
633 if (oop_not_null) {
634 read_barrier_not_null(masm, obj);
635 } else {
636 read_barrier(masm, obj);
637 }
638 }
639
640 void ShenandoahBarrierSetAssembler::resolve_for_write(MacroAssembler* masm, DecoratorSet decorators, Register obj) {
641 bool oop_not_null = (decorators & IS_NOT_NULL) != 0;
642 if (oop_not_null) {
643 write_barrier(masm, obj);
644 } else {
645 Label done;
646 __ testptr(obj, obj);
647 __ jcc(Assembler::zero, done);
648 write_barrier(masm, obj);
649 __ bind(done);
650 }
651 }
652
653 // Special Shenandoah CAS implementation that handles false negatives
654 // due to concurrent evacuation.
655 #ifndef _LP64
656 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, DecoratorSet decorators,
657 Register res, Address addr, Register oldval, Register newval,
658 bool exchange, bool encode, Register tmp1, Register tmp2) {
659 // Shenandoah has no 32-bit version for this.
660 Unimplemented();
661 }
662 #else
663 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, DecoratorSet decorators,
664 Register res, Address addr, Register oldval, Register newval,
665 bool exchange, bool encode, Register tmp1, Register tmp2) {
666
667 if (!ShenandoahCASBarrier) {
668 BarrierSetAssembler::cmpxchg_oop(masm, decorators, res, addr, oldval, newval, exchange, encode, tmp1, tmp2);
669 return;
670 }
|