summary refs log tree commit diff
path: root/csu
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2003-03-26 04:02:03 +0000
committerRoland McGrath <roland@gnu.org>2003-03-26 04:02:03 +0000
commit859e708f0e44d50deff617c7fd939f4fba295afb (patch)
treec02276928e6c984391f089af6b54f81220165d0e /csu
parentdd410d4d4585883d02aa497f4227551c5c4cf811 (diff)
downloadglibc-859e708f0e44d50deff617c7fd939f4fba295afb.tar.gz
glibc-859e708f0e44d50deff617c7fd939f4fba295afb.tar.xz
glibc-859e708f0e44d50deff617c7fd939f4fba295afb.zip
* csu/tst-atomic.c (do_test): Add some new
	atomic_compare_and_exchange_val_acq, atomic_add_zero,
	atomic_compare_and_exchange_bool_acq and atomic_add_negative tests.
	* include/atomic.h (atomic_add_negative, atomic_add_zero):
	Prefix local variable so that it doesn't clash with the one
	in atomic_exchange_and_add.
	* sysdeps/ia64/bits/atomic.h (atomic_exchange): Fix for long/void *
	pointers.
	(atomic_exchange_and_add): Implement using __sync_fetch_and_add_?i.
	* sysdeps/powerpc/bits/atomic.h (atomic_exchange_and_add): Force
	value into register.
	* sysdeps/s390/bits/atomic.h (__arch_compare_and_exchange_val_64_acq):
	Cast newval to long.
	* sysdeps/x86_64/bits/atomic.h
	(__arch_compare_and_exchange_val_64_acq): Cast newval and oldval to
	long.
	(atomic_exchange): Cast newvalue to long if sizeof == 8.
	(atomic_exchange_and_add): Cast value to long if sizeof == 8.
	(atomic_add, atomic_add_negative, atomic_add_zero): Likewise.
	(atomic_bit_set): Shift 1L up in all cases to shut up warnings.
Diffstat (limited to 'csu')
-rw-r--r--csu/tst-atomic.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/csu/tst-atomic.c b/csu/tst-atomic.c
index e5686e377d..943c050735 100644
--- a/csu/tst-atomic.c
+++ b/csu/tst-atomic.c
@@ -48,6 +48,22 @@ do_test (void)
       puts ("atomic_compare_and_exchange_val_acq test 2 failed");
       ret = 1;
     }
+
+  mem = -15;
+  if (atomic_compare_and_exchange_val_acq (&mem, -56, -15) != -15
+      || mem != -56)
+    {
+      puts ("atomic_compare_and_exchange_val_acq test 3 failed");
+      ret = 1;
+    }
+
+  mem = -1;
+  if (atomic_compare_and_exchange_val_acq (&mem, 17, 0) != -1
+      || mem != -1)
+    {
+      puts ("atomic_compare_and_exchange_val_acq test 4 failed");
+      ret = 1;
+    }
 #endif
 
   mem = 24;
@@ -66,6 +82,22 @@ do_test (void)
       ret = 1;
     }
 
+  mem = -15;
+  if (atomic_compare_and_exchange_bool_acq (&mem, -56, -15)
+      || mem != -56)
+    {
+      puts ("atomic_compare_and_exchange_bool_acq test 3 failed");
+      ret = 1;
+    }
+
+  mem = -1;
+  if (! atomic_compare_and_exchange_bool_acq (&mem, 17, 0)
+      || mem != -1)
+    {
+      puts ("atomic_compare_and_exchange_bool_acq test 4 failed");
+      ret = 1;
+    }
+
   mem = 64;
   if (atomic_exchange (&mem, 31) != 64
       || mem != 31)
@@ -150,7 +182,7 @@ do_test (void)
   if (! atomic_decrement_and_test (&mem)
       || mem != 0)
     {
-      puts ("atomic_decrement_and_test test 1 failed");
+      puts ("atomic_decrement_and_test test 3 failed");
       ret = 1;
     }
 
@@ -202,6 +234,30 @@ do_test (void)
       ret = 1;
     }
 
+  mem = -12;
+  if (atomic_add_negative (&mem, 14)
+      || mem != 2)
+    {
+      puts ("atomic_add_negative test 4 failed");
+      ret = 1;
+    }
+
+  mem = 0;
+  if (! atomic_add_negative (&mem, -1)
+      || mem != -1)
+    {
+      puts ("atomic_add_negative test 5 failed");
+      ret = 1;
+    }
+
+  mem = -31;
+  if (atomic_add_negative (&mem, 31)
+      || mem != 0)
+    {
+      puts ("atomic_add_negative test 6 failed");
+      ret = 1;
+    }
+
   mem = -34;
   if (atomic_add_zero (&mem, 31)
       || mem != -3)
@@ -226,6 +282,30 @@ do_test (void)
       ret = 1;
     }
 
+  mem = -18;
+  if (atomic_add_zero (&mem, 20)
+      || mem != 2)
+    {
+      puts ("atomic_add_zero test 4 failed");
+      ret = 1;
+    }
+
+  mem = 10;
+  if (atomic_add_zero (&mem, -20)
+      || mem != -10)
+    {
+      puts ("atomic_add_zero test 5 failed");
+      ret = 1;
+    }
+
+  mem = 10;
+  if (! atomic_add_zero (&mem, -10)
+      || mem != 0)
+    {
+      puts ("atomic_add_zero test 6 failed");
+      ret = 1;
+    }
+
   mem = 0;
   atomic_bit_set (&mem, 1);
   if (mem != 2)