10 #ifndef MI_BASE_ATOM_H
11 #define MI_BASE_ATOM_H
17 #if defined( MI_ARCH_X86) && defined( MI_COMPILER_MSC)
18 # define MI_ATOM32_X86MSC
20 # pragma intrinsic( _InterlockedExchangeAdd)
21 # pragma intrinsic( _InterlockedCompareExchange)
22 #elif defined( MI_ARCH_X86) && (defined( MI_COMPILER_GCC) || defined( MI_COMPILER_ICC))
23 # define MI_ATOM32_X86GCC
25 # define MI_ATOM32_GENERIC
47 #if defined( MI_ATOM32_GENERIC)
77 operator Uint32()
const {
return m_value; }
86 #if defined( MI_ATOM32_GENERIC)
92 #if !defined( MI_FOR_DOXYGEN_ONLY)
94 #if defined( MI_ATOM32_X86MSC)
98 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), rhs) + rhs;
103 return _InterlockedExchangeAdd(
104 reinterpret_cast<volatile long*>( &m_value), -static_cast<const Sint32>( rhs)) - rhs;
109 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), 1L) + 1L;
114 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), 1L);
119 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), -1L) - 1L;
124 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), -1L);
129 return _InterlockedExchange( reinterpret_cast<volatile long*>( &m_value), rhs);
132 #elif defined( MI_ATOM32_X86GCC) // defined( MI_ATOM32_X86MSC)
139 "lock; xaddl %0,%1\n"
141 :
"=&r"( retval),
"+m"( m_value)
154 "lock; xaddl %0,%1\n"
156 :
"=&r"( retval),
"+m"( m_value)
168 "lock; xaddl %0,%1\n"
170 :
"=&r"( retval),
"+m"( m_value)
182 "lock; xaddl %0,%1\n"
183 :
"=&r"( retval),
"+m"( m_value)
195 "lock; xaddl %0,%1\n"
197 :
"=&r"( retval),
"+m"( m_value)
209 "lock; xaddl %0,%1\n"
210 :
"=&r"( retval),
"+m"( m_value)
223 "lock; cmpxchg %2,%1\n"
225 :
"=&a"( retval),
"+m"( m_value)
232 #elif defined( MI_ATOM32_GENERIC) // defined( MI_ATOM32_X86GCC)
236 m_value = rhs.m_value;
243 return m_value += rhs;
249 return m_value -= rhs;
284 #else // MI_ATOM32_GENERIC
285 #error One of MI_ATOM32_X86MSC, MI_ATOM32_X86GCC, or MI_ATOM32_GENERIC must be defined.
288 #undef MI_ATOM32_X86MSC
289 #undef MI_ATOM32_X86GCC
290 #undef MI_ATOM32_GENERIC
292 #endif // !MI_FOR_DOXYGEN_ONLY
300 #endif // MI_BASE_ATOM_H