On 27 November 2014 at 18:54, Ola Liljedahl <[email protected]> wrote:
> Signed-off-by: Ola Liljedahl <[email protected]> > --- > (This document/code contribution attached is provided under the terms of > agreement LES-LTM-21309) > > odp_atomic_internal.h is updated with operations (e.g. exchange, > compare-and- > exchange) on 16-byte atomics (_odp_atomic_u128_t atomic type with > corresponding > _uint128_t scalar type). > GCC on x86-64 requires the compiler flag -mcx16 to enable support for > 16-byte > atomics. > Some of this description at least should be above --- so that it can be seen in the commit history > Some minor changes to the comments. > > .../linux-generic/include/odp_atomic_internal.h | 72 > ++++++++++++++++++++-- > 1 file changed, 66 insertions(+), 6 deletions(-) > > diff --git a/platform/linux-generic/include/odp_atomic_internal.h > b/platform/linux-generic/include/odp_atomic_internal.h > index 38b0de0..25da2cd 100644 > --- a/platform/linux-generic/include/odp_atomic_internal.h > +++ b/platform/linux-generic/include/odp_atomic_internal.h > @@ -320,9 +320,10 @@ static inline uint64_t > _odp_atomic_u64_xchg_mm(odp_atomic_u64_t *ptr, > * @param ptr Pointer to a 64-bit atomic variable > is this an input or output @param[in] ptr - same for all arguments > * @param exp_p Pointer to expected value (updated on failure) > * @param val New value to write > - * @param succ Memory model associated with a successful compare-and-swap > + * @param succ Memory model associated with a successful compare-and-swap > + * operation > + * @param fail Memory model associated with a failed compare-and-swap > * operation > - * @param fail Memory model associated with a failed compare-and-swap > operation > * > * @return 1 (true) if exchange successful, 0 (false) if not successful > (and > * '*exp_p' updated with current value) > @@ -511,9 +512,9 @@ static inline void > *_odp_atomic_ptr_xchg(_odp_atomic_ptr_t *ptr, > * @param ptr Pointer to a pointer atomic variable > * @param exp_p Pointer to expected value (updated on failure) > * @param val New value to write > - * @param succ Memory model associated with a successful > compare-and-swap > + * @param succ Memory model associated with a successful compare-and-swap > * operation > - * @param fail Memory model associated with a failed > compare-and-swap > + * @param fail Memory model associated with a failed compare-and-swap > * operation > * > * @return 1 (true) if exchange successful, 0 (false) if not successful > (and > @@ -541,7 +542,7 @@ static inline int > _odp_atomic_ptr_cmp_xchg_strong(_odp_atomic_ptr_t *ptr, > should this be odp_bool_t > > *****************************************************************************/ > > /** > - * Initialize a flag atomic variable > + * Initialize an atomic flag variable > * > * @param ptr Pointer to a flag atomic variable > * @param val The initial value (true or false) of the variable > @@ -568,7 +569,8 @@ static inline int > _odp_atomic_flag_load(_odp_atomic_flag_t *ptr) > /** > * Test-and-set of atomic flag variable > * @Note Operation has acquire memory model. It pairs with a later > - * release operation in some thread. > + * release operation in some thread. It does not provide release or > + * acquire/release semantics. > * > * @param ptr Pointer to a flag atomic variable > * @return The old value (true or false) of the variable > @@ -591,6 +593,64 @@ static inline void > _odp_atomic_flag_clear(_odp_atomic_flag_t *ptr) > __atomic_clear(ptr, __ATOMIC_RELEASE); > } > > +/* Check if target and compiler supports 128-bit scalars and corresponding > + * exchange and CAS operations */ > +/* GCC on x86-64 needs -mcx16 compiler option */ > +#if defined __SIZEOF_INT128__ && defined > __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 > + > +/** Preprocessor symbol that indicates support for 128-bit atomics */ > +#define ODP_ATOMIC_U128 > + > +/** An unsigned 128-bit (16-byte) scalar type */ > +typedef __int128 _uint128_t; > + > +/** Atomic 128-bit type */ > +typedef struct { > + _uint128_t v; /**< Actual storage for the atomic variable */ > +} _odp_atomic_u128_t ODP_ALIGNED(16); > + > +/** > + * 16-byte atomic exchange operation > + * > + * @param ptr Pointer to a 16-byte atomic variable > + * @param val_p Pointer to new value to write > + * @param old_p Pointer to location for old value > + * @param mmodel Memory model associated with the exchange operation > + */ > +static inline void _odp_atomic_u128_xchg_mm(_odp_atomic_u128_t *ptr, > + _uint128_t *val_p, > nit we appear to been putting the p before the variable name generally. you mix ptr and p, we should be consistent in one file. > + _uint128_t *old_p, > + _odp_memmodel_t mm) > +{ > + __atomic_exchange(&ptr->v, val_p, old_p, mm); > +} > + > +/** > + * Atomic compare and exchange (swap) of 16-byte atomic variable > + * "Strong" semantics, will not fail spuriously. > + * > + * @param ptr Pointer to a 16-byte atomic variable > + * @param exp_p Pointer to expected value (updated on failure) > + * @param val_p Pointer to new value to write > + * @param succ Memory model associated with a successful compare-and-swap > + * operation > + * @param fail Memory model associated with a failed compare-and-swap > + * operation > + * > + * @return 1 (true) if exchange successful, 0 (false) if not successful > (and > + * '*exp_p' updated with current value) > Use retval, one for each case. > + */ > +static inline int _odp_atomic_u128_cmp_xchg_mm(_odp_atomic_u128_t *ptr, > + _uint128_t *exp_p, > + _uint128_t *val_p, > + _odp_memmodel_t succ, > success would be better, no need to save space, applications will pass in whatever length variable they were using anyway. > + _odp_memmodel_t fail) > +{ > + return __atomic_compare_exchange(&ptr->v, exp_p, val_p, > + false/*strong*/, succ, fail); > +} > +#endif > + > /** > * @} > */ > -- > 1.9.1 > > > _______________________________________________ > lng-odp mailing list > [email protected] > http://lists.linaro.org/mailman/listinfo/lng-odp > -- *Mike Holmes* Linaro Sr Technical Manager LNG - ODP
_______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
