diff -r 2181425e0460 -r 74a5ef4c81cc src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Sun Jan 27 20:48:27 2019 -0500 +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Sat Jan 26 01:21:33 2019 +0100 @@ -423,45 +423,14 @@ } void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val, - bool acquire, bool release, bool weak, bool encode, - Register tmp1, Register tmp2, Register tmp3, + bool acquire, bool release, bool weak, bool is_cae, Register result) { - if (!ShenandoahCASBarrier) { - if (UseCompressedOops) { - if (encode) { - __ encode_heap_oop(tmp1, expected); - expected = tmp1; - __ encode_heap_oop(tmp3, new_val); - new_val = tmp3; - } - __ cmpxchg(addr, expected, new_val, Assembler::word, /* acquire*/ true, /* release*/ true, /* weak*/ false, rscratch1); - __ membar(__ AnyAny); - } else { - __ cmpxchg(addr, expected, new_val, Assembler::xword, /* acquire*/ true, /* release*/ true, /* weak*/ false, rscratch1); - __ membar(__ AnyAny); - } - return; - } - - if (encode) { - storeval_barrier(masm, new_val, tmp3); - } - - if (UseCompressedOops) { - if (encode) { - __ encode_heap_oop(tmp1, expected); - expected = tmp1; - __ encode_heap_oop(tmp2, new_val); - new_val = tmp2; - } - } - bool is_cae = (result != noreg); + Register tmp = rscratch2; bool is_narrow = UseCompressedOops; Assembler::operand_size size = is_narrow ? Assembler::word : Assembler::xword; - if (! is_cae) result = rscratch1; - assert_different_registers(addr, expected, new_val, result, tmp3); + assert_different_registers(addr, expected, new_val, result, tmp); Label retry, done, fail; @@ -474,35 +443,38 @@ __ cmp(result, expected); } __ br(Assembler::NE, fail); - __ store_exclusive(tmp3, new_val, addr, size, release); + __ store_exclusive(tmp, new_val, addr, size, release); if (weak) { - __ cmpw(tmp3, 0u); // If the store fails, return NE to our caller + __ cmpw(tmp, 0u); // If the store fails, return NE to our caller } else { - __ cbnzw(tmp3, retry); + __ cbnzw(tmp, retry); } __ b(done); __ bind(fail); // Check if rb(expected)==rb(result) // Shuffle registers so that we have memory value ready for next expected. - __ mov(tmp3, expected); + __ mov(tmp, expected); __ mov(expected, result); if (is_narrow) { __ decode_heap_oop(result, result); - __ decode_heap_oop(tmp3, tmp3); + __ decode_heap_oop(tmp, tmp); } read_barrier_impl(masm, result); - read_barrier_impl(masm, tmp3); - __ cmp(result, tmp3); + read_barrier_impl(masm, tmp); + __ cmp(result, tmp); // Retry with expected now being the value we just loaded from addr. __ br(Assembler::EQ, retry); - if (is_narrow && is_cae) { + if (is_cae && is_narrow) { // For cmp-and-exchange and narrow oops, we need to restore // the compressed old-value. We moved it to 'expected' a few lines up. __ mov(result, expected); } __ bind(done); + if (!is_cae) { + __ cset(result, Assembler::EQ); + } } #ifdef COMPILER1