From 504d73f342f949b29cee8e04f27bf8a5b4597401 Mon Sep 17 00:00:00 2001 From: Christoph Bumiller Date: Mon, 17 Nov 2014 20:05:53 +0100 Subject: gallium/auxiliary: add inc and dec alternative with return (v4) At this moment we use only zero or positive values. v2: Implement it for also for Solaris, MSVC assembly and enable for other combinations. v3: Replace MSVC assembly by assert + warning during compilation v4: remove inc and dec with return for MSVC assembly Acked-by: Jose Fonseca Reviewed-by: Ilia Mirkin Signed-off-by: David Heidelberg (cherry picked from commit cb49132166faf4c8668b09a300bd9e3877327a33) --- src/gallium/auxiliary/util/u_atomic.h | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src') diff --git a/src/gallium/auxiliary/util/u_atomic.h b/src/gallium/auxiliary/util/u_atomic.h index 2f2b42b346f..9731aa04bbc 100644 --- a/src/gallium/auxiliary/util/u_atomic.h +++ b/src/gallium/auxiliary/util/u_atomic.h @@ -68,6 +68,18 @@ p_atomic_dec(int32_t *v) __asm__ __volatile__("lock; decl %0":"+m"(*v)); } +static INLINE int32_t +p_atomic_inc_return(int32_t *v) +{ + return __sync_add_and_fetch(v, 1); +} + +static INLINE int32_t +p_atomic_dec_return(int32_t *v) +{ + return __sync_sub_and_fetch(v, 1); +} + static INLINE int32_t p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new) { @@ -115,6 +127,18 @@ p_atomic_dec(int32_t *v) __asm__ __volatile__("lock; decl %0":"+m"(*v)); } +static INLINE int32_t +p_atomic_inc_return(int32_t *v) +{ + return __sync_add_and_fetch(v, 1); +} + +static INLINE int32_t +p_atomic_dec_return(int32_t *v) +{ + return __sync_sub_and_fetch(v, 1); +} + static INLINE int32_t p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new) { @@ -160,6 +184,18 @@ p_atomic_dec(int32_t *v) (void) __sync_sub_and_fetch(v, 1); } +static INLINE int32_t +p_atomic_inc_return(int32_t *v) +{ + return __sync_add_and_fetch(v, 1); +} + +static INLINE int32_t +p_atomic_dec_return(int32_t *v) +{ + return __sync_sub_and_fetch(v, 1); +} + static INLINE int32_t p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new) { @@ -186,6 +222,8 @@ p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new) #define p_atomic_dec_zero(_v) ((boolean) --(*(_v))) #define p_atomic_inc(_v) ((void) (*(_v))++) #define p_atomic_dec(_v) ((void) (*(_v))--) +#define p_atomic_inc_return(_v) ((*(_v))++) +#define p_atomic_dec_return(_v) ((*(_v))--) #define p_atomic_cmpxchg(_v, old, _new) (*(_v) == old ? *(_v) = (_new) : *(_v)) #endif @@ -288,12 +326,24 @@ p_atomic_inc(int32_t *v) _InterlockedIncrement((long *)v); } +static INLINE int32_t +p_atomic_inc_return(int32_t *v) +{ + return _InterlockedIncrement((long *)v); +} + static INLINE void p_atomic_dec(int32_t *v) { _InterlockedDecrement((long *)v); } +static INLINE int32_t +p_atomic_dec_return(int32_t *v) +{ + return _InterlockedDecrement((long *)v); +} + static INLINE int32_t p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new) { @@ -329,6 +379,8 @@ p_atomic_dec_zero(int32_t *v) #define p_atomic_inc(_v) atomic_inc_32((uint32_t *) _v) #define p_atomic_dec(_v) atomic_dec_32((uint32_t *) _v) +#define p_atomic_inc_return(_v) atomic_inc_32_nv((uint32_t *) _v) +#define p_atomic_dec_return(_v) atomic_dec_32_nv((uint32_t *) _v) #define p_atomic_cmpxchg(_v, _old, _new) \ atomic_cas_32( (uint32_t *) _v, (uint32_t) _old, (uint32_t) _new) -- cgit v1.2.3