< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page

        

*** 2365,2401 **** enum operand_size size, bool acquire, bool release, bool weak, Register result) { if (result == noreg) result = rscratch1; if (UseLSE) { mov(result, expected); lse_cas(result, new_val, addr, size, acquire, release, /*not_pair*/ true); ! cmp(result, expected); } else { - BLOCK_COMMENT("cmpxchg {"); Label retry_load, done; if ((VM_Version::features() & VM_Version::CPU_STXR_PREFETCH)) prfm(Address(addr), PSTL1STRM); bind(retry_load); load_exclusive(result, addr, size, acquire); ! if (size == xword) ! cmp(result, expected); ! else ! cmpw(result, expected); br(Assembler::NE, done); store_exclusive(rscratch1, new_val, addr, size, release); if (weak) { cmpw(rscratch1, 0u); // If the store fails, return NE to our caller. } else { cbnzw(rscratch1, retry_load); } bind(done); BLOCK_COMMENT("} cmpxchg"); } } static bool different(Register a, RegisterOrConstant b, Register c) { if (b.is_constant()) return a != c; else return a != b.as_register() && a != c && b.as_register() != c; --- 2365,2416 ---- enum operand_size size, bool acquire, bool release, bool weak, Register result) { if (result == noreg) result = rscratch1; + BLOCK_COMMENT("cmpxchg {"); if (UseLSE) { mov(result, expected); lse_cas(result, new_val, addr, size, acquire, release, /*not_pair*/ true); ! compare_eq(result, expected, size); } else { Label retry_load, done; if ((VM_Version::features() & VM_Version::CPU_STXR_PREFETCH)) prfm(Address(addr), PSTL1STRM); bind(retry_load); load_exclusive(result, addr, size, acquire); ! compare_eq(result, expected, size); br(Assembler::NE, done); store_exclusive(rscratch1, new_val, addr, size, release); if (weak) { cmpw(rscratch1, 0u); // If the store fails, return NE to our caller. } else { cbnzw(rscratch1, retry_load); } bind(done); + } BLOCK_COMMENT("} cmpxchg"); + } + + // A generic comparison. Only compares for equality, clobbers rscratch1. + void MacroAssembler::compare_eq(Register rm, Register rn, enum operand_size size) { + if (size == xword) { + cmp(rm, rn); + } else if (size == word) { + cmpw(rm, rn); + } else if (size == halfword) { + eorw(rscratch1, rm, rn); + ands(zr, rscratch1, 0xffff); + } else if (size == byte) { + eorw(rscratch1, rm, rn); + ands(zr, rscratch1, 0xff); + } else { + ShouldNotReachHere(); } } + static bool different(Register a, RegisterOrConstant b, Register c) { if (b.is_constant()) return a != c; else return a != b.as_register() && a != c && b.as_register() != c;
< prev index next >