Update sysdep/sh/locks.h with atomic builtins
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Jun 2012 22:58:05 +0000 (22:58 +0000)
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 14 Jun 2012 22:58:05 +0000 (22:58 +0000)
* sysdep/sh/locks.h (__cas_lock): Remove.
(__cas_start_atomic, __cas_end_atomic): Likewise.
(compare_and_swap): Call __sync_bool_compare_and_swap.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188640 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/sysdep/sh/locks.h

index e95c659..9f7d38f 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-14  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * sysdep/sh/locks.h (__cas_lock): Remove.
+       (__cas_start_atomic, __cas_end_atomic): Likewise.
+       (compare_and_swap): Call __sync_bool_compare_and_swap.
+
 2012-05-21  Benjamin Kosnik  <bkoz@redhat.com>
 
        PR libstdc++/52700
index 9a152fb..727c3aa 100644 (file)
@@ -14,45 +14,11 @@ details.  */
 typedef size_t obj_addr_t;     /* Integer type big enough for object   */
                                /* address.                             */
 
-static unsigned char __cas_lock = 0;
-
-inline static void
-__cas_start_atomic (void)
-{
-  unsigned int val;
-
-  do
-    __asm__ __volatile__ ("tas.b @%1; movt %0"
-                         : "=r" (val)
-                         : "r" (&__cas_lock)
-                         : "memory");
-  while (val == 0);
-}
-
-inline static void
-__cas_end_atomic (void)
-{
-  __asm__ __volatile__ (" " : : : "memory");
-  __cas_lock = 0;
-}
-
 inline static bool
 compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old,
                  obj_addr_t new_val)
 {
-  bool ret;
-
-  __cas_start_atomic ();
-  if (*addr != old)
-    ret = false;
-  else
-    {
-      *addr = new_val;
-      ret = true;
-    }
-  __cas_end_atomic ();
-
-  return ret;
+  return __sync_bool_compare_and_swap (addr, old, new_val);
 }
 
 inline static void