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