From: Michal Krol Date: Mon, 16 Mar 2009 12:42:22 +0000 (+0100) Subject: gallium: Implement atomic for MSVC on x86. X-Git-Tag: 062012170305~17580^2~91 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c97b671d64a5f137177989a28c684a13b5cb249b;p=profile%2Fivi%2Fmesa.git gallium: Implement atomic for MSVC on x86. --- diff --git a/src/gallium/include/pipe/p_atomic.h b/src/gallium/include/pipe/p_atomic.h index 13866d2..b9bf711 100644 --- a/src/gallium/include/pipe/p_atomic.h +++ b/src/gallium/include/pipe/p_atomic.h @@ -66,7 +66,71 @@ p_atomic_cmpxchg(struct pipe_atomic *v, int32_t old, int32_t new) return __sync_val_compare_and_swap(&v->count, old, new); } -#elif (defined(PIPE_SUBSYSTEM_WINDOWS_USER)) /* (defined(PIPE_CC_GCC)) */ +#elif (defined(PIPE_ARCH_X86) && defined(PIPE_CC_MSVC)) /* (defined(PIPE_CC_GCC)) */ + +struct pipe_atomic +{ + int32_t count; +}; + +#define p_atomic_set(_v, _i) ((_v)->count = (_i)) +#define p_atomic_read(_v) ((_v)->count) + +static INLINE boolean +p_atomic_dec_zero(struct pipe_atomic *v) +{ + int32_t *pcount = &v->count; + unsigned char c; + + __asm { + mov eax, [pcount] + lock dec dword ptr [eax] + sete byte ptr [c] + } + + return c != 0; +} + +static INLINE void +p_atomic_inc(struct pipe_atomic *v) +{ + int32_t *pcount = &v->count; + + __asm { + mov eax, [pcount] + lock inc dword ptr [eax] + } +} + +static INLINE void +p_atomic_dec(struct pipe_atomic *v) +{ + int32_t *pcount = &v->count; + + __asm { + mov eax, [pcount] + lock dec dword ptr [eax] + } +} + +static INLINE int32_t +p_atomic_cmpxchg(struct pipe_atomic *v, int32_t old, int32_t new) +{ + int32_t *pcount = &v->count; + int32_t orig; + + __asm { + mov ecx, [pcount] + mov eax, [old] + mov edx, [new] + lock cmpxchg [ecx], edx + mov [orig], eax + } + + return orig; +} + +#elif (defined(PIPE_SUBSYSTEM_WINDOWS_USER)) /* (defined(PIPE_ARCH_X86) && defined(PIPE_CC_MSVC)) */ struct pipe_atomic {