[PD-cvs] pd/src m_fifo.c,1.1.2.3,1.1.2.4

Tim Blechmann timblech at users.sourceforge.net
Wed Dec 15 23:06:02 CET 2004


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13829

Modified Files:
      Tag: devel_0_38
	m_fifo.c 
Log Message:
cas/cas2 optimizing (untested on win32) & cas for ppc (untested, as well)

Index: m_fifo.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/m_fifo.c,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -C2 -d -r1.1.2.3 -r1.1.2.4
*** m_fifo.c	11 Dec 2004 10:34:55 -0000	1.1.2.3
--- m_fifo.c	15 Dec 2004 22:05:59 -0000	1.1.2.4
***************
*** 30,48 ****
  /* gcc on i386 */
  
! #define CAS(mem, old, new)						\
! ({ __asm__ __volatile__(						\
!        "lock cmpxchg %2,%0  \n"					\
! 	   : :										\
! 	   "m" (*mem), "a" (old), "r" (new) );		\
!    (void*)old != (void*)(*mem);			    	\
  })
  
! #define CAS2(mem, old1, old2, new1, new2)		\
! ({ __asm__ __volatile__(						\
!        "lock cmpxchg8b %0  \n"					\
!        : :										\
! 	   "m" (*mem), "a" (old1), "d" (old2),		\
!        "b" (new1), "c"(new2));					\
!    (void*) old1 != (void*) (*mem);				\
  })
  
--- 30,56 ----
  /* gcc on i386 */
  
! #define CAS(mem, old, new)								\
! ({ int ret = 0;											\
! 	__asm__ __volatile__(								\
!        "lock cmpxchg %3,%1  \n"							\
!        "jnz 1f              \n"							\
! 	   "inc %0              \n"							\
!        "1:                  \n"							\
! 	   :"=r"(ret) :										\
! 	   "m" (*mem), "a" (old), "r" (new), "0"(ret) );	\
!        ret;												\
  })
  
! #define CAS2(mem, old1, old2, new1, new2)				\
! ({ int ret = 0;											\
!     __asm__ __volatile__(								\
!        "lock cmpxchg8b %1  \n"							\
!        "jnz 1f             \n"							\
!        "inc %0             \n"							\
!        "1:                 \n"							\
!        :"=r"(ret) :										\
! 	   "m" (*mem), "a" (old1), "d" (old2),				\
!        "b" (new1), "c"(new2), "0"(ret));				\
!    ret;													\
  })
  
***************
*** 51,56 ****
  /* msvc on i386 */
  
! __inline int CAS(void** mem, void* old, void* new1)
  {
  	__asm {
  		mov           eax, old
--- 59,65 ----
  /* msvc on i386 */
  
! int CAS(void** mem, void* old, void* new1)
  {
+ 	int ret = 0;
  	__asm {
  		mov           eax, old
***************
*** 58,67 ****
  		mov           esi, mem
  		lock cmpxchg  dword ptr [esi], ebx
! 			}
! 	return ((void*) old != (void*)(*mem));
  }
  
! __inline int CAS2(void** mem, void* old1, unsigned long old2, void* new1, unsigned long new2)
  {
  	__asm {
  		mov             eax, old1
--- 67,80 ----
  		mov           esi, mem
  		lock cmpxchg  dword ptr [esi], ebx
! 		jnz           end
! 		inc           [ret]
! 		end:
! 	}
! 	return ret;
  }
  
! int CAS2(void** mem, void* old1, unsigned long old2, void* new1, unsigned long new2)
  {
+ 	int ret = 0;
  	__asm {
  		mov             eax, old1
***************
*** 71,78 ****
  		mov             esi, mem
  		lock cmpxchg8b  qword ptr [esi]
! 			}
! 	return ((void*) old1 != (void*)(*mem));
  }
  
  #else
  
--- 84,116 ----
  		mov             esi, mem
  		lock cmpxchg8b  qword ptr [esi]
! 		jnz             end
! 		inc             [ret]
! 		end:
! 	}
! 	return ret;
  }
  
+ #elif defined(__POWERPC__) 
+ 
+ /* gcc on ppc */								\
+ #define CAS(mem, old, new)						\
+ ({ __typeof__(old) tmp;							\
+    int ret = 0;									\
+    __asm__ __volatile__(						\
+        "1:                  \n"					\
+        "lwarx %0,0,%2       \n"					\
+        "cmpw  %0,%3         \n"					\
+        "bne   1f            \n"					\
+        "stwcx %0,0,%4       \n"					\
+        "bne   1b            \n"					\
+        "li    %1,1          \n"					\
+        "1:                  \n"					\
+ 	   :"=&r"(tmp), "=r"(ret) :					\
+ 	   "m" (*mem), "r" (old), "r" (new) );		\
+ 	   ret;										\
+ })
+ 
+ #error CAS2 hasn't been implemented for ppc, yet
+ 
  #else
  
***************
*** 235,239 ****
  }
  
! /* fifo_put() and fifo_get are the only threadsafe functions!!! */
  void fifo_put(t_fifo* fifo, void* data)
  {
--- 273,277 ----
  }
  
! /* fifo_put and fifo_get are the only threadsafe functions!!! */
  void fifo_put(t_fifo* fifo, void* data)
  {





More information about the Pd-cvs mailing list