--- old/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.hpp 2017-08-22 15:36:15.961168125 +0200 +++ new/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.hpp 2017-08-22 15:36:15.797168131 +0200 @@ -93,9 +93,21 @@ #define strasm_nobarrier "" #define strasm_nobarrier_clobber_memory "" -inline jint Atomic::add (jint add_value, volatile jint* dest) { +template +struct Atomic::PlatformAdd + : Atomic::AddAndFetch > +{ + template + D add_and_fetch(I add_value, D volatile* dest) const; +}; + +template<> +template +inline D Atomic::PlatformAdd<4>::add_and_fetch(I add_value, D volatile* dest) const { + STATIC_CAST(4 == sizeof(I)); + STATIC_CAST(4 == sizeof(D)); - unsigned int result; + D result; __asm__ __volatile__ ( strasm_lwsync @@ -108,13 +120,17 @@ : /*%1*/"r" (add_value), /*%2*/"r" (dest) : "cc", "memory" ); - return (jint) result; + return result; } -inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) { +template<> +template +inline D Atomic::PlatformAdd<8>::add_and_fetch(I add_value, D volatile* dest) const { + STATIC_CAST(8 == sizeof(I)); + STATIC_CAST(8 == sizeof(D)); - long result; + D result; __asm__ __volatile__ ( strasm_lwsync @@ -127,13 +143,11 @@ : /*%1*/"r" (add_value), /*%2*/"r" (dest) : "cc", "memory" ); - return (intptr_t) result; -} - -inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) { - return (void*)add_ptr(add_value, (volatile intptr_t*)dest); + return result; } +template<> +struct Atomic::PlatformAdd<2>: Atomic::AddShortUsingInt {}; inline void Atomic::inc (volatile jint* dest) {