On Mon, Mar 16, 2009 at 1:59 PM, José Fonseca <jfons...@vmware.com> wrote:
> Shouldn't we use InterlockedIncrement
> ( http://msdn.microsoft.com/en-us/library/ms683614(VS.85).aspx ) and
> friends in Windows instead of assembly? It is implemented as a compiler
> intrinsic, so it probably results in more efficient generated code.
>

I am using InterlockedIncrement for windows user subsystem -- see my
previous commit. (MSCV && X86) seems to have a broader scope than
WINDOWS_SUBSYSTEM_USER alone.

What about kernel subsystem? Are there also atomic functions that are
intrinsic? Anyway, feel free to shuffle #ifdefs around.



> On Mon, 2009-03-16 at 05:42 -0700, Micha?? Kr??l wrote:
>> Module: Mesa
>> Branch: master
>> Commit: c97b671d64a5f137177989a28c684a13b5cb249b
>> URL:    
>> http://cgit.freedesktop.org/mesa/mesa/commit/?id=c97b671d64a5f137177989a28c684a13b5cb249b
>>
>> Author: Michal Krol <mic...@vmware.com>
>> Date:   Mon Mar 16 13:42:22 2009 +0100
>>
>> gallium: Implement atomic for MSVC on x86.
>>
>> ---
>>
>>  src/gallium/include/pipe/p_atomic.h |   66 
>> ++++++++++++++++++++++++++++++++++-
>>  1 files changed, 65 insertions(+), 1 deletions(-)
>>
>> 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
>>  {
>>
>> _______________________________________________
>> mesa-commit mailing list
>> mesa-com...@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
>
>



-- 
Pozdrawiam,
Michal Krol

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to