]> sourceware.org Git - glibc.git/commitdiff
Add a minor 'cas' atomic optimization on sparc.
authorDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 19:27:24 +0000 (11:27 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 19:27:24 +0000 (11:27 -0800)
* sysdeps/sparc/sparc32/sparcv9/bits/atomic.h
(__arch_compare_and_exchange_val_32_acq): Use %g0 as second
argument of CAS if possible.
* sysdeps/sparc/sparc64/bits/atomic.h
(__arch_compare_and_exchange_val_32_acq): Likewise.
(__arch_compare_and_exchange_val_64_acq): Likewise.

ChangeLog
sysdeps/sparc/sparc32/sparcv9/bits/atomic.h
sysdeps/sparc/sparc64/bits/atomic.h

index 418b9320d1b79193df6e3bb56aa33a9950474a45..00f702735e961366c1de904ae92597efb299774f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2013-01-23  David S. Miller  <davem@davemloft.net>
+
+       * sysdeps/sparc/sparc32/sparcv9/bits/atomic.h
+       (__arch_compare_and_exchange_val_32_acq): Use %g0 as second
+       argument of CAS if possible.
+       * sysdeps/sparc/sparc64/bits/atomic.h
+       (__arch_compare_and_exchange_val_32_acq): Likewise.
+       (__arch_compare_and_exchange_val_64_acq): Likewise.
+
 2013-01-23  Pino Toscano  <toscano.pino@tiscali.it>
 
        * sysdeps/unix/sysv/linux/ulimit.c: Moved to ...
index b1a89584f67a181189fb8f00f29f7233fa8716a8..937d7a149f23837a22ad8a0a5d5ca15465fd6c46 100644 (file)
@@ -55,10 +55,16 @@ typedef uintmax_t uatomic_max_t;
 ({                                                                           \
   __typeof (*(mem)) __acev_tmp;                                                      \
   __typeof (mem) __acev_mem = (mem);                                         \
-  __asm __volatile ("cas [%4], %2, %0"                                       \
-                   : "=r" (__acev_tmp), "=m" (*__acev_mem)                   \
-                   : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem),      \
-                     "0" (newval) : "memory");                               \
+  if (__builtin_constant_p (oldval) && (oldval) == 0)                        \
+    __asm __volatile ("cas [%3], %%g0, %0"                                   \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "m" (*__acev_mem), "r" (__acev_mem),                  \
+                       "0" (newval) : "memory");                             \
+  else                                                                       \
+    __asm __volatile ("cas [%4], %2, %0"                                     \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem),    \
+                       "0" (newval) : "memory");                             \
   __acev_tmp; })
 
 /* This can be implemented if needed.  */
index 0afbb4ba5e36703c4c2f5e08b2f6dc453e08fe71..96611de42f13956b835768fbb5e214fb6affc1fd 100644 (file)
@@ -55,20 +55,32 @@ typedef uintmax_t uatomic_max_t;
 ({                                                                           \
   __typeof (*(mem)) __acev_tmp;                                                      \
   __typeof (mem) __acev_mem = (mem);                                         \
-  __asm __volatile ("cas [%4], %2, %0"                                       \
-                   : "=r" (__acev_tmp), "=m" (*__acev_mem)                   \
-                   : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem),      \
-                     "0" (newval) : "memory");                               \
+  if (__builtin_constant_p (oldval) && (oldval) == 0)                        \
+    __asm __volatile ("cas [%3], %%g0, %0"                                   \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "m" (*__acev_mem), "r" (__acev_mem),                  \
+                       "0" (newval) : "memory");                             \
+  else                                                                       \
+    __asm __volatile ("cas [%4], %2, %0"                                     \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "r" (oldval), "m" (*__acev_mem), "r" (__acev_mem),    \
+                       "0" (newval) : "memory");                             \
   __acev_tmp; })
 
 #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
 ({                                                                           \
   __typeof (*(mem)) __acev_tmp;                                                      \
   __typeof (mem) __acev_mem = (mem);                                         \
-  __asm __volatile ("casx [%4], %2, %0"                                              \
-                   : "=r" (__acev_tmp), "=m" (*__acev_mem)                   \
-                   : "r" ((long) (oldval)), "m" (*__acev_mem),               \
-                     "r" (__acev_mem), "0" ((long) (newval)) : "memory");    \
+  if (__builtin_constant_p (oldval) && (oldval) == 0)                        \
+    __asm __volatile ("casx [%3], %%g0, %0"                                  \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "m" (*__acev_mem), "r" (__acev_mem),                  \
+                       "0" ((long) (newval)) : "memory");                    \
+  else                                                                       \
+    __asm __volatile ("casx [%4], %2, %0"                                    \
+                     : "=r" (__acev_tmp), "=m" (*__acev_mem)                 \
+                     : "r" ((long) (oldval)), "m" (*__acev_mem),             \
+                       "r" (__acev_mem), "0" ((long) (newval)) : "memory");  \
   __acev_tmp; })
 
 #define atomic_exchange_acq(mem, newvalue) \
This page took 0.120222 seconds and 5 git commands to generate.