epoc32/include/tools/stlport/stl/_sparc_atomic.h
branchSymbian2
changeset 2 2fe1408b6811
child 4 837f303aceeb
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/epoc32/include/tools/stlport/stl/_sparc_atomic.h	Tue Mar 16 16:12:26 2010 +0000
     1.3 @@ -0,0 +1,60 @@
     1.4 +
     1.5 +// Currently, SUN CC requires object file
     1.6 +
     1.7 +#if defined (__GNUC__)
     1.8 +
     1.9 +/*
    1.10 +**  int _STLP_atomic_exchange (__stl_atomic_t *pvalue, __stl_atomic_t value)
    1.11 +*/
    1.12 +
    1.13 +# ifdef __sparc_v9__
    1.14 +
    1.15 +#  ifdef __arch64__
    1.16 +
    1.17 +#   define _STLP_EXCH_ASM  asm volatile ("casx [%3], %4, %0 ;  membar  #LoadLoad | #LoadStore " : \
    1.18 +                   "=r" (_L_value2), "=m" (*_L_pvalue1) : \
    1.19 +                   "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
    1.20 +
    1.21 +#  else /* __arch64__ */
    1.22 +
    1.23 +#   define _STLP_EXCH_ASM  asm volatile ("cas [%3], %4, %0" : \
    1.24 +                   "=r" (_L_value2), "=m" (*_L_pvalue1) : \
    1.25 +                   "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
    1.26 +#  endif
    1.27 +
    1.28 +# else /* __sparc_v9__ */
    1.29 +
    1.30 +#  define _STLP_EXCH_ASM asm volatile ("swap [%3], %0 " : \
    1.31 +                                       "=r" (_L_value2), "=m" (*_L_pvalue1) : \
    1.32 +                                       "m" (*_L_pvalue1), "r" (_L_pvalue1),  "0" (_L_value2) )
    1.33 +# endif
    1.34 +
    1.35 +
    1.36 +#  define _STLP_ATOMIC_EXCHANGE(__pvalue1, __value2) \
    1.37 + ({  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
    1.38 +     register __stl_atomic_t _L_value1, _L_value2 =  __value2 ; \
    1.39 +     do { _L_value1 = *_L_pvalue1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; \
    1.40 +     _L_value1; })
    1.41 +
    1.42 +#  define _STLP_ATOMIC_INCREMENT(__pvalue1) \
    1.43 + {  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
    1.44 +    register __stl_atomic_t _L_value1, _L_value2; \
    1.45 +    do { _L_value1 = *_L_pvalue1;  _L_value2 = _L_value1+1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
    1.46 +
    1.47 +#  define _STLP_ATOMIC_DECREMENT(__pvalue1) \
    1.48 + {  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
    1.49 +    register __stl_atomic_t _L_value1, _L_value2; \
    1.50 +    do { _L_value1 = *_L_pvalue1;  _L_value2 = _L_value1-1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
    1.51 +
    1.52 +# elif ! defined (_STLP_NO_EXTERN_INLINE)
    1.53 +
    1.54 +extern "C" __stl_atomic_t _STLP_atomic_exchange(__stl_atomic_t * __x, __stl_atomic_t __v);
    1.55 +extern "C" void _STLP_atomic_decrement(__stl_atomic_t* i);
    1.56 +extern "C" void _STLP_atomic_increment(__stl_atomic_t* i);
    1.57 +
    1.58 +#  define _STLP_ATOMIC_INCREMENT(__x)           _STLP_atomic_increment((__stl_atomic_t*)__x)
    1.59 +#  define _STLP_ATOMIC_DECREMENT(__x)           _STLP_atomic_decrement((__stl_atomic_t*)__x)
    1.60 +#  define _STLP_ATOMIC_EXCHANGE(__x, __y)       _STLP_atomic_exchange((__stl_atomic_t*)__x, (__stl_atomic_t)__y)
    1.61 +
    1.62 +# endif
    1.63 +