< prev index next >

src/hotspot/share/runtime/atomic.hpp

Print this page

        

*** 633,665 **** CI addend = add_value; return PlatformAdd<sizeof(P*)>()(addend, dest, order); } }; - // Most platforms do not support atomic add on a 2-byte value. However, - // if the value occupies the most significant 16 bits of an aligned 32-bit - // word, then we can do this with an atomic add of (add_value << 16) - // to the 32-bit word. - // - // The least significant parts of this 32-bit word will never be affected, even - // in case of overflow/underflow. - // - // Use the ATOMIC_SHORT_PAIR macro (see macros.hpp) to get the desired alignment. - template<> - struct Atomic::AddImpl<short, short> { - short operator()(short add_value, short volatile* dest, atomic_memory_order order) const { - #ifdef VM_LITTLE_ENDIAN - assert((intx(dest) & 0x03) == 0x02, "wrong alignment"); - int new_value = Atomic::add(add_value << 16, (volatile int*)(dest-1), order); - #else - assert((intx(dest) & 0x03) == 0x00, "wrong alignment"); - int new_value = Atomic::add(add_value << 16, (volatile int*)(dest), order); - #endif - return (short)(new_value >> 16); // preserves sign - } - }; - template<typename Derived> template<typename I, typename D> inline D Atomic::FetchAndAdd<Derived>::operator()(I add_value, D volatile* dest, atomic_memory_order order) const { I addend = add_value; --- 633,642 ----
< prev index next >