< prev index next >

src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp

Print this page
rev 53513 : 8217016: Shenandoah: Streamline generation of CAS barriers


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


< prev index next >