about summary refs log tree commit diff
path: root/sysdeps/powerpc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-06-13 15:38:11 +0000
committerUlrich Drepper <drepper@redhat.com>1999-06-13 15:38:11 +0000
commit2e92188db9129756d7be46cfa0d53d900e3d1135 (patch)
tree66f15d319e1716fb8102023c462471437a02e347 /sysdeps/powerpc
parentee77da07c9c0fef52f8f1d9d63944441e99655f9 (diff)
downloadglibc-2e92188db9129756d7be46cfa0d53d900e3d1135.tar.gz
glibc-2e92188db9129756d7be46cfa0d53d900e3d1135.tar.xz
glibc-2e92188db9129756d7be46cfa0d53d900e3d1135.zip
Update.
1999-06-13  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/atomicity.h (exchange_and_add): Remove `volatile';
	add `memory' clobber; optimise for constant `val'.
	(atomic_add): Likewise.
	(test_and_set): Remove `volatile'; add `memory' clobber; be more
	like the original `test_and_set'.
	(compare_and_swap): Remove `volatile'; add `memory' clobber;
	optimise for constant `oldval'.
	(always_swap): Remove `volatile'; add `memory' clobber.
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r--sysdeps/powerpc/atomicity.h41
1 files changed, 20 insertions, 21 deletions
diff --git a/sysdeps/powerpc/atomicity.h b/sysdeps/powerpc/atomicity.h
index 5b56532779..bb5f49133a 100644
--- a/sysdeps/powerpc/atomicity.h
+++ b/sysdeps/powerpc/atomicity.h
@@ -1,5 +1,5 @@
 /* Low-level functions for atomic operations.  PowerPC version.
-   Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -33,12 +33,12 @@ __attribute__ ((unused))
 exchange_and_add (volatile uint32_t *mem, int val)
 {
   int tmp, result;
-  __asm__ __volatile__ ("\
+  __asm__ ("\
 0:	lwarx	%0,0,%2
-	add	%1,%3,%0
+	add%I3	%1,%0,%3
 	stwcx.	%1,0,%2
 	bne-	0b
-" : "=&r"(result), "=&r"(tmp) : "r" (mem), "r"(val) : "cr0");
+" : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
   return result;
 }
 
@@ -47,12 +47,12 @@ __attribute__ ((unused))
 atomic_add (volatile uint32_t *mem, int val)
 {
   int tmp;
-  __asm__ __volatile__("\
+  __asm__ ("\
 0:	lwarx	%0,0,%1
-	add	%0,%2,%0
+	add%I2	%0,%0,%2
 	stwcx.	%0,0,%1
 	bne-	0b
-" : "=&r"(tmp) : "r" (mem), "r"(val) : "cr0");
+" : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory");
 }
 
 static __ATOMICITY_INLINE int
@@ -60,16 +60,16 @@ __attribute__ ((unused))
 compare_and_swap (volatile long int *p, long int oldval, long int newval)
 {
   int result;
-  __asm__ __volatile__ ("\
+  __asm__ ("\
 0:	lwarx	%0,0,%1
-	xor.	%0,%0,%2
+	sub%I2c.	%0,%0,%2
 	cntlzw	%0,%0
 	bne-	1f
 	stwcx.	%3,0,%1
 	bne-	0b
-1:	srwi	%0,%0,5
-" : "=&r"(result) : "r"(p), "r"(oldval), "r"(newval) : "cr0");
-  return result;
+1:	
+" : "=&b"(result) : "r"(p), "Ir"(oldval), "r"(newval) : "cr0", "memory");
+  return result >> 5;
 }
 
 static __ATOMICITY_INLINE long int
@@ -77,28 +77,27 @@ __attribute__ ((unused))
 always_swap (volatile long int *p, long int newval)
 {
   long int result;
-  __asm__ __volatile__ ("\
+  __asm__ ("\
 0:	lwarx	%0,0,%1
 	stwcx.	%2,0,%1
 	bne-	0b
-" : "=&r"(result) : "r"(p), "r"(newval) : "cr0");
+" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
   return result;
 }
 
 static __ATOMICITY_INLINE int
 __attribute__ ((unused))
-test_and_set (volatile long int *p, long int oldval, long int newval)
+test_and_set (volatile long int *p, long int newval)
 {
   int result;
-  __asm__ __volatile__ ("\
+  __asm__ ("\
 0:	lwarx	%0,0,%1
-	xor.	%0,%0,%2
-	cntlzw	%0,%0
+	cmpwi	%0,0
 	bne-	1f
-	stwcx.	%3,0,%1
+	stwcx.	%2,0,%1
 	bne-	0b
-1:	srwi	%0,%0,5
-" : "=&r"(result) : "r"(p), "r"(oldval), "r"(newval) : "cr0");
+1:
+" : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory");
   return result;
 }