#error UNDEFINED OS TYPE
#endif /* __linux__ */
-#if !defined (__i386__) && !defined (__ia64__) && !defined(__x86_64__) && !defined(__PPC64__)
+#if !defined (__i386__) && !defined (__ia64__) && !defined(__x86_64__) && !defined(__PPC__) && !defined(__PPC64__)
#error UNDEFINED ARCH
#endif
#include <sys/socket.h>
#include <ctype.h>
-#if !defined(REDHAT_EL5) && (defined(__ia64__) || defined(__PPC64__))
+#if !defined(REDHAT_EL5) && (defined(__ia64__))
#include <asm/atomic.h>
#endif
-#if defined(__PPC64__)
-#include <asm/system.h>
-#endif
/* Useful debug definitions */
#ifndef STATIC
#else
IA64_FETCHADD(old_value,v,1,4);
#endif
-#elif defined(__PPC64__)
- atomic_inc((atomic_t *) v);
+#elif defined(__PPC__) || defined(__PPC64__)
+ int tmp;
+
+ __asm__ __volatile__(
+ "1: lwarx %0,0,%2\n\
+ addic %0,%0,1\n\
+ stwcx. %0,0,%2\n\
+ bne- 1b"
+ : "=&r" (tmp), "+m" (v)
+ : "r" (&v)
+ : "cc");
#else /* !__ia64__ */
__asm__ __volatile__ (
"lock;" "incl %0"
#else
IA64_FETCHADD(old_value,v,-1,4);
#endif
-#elif defined (__PPC64__)
- atomic_dec((atomic_t *)v);
-
+#elif defined (__PPC__) || defined(__PPC64__)
+ int tmp;
+
+ __asm__ __volatile__(
+ "1: lwarx %0,0,%2\n\
+ addic %0,%0,-1\n\
+ stwcx. %0,0,%2\n\
+ bne- 1b"
+ : "=&r" (tmp), "+m" (v)
+ : "r" (&v)
+ : "cc");
#else /* !__ia64__ */
__asm__ __volatile__ (
"lock;" "decl %0"
#else
current_value = ia64_cmpxchg(acq,v,match_value,new_value,4);
#endif /* __ia64__ */
-#elif defined(__PPC64__)
+#elif defined(__PPC__) || defined(__PPC64__)
__asm__ __volatile__ (
" lwsync\n\
1: lwarx %0,0,%2 # __cmpxchg_u32\n\