--- old/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp 2015-01-21 10:23:23.953567256 -0500 +++ new/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp 2015-01-21 10:23:23.713588510 -0500 @@ -1845,7 +1845,8 @@ // Now set thread in native __ mov(rscratch1, _thread_in_native); - __ str(rscratch1, Address(rthread, JavaThread::thread_state_offset())); + __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); + __ stlrw(rscratch1, rscratch2); { int return_type = 0; @@ -1902,7 +1903,8 @@ // Thread A is resumed to finish this native method, but doesn't block here since it // didn't see any synchronization is progress, and escapes. __ mov(rscratch1, _thread_in_native_trans); - __ str(rscratch1, Address(rthread, JavaThread::thread_state_offset())); + __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); + __ stlrw(rscratch1, rscratch2); if(os::is_MP()) { if (UseMembar) { @@ -1966,7 +1968,8 @@ // change thread state __ mov(rscratch1, _thread_in_Java); - __ str(rscratch1, Address(rthread, JavaThread::thread_state_offset())); + __ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset())); + __ stlrw(rscratch1, rscratch2); __ bind(after_transition); Label reguard;