--- old/src/hotspot/share/runtime/atomic.hpp 2019-11-21 11:54:19.412094099 +0100 +++ new/src/hotspot/share/runtime/atomic.hpp 2019-11-21 11:54:19.160089837 +0100 @@ -132,8 +132,8 @@ // The type T must be either a pointer type convertible to or equal // to D, an integral/enum type equal to D, or a type equal to D that // is primitive convertible using PrimitiveConversions. - template - inline static D xchg(T exchange_value, volatile D* dest, + template + inline static D xchg(volatile D* dest, T exchange_value, atomic_memory_order order = memory_order_conservative); // Performs atomic compare of *dest and compare_value, and exchanges @@ -341,7 +341,7 @@ // checking and limited conversions around calls to the // platform-specific implementation layer provided by // PlatformXchg. - template + template struct XchgImpl; // Platform-specific implementation of xchg. Support for sizes @@ -353,11 +353,11 @@ // - platform_xchg is an object of type PlatformXchg. // // Then - // platform_xchg(exchange_value, dest) + // platform_xchg(dest, exchange_value) // must be a valid expression, returning a result convertible to T. // // A default definition is provided, which declares a function template - // T operator()(T, T volatile*, T, atomic_memory_order) const + // T operator()(T volatile*, T, atomic_memory_order) const // // For each required size, a platform must either provide an // appropriate definition of that function, or must entirely @@ -373,8 +373,8 @@ // helper function. template static T xchg_using_helper(Fn fn, - T exchange_value, - T volatile* dest); + T volatile* dest, + T exchange_value); }; template @@ -593,8 +593,8 @@ template struct Atomic::PlatformXchg { template - T operator()(T exchange_value, - T volatile* dest, + T operator()(T volatile* dest, + T exchange_value, atomic_memory_order order) const; }; @@ -891,9 +891,9 @@ T, T, typename EnableIf::value || IsRegisteredEnum::value>::type> { - T operator()(T exchange_value, T volatile* dest, atomic_memory_order order) const { + T operator()(T volatile* dest, T exchange_value, atomic_memory_order order) const { // Forward to the platform handler for the size of T. - return PlatformXchg()(exchange_value, dest, order); + return PlatformXchg()(dest, exchange_value, order); } }; @@ -902,15 +902,15 @@ // The exchange_value must be implicitly convertible to the // destination's type; it must be type-correct to store the // exchange_value in the destination. -template +template struct Atomic::XchgImpl< - T*, D*, + D*, T*, typename EnableIf::value>::type> { - D* operator()(T* exchange_value, D* volatile* dest, atomic_memory_order order) const { + D* operator()(D* volatile* dest, T* exchange_value, atomic_memory_order order) const { // Allow derived to base conversion, and adding cv-qualifiers. D* new_value = exchange_value; - return PlatformXchg()(new_value, dest, order); + return PlatformXchg()(dest, new_value, order); } }; @@ -926,30 +926,31 @@ T, T, typename EnableIf::value>::type> { - T operator()(T exchange_value, T volatile* dest, atomic_memory_order order) const { + T operator()(T volatile* dest, T exchange_value, atomic_memory_order order) const { typedef PrimitiveConversions::Translate Translator; typedef typename Translator::Decayed Decayed; STATIC_ASSERT(sizeof(T) == sizeof(Decayed)); return Translator::recover( - xchg(Translator::decay(exchange_value), - reinterpret_cast(dest), + xchg(reinterpret_cast(dest), + Translator::decay(exchange_value), order)); } }; template inline T Atomic::xchg_using_helper(Fn fn, - T exchange_value, - T volatile* dest) { + T volatile* dest, + T exchange_value) { STATIC_ASSERT(sizeof(Type) == sizeof(T)); + // Notice the swapped order of arguments. Change when/if stubs are rewritten. return PrimitiveConversions::cast( fn(PrimitiveConversions::cast(exchange_value), reinterpret_cast(dest))); } -template -inline D Atomic::xchg(T exchange_value, volatile D* dest, atomic_memory_order order) { - return XchgImpl()(exchange_value, dest, order); +template +inline D Atomic::xchg(volatile D* dest, T exchange_value, atomic_memory_order order) { + return XchgImpl()(dest, exchange_value, order); } #endif // SHARE_RUNTIME_ATOMIC_HPP