--- old/src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp 2019-06-20 15:17:00.332779778 +0100 +++ new/src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp 2019-06-20 15:17:00.076777258 +0100 @@ -91,13 +91,15 @@ __ mov(c_rarg1, rscratch2); int step = 4 * wordSize; - __ mov(rscratch1, -step); + __ mov(rscratch2, -step); __ sub(sp, sp, step); for (int i = 28; i >= 4; i -= 4) { __ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2), - as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch1))); + as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch2))); } + __ st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2), + as_FloatRegister(3), __ T1D, Address(sp)); __ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2); @@ -106,6 +108,7 @@ as_FloatRegister(i+3), __ T1D, Address(__ post(sp, step))); } + // Make sure dst has the return value. if (dst != r0) { __ mov(dst, r0);