575 Label done;
576 __ testptr(obj, obj);
577 __ jcc(Assembler::zero, done);
578 write_barrier(masm, obj);
579 __ bind(done);
580 }
581 } else {
582 if (oop_not_null) {
583 read_barrier_not_null(masm, obj);
584 } else {
585 read_barrier(masm, obj);
586 }
587 }
588 }
589
590 // Special Shenandoah CAS implementation that handles false negatives
591 // due to concurrent evacuation.
592 #ifndef _LP64
593 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
594 Register res, Address addr, Register oldval, Register newval,
595 bool exchange, bool encode, Register tmp1, Register tmp2) {
596 // Shenandoah has no 32-bit version for this.
597 Unimplemented();
598 }
599 #else
600 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
601 Register res, Address addr, Register oldval, Register newval,
602 bool exchange, bool encode, Register tmp1, Register tmp2) {
603 if (!ShenandoahCASBarrier) {
604 #ifdef _LP64
605 if (UseCompressedOops) {
606 if (encode) {
607 __ encode_heap_oop(oldval);
608 __ mov(rscratch1, newval);
609 __ encode_heap_oop(rscratch1);
610 newval = rscratch1;
611 }
612 if (os::is_MP()) {
613 __ lock();
614 }
615 // oldval (rax) is implicitly used by this instruction
616 __ cmpxchgl(newval, addr);
617 } else
618 #endif
619 {
620 if (os::is_MP()) {
621 __ lock();
622 }
623 __ cmpxchgptr(newval, addr);
624 }
625
626 if (!exchange) {
627 assert(res != NULL, "need result register");
628 __ setb(Assembler::equal, res);
629 __ movzbl(res, res);
630 }
631 return;
632 }
633
634 assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled");
635 assert(oldval == rax, "must be in rax for implicit use in cmpxchg");
636
637 Label retry, done;
638
639 // Apply storeval barrier to newval.
640 if (encode) {
641 storeval_barrier(masm, newval, tmp1);
642 }
643
644 if (UseCompressedOops) {
645 if (encode) {
646 __ encode_heap_oop(oldval);
647 __ mov(rscratch1, newval);
648 __ encode_heap_oop(rscratch1);
649 newval = rscratch1;
650 }
651 }
652
653 // Remember oldval for retry logic below
654 if (UseCompressedOops) {
655 __ movl(tmp1, oldval);
656 } else {
657 __ movptr(tmp1, oldval);
658 }
659
660 // Step 1. Try to CAS with given arguments. If successful, then we are done,
661 // and can safely return.
662 if (os::is_MP()) __ lock();
663 if (UseCompressedOops) {
664 __ cmpxchgl(newval, addr);
665 } else {
666 __ cmpxchgptr(newval, addr);
667 }
668 __ jcc(Assembler::equal, done, true);
669
670 // Step 2. CAS had failed. This may be a false negative.
671 //
|
575 Label done;
576 __ testptr(obj, obj);
577 __ jcc(Assembler::zero, done);
578 write_barrier(masm, obj);
579 __ bind(done);
580 }
581 } else {
582 if (oop_not_null) {
583 read_barrier_not_null(masm, obj);
584 } else {
585 read_barrier(masm, obj);
586 }
587 }
588 }
589
590 // Special Shenandoah CAS implementation that handles false negatives
591 // due to concurrent evacuation.
592 #ifndef _LP64
593 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
594 Register res, Address addr, Register oldval, Register newval,
595 bool exchange, Register tmp1, Register tmp2) {
596 // Shenandoah has no 32-bit version for this.
597 Unimplemented();
598 }
599 #else
600 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
601 Register res, Address addr, Register oldval, Register newval,
602 bool exchange, Register tmp1, Register tmp2) {
603 assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled");
604 assert(oldval == rax, "must be in rax for implicit use in cmpxchg");
605
606 Label retry, done;
607
608 // Remember oldval for retry logic below
609 if (UseCompressedOops) {
610 __ movl(tmp1, oldval);
611 } else {
612 __ movptr(tmp1, oldval);
613 }
614
615 // Step 1. Try to CAS with given arguments. If successful, then we are done,
616 // and can safely return.
617 if (os::is_MP()) __ lock();
618 if (UseCompressedOops) {
619 __ cmpxchgl(newval, addr);
620 } else {
621 __ cmpxchgptr(newval, addr);
622 }
623 __ jcc(Assembler::equal, done, true);
624
625 // Step 2. CAS had failed. This may be a false negative.
626 //
|