PATCH: interlocked fixes for ppc

Marcus Meissner meissner at suse.de
Mon Aug 19 07:48:08 CDT 2002


Hi,

This optimizes some things in the interlocked functions for PPC
and also fixes the return value of InterlockedIncrement.

I removed the sync, the atomic.h header for linux/ppc does not have
it either.

Ciao, Marcus

License: LGPL
Changelog:
	Cleaned up interlocking funcs for PPC, fixed retrn value of
	interlocked_add.

Index: library/port.c
===================================================================
RCS file: /home/wine/wine/library/port.c,v
retrieving revision 1.35
diff -u -r1.35 port.c
--- library/port.c	17 Aug 2002 01:22:59 -0000	1.35
+++ library/port.c	19 Aug 2002 12:45:53 -0000
@@ -752,89 +752,78 @@
 #elif defined(__powerpc__)
 void* interlocked_cmpxchg_ptr( void **dest, void* xchg, void* compare)
 {
-    long ret;
+    long ret = 0;
     long scratch;
     __asm__ __volatile__(
-    "sync; "
     "0:    lwarx %0,0,%2 ;"
     "      xor. %1,%4,%0;"
     "      bne 1f;"
     "      stwcx. %3,0,%2;"
     "      bne- 0b;"
     "1:    "
-    "sync; "
     : "=&r"(ret), "=&r"(scratch)
     : "r"(dest), "r"(xchg), "r"(compare)
-    : "cr0", "memory");
+    : "cr0","memory");
     return (void*)ret;
 }
 
 long interlocked_cmpxchg( long *dest, long xchg, long compare)
 {
-    long ret;
+    long ret = 0;
     long scratch;
     __asm__ __volatile__(
-    "sync; "
     "0:    lwarx %0,0,%2 ;"
     "      xor. %1,%4,%0;"
     "      bne 1f;"
     "      stwcx. %3,0,%2;"
     "      bne- 0b;"
     "1:    "
-    "sync; "
     : "=&r"(ret), "=&r"(scratch)
     : "r"(dest), "r"(xchg), "r"(compare)
-    : "cr0", "memory");
+    : "cr0","memory");
     return ret;
 }
 
 long interlocked_xchg_add( long *dest, long incr )
 {
-    void *ret __attribute__ ((aligned (4))) = &ret;
-    long inc = incr;
+    long ret = 0;
     long zero = 0;
     __asm__ __volatile__(
-	"sync; "
 	"0:    lwarx %0, %3, %1;"
 	"      add %0, %2, %0;"
 	"      stwcx. %0, %3, %1;"
 	"      bne- 0b;"
-	"sync; "
-	: "=&r"(ret)
-	: "r"(dest), "r"(inc), "r"(zero)
+	: "=&r" (ret)
+	: "r"(dest), "r"(incr), "r"(zero)
 	: "cr0", "memory"
     );
-    return (long)ret;
+    return ret-incr;
 }
 
 long interlocked_xchg( long* dest, long val )
 {
-    void *ret __attribute__ ((aligned (4))) = &ret;
+    long ret = 0;
     __asm__ __volatile__(
-    "sync; "
     "0:    lwarx %0,0,%1 ;"
     "      stwcx. %2,0,%1;"
     "      bne- 0b;"
-    "sync; "
     : "=&r"(ret)
     : "r"(dest), "r"(val)
-    : "cr0", "memory");
-    return (long)ret;
+    : "cr0","memory");
+    return ret;
 }
 
 void* interlocked_xchg_ptr( void** dest, void* val )
 {
-    void *ret __attribute__ ((aligned (4))) = &ret;
+    void *ret = NULL;
     __asm__ __volatile__(
-    "sync; "
     "0:    lwarx %0,0,%1 ;"
     "      stwcx. %2,0,%1;"
     "      bne- 0b;"
-    "sync; "
     : "=&r"(ret)
     : "r"(dest), "r"(val)
-    : "cr0", "memory");
-    return (void*)ret;
+    : "cr0","memory");
+    return ret;
 }
 
 #elif defined(__sparc__) && defined(__sun__)



More information about the wine-patches mailing list