10 #define MI_BASE_ATOM_H
16 #if defined( MI_ARCH_X86) && defined( MI_COMPILER_MSC)
17 # define MI_ATOM32_X86MSC
19 # pragma intrinsic( _InterlockedExchangeAdd)
20 # pragma intrinsic( _InterlockedCompareExchange)
21 #elif defined( MI_ARCH_X86) && (defined( MI_COMPILER_GCC) || defined( MI_COMPILER_ICC))
22 # define MI_ATOM32_X86GCC
24 # define MI_ATOM32_GENERIC
46 #if defined( MI_ATOM32_GENERIC)
76 operator Uint32()
const {
return m_value; }
85 #if defined( MI_ATOM32_GENERIC)
91 #if !defined( MI_FOR_DOXYGEN_ONLY)
93 #if defined( MI_ATOM32_X86MSC)
97 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), rhs) + rhs;
102 return _InterlockedExchangeAdd(
103 reinterpret_cast<volatile long*>( &m_value), -static_cast<const Sint32>( rhs)) - rhs;
108 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), 1L) + 1L;
113 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), 1L);
118 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), -1L) - 1L;
123 return _InterlockedExchangeAdd( reinterpret_cast<volatile long*>( &m_value), -1L);
128 return _InterlockedExchange( reinterpret_cast<volatile long*>( &m_value), rhs);
131 #elif defined( MI_ATOM32_X86GCC) // defined( MI_ATOM32_X86MSC)
138 "lock; xaddl %0,%1\n"
140 :
"=&r"( retval),
"+m"( m_value)
153 "lock; xaddl %0,%1\n"
155 :
"=&r"( retval),
"+m"( m_value)
167 "lock; xaddl %0,%1\n"
169 :
"=&r"( retval),
"+m"( m_value)
181 "lock; xaddl %0,%1\n"
182 :
"=&r"( retval),
"+m"( m_value)
194 "lock; xaddl %0,%1\n"
196 :
"=&r"( retval),
"+m"( m_value)
208 "lock; xaddl %0,%1\n"
209 :
"=&r"( retval),
"+m"( m_value)
222 "lock; cmpxchg %2,%1\n"
224 :
"=&a"( retval),
"+m"( m_value)
231 #elif defined( MI_ATOM32_GENERIC) // defined( MI_ATOM32_X86GCC)
235 m_value = rhs.m_value;
242 return m_value += rhs;
248 return m_value -= rhs;
283 #else // MI_ATOM32_GENERIC
284 #error One of MI_ATOM32_X86MSC, MI_ATOM32_X86GCC, or MI_ATOM32_GENERIC must be defined.
287 #undef MI_ATOM32_X86MSC
288 #undef MI_ATOM32_X86GCC
289 #undef MI_ATOM32_GENERIC
291 #endif // !MI_FOR_DOXYGEN_ONLY
299 #endif // MI_BASE_ATOM_H