From 3a17a87c81c9b83f80c2bbc14bed15ea051fda8c Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Tue, 20 Aug 2002 00:01:15 +0000 Subject: [PATCH] Cleaned up interlocking funcs for PPC, fixed return value of interlocked_add. --- library/port.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/library/port.c b/library/port.c index 78e51a93560..0f21e8390dc 100644 --- a/library/port.c +++ b/library/port.c @@ -752,89 +752,78 @@ __declspec(naked) long interlocked_xchg_add( long *dest, long incr ) #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__)