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 +