< prev index next >
src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp
Print this page
rev 53513 : 8217016: Shenandoah: Streamline generation of CAS barriers
*** 590,657 ****
// Special Shenandoah CAS implementation that handles false negatives
// due to concurrent evacuation.
#ifndef _LP64
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
Register res, Address addr, Register oldval, Register newval,
! bool exchange, bool encode, Register tmp1, Register tmp2) {
// Shenandoah has no 32-bit version for this.
Unimplemented();
}
#else
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
Register res, Address addr, Register oldval, Register newval,
! bool exchange, bool encode, Register tmp1, Register tmp2) {
! if (!ShenandoahCASBarrier) {
! #ifdef _LP64
! if (UseCompressedOops) {
! if (encode) {
! __ encode_heap_oop(oldval);
! __ mov(rscratch1, newval);
! __ encode_heap_oop(rscratch1);
! newval = rscratch1;
! }
! if (os::is_MP()) {
! __ lock();
! }
! // oldval (rax) is implicitly used by this instruction
! __ cmpxchgl(newval, addr);
! } else
! #endif
! {
! if (os::is_MP()) {
! __ lock();
! }
! __ cmpxchgptr(newval, addr);
! }
!
! if (!exchange) {
! assert(res != NULL, "need result register");
! __ setb(Assembler::equal, res);
! __ movzbl(res, res);
! }
! return;
! }
!
assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled");
assert(oldval == rax, "must be in rax for implicit use in cmpxchg");
Label retry, done;
- // Apply storeval barrier to newval.
- if (encode) {
- storeval_barrier(masm, newval, tmp1);
- }
-
- if (UseCompressedOops) {
- if (encode) {
- __ encode_heap_oop(oldval);
- __ mov(rscratch1, newval);
- __ encode_heap_oop(rscratch1);
- newval = rscratch1;
- }
- }
-
// Remember oldval for retry logic below
if (UseCompressedOops) {
__ movl(tmp1, oldval);
} else {
__ movptr(tmp1, oldval);
--- 590,612 ----
// Special Shenandoah CAS implementation that handles false negatives
// due to concurrent evacuation.
#ifndef _LP64
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
Register res, Address addr, Register oldval, Register newval,
! bool exchange, Register tmp1, Register tmp2) {
// Shenandoah has no 32-bit version for this.
Unimplemented();
}
#else
void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
Register res, Address addr, Register oldval, Register newval,
! bool exchange, Register tmp1, Register tmp2) {
assert(ShenandoahCASBarrier, "Should only be used when CAS barrier is enabled");
assert(oldval == rax, "must be in rax for implicit use in cmpxchg");
Label retry, done;
// Remember oldval for retry logic below
if (UseCompressedOops) {
__ movl(tmp1, oldval);
} else {
__ movptr(tmp1, oldval);
< prev index next >