public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
* [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
@ 2013-08-13 17:11 Dinar Temirbulatov
  2013-08-15 21:46 ` Abhishek Deb
  2013-08-18 20:29 ` Joseph S. Myers
  0 siblings, 2 replies; 21+ messages in thread
From: Dinar Temirbulatov @ 2013-08-13 17:11 UTC (permalink / raw)
  To: libc-ports; +Cc: joseph, adeb

[-- Attachment #1: Type: text/plain, Size: 457 bytes --]

Hello,
Following patch redefines atomic_exchange_acq/atomic_exchange_rel to
__atomic_exchange_n for ARM, that allows for example to reduce number
of instruction sequence for lll_unlock
from:
ldex, cmp, bne, stex, cmp, bne
to
ldex, stex, cmp, bne
, more on the issue here:
http://sourceware.org/bugzilla/show_bug.cgi?id=15640

This patch was tested on ARM a9 with glibc testsuite with no new
regressions. OK to commit?

                       Thanks, Dinar.

[-- Attachment #2: arm_atomic.patch --]
[-- Type: application/octet-stream, Size: 1131 bytes --]

diff --git a/ports/sysdeps/arm/bits/atomic.h b/ports/sysdeps/arm/bits/atomic.h
index 6e20df7..78d4a6e 100644
--- a/ports/sysdeps/arm/bits/atomic.h
+++ b/ports/sysdeps/arm/bits/atomic.h
@@ -79,3 +79,26 @@ void __arm_link_error (void);
 # define __arm_assisted_compare_and_exchange_val_32_acq(mem, newval, oldval) \
   ({ __arm_link_error (); oldval; })
 #endif
+
+#if __GNUC_PREREQ (4, 7)
+# define atomic_exchange_acq(mem, value)                                \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE)
+
+# define atomic_exchange_rel(mem, value)                                \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE)
+
+/* Atomic exchange (without compare).  */
+
+# define __arch_exchange_8_int(mem, newval, model)      \
+  (abort (), (typeof(*mem)) 0)
+
+# define __arch_exchange_16_int(mem, newval, model)     \
+  (abort (), (typeof(*mem)) 0)
+
+# define __arch_exchange_32_int(mem, newval, model)     \
+  __atomic_exchange_n (mem, newval, model)
+
+# define __arch_exchange_64_int(mem, newval, model)     \
+  (abort (), (typeof(*mem)) 0)
+
+#endif

^ permalink raw reply	[flat|nested] 21+ messages in thread
* Re: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
@ 2013-09-01 20:42 Dinar Temirbulatov
  0 siblings, 0 replies; 21+ messages in thread
From: Dinar Temirbulatov @ 2013-09-01 20:42 UTC (permalink / raw)
  To: libc-ports; +Cc: joseph, adeb, Maxim Kuvyrkov

Hi,
Another version of change, I added
atomic_compare_and_exchange_val_acq/atomic_compare_and_exchange_val_rel
and atomic_compare_and_exchange_bool_acq/atomic_compare_and_exchange_boot_rel
defenitions and also for gcc-4.7 and higher in the case of unsupported
atomic compare and swap operation, it uses the kernel helper inlines.
Tested on arm a9 with no new regressions. Ok to commit?
                    thanks, Dinar.

^ permalink raw reply	[flat|nested] 21+ messages in thread
* Re: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
@ 2013-09-01 20:43 Dinar Temirbulatov
  2013-09-02 15:08 ` Joseph S. Myers
  0 siblings, 1 reply; 21+ messages in thread
From: Dinar Temirbulatov @ 2013-09-01 20:43 UTC (permalink / raw)
  To: libc-ports; +Cc: joseph, adeb

[-- Attachment #1: Type: text/plain, Size: 475 bytes --]

Hi,
Another version of change, I added
atomic_compare_and_exchange_val_acq/atomic_compare_and_exchange_val_rel
and atomic_compare_and_exchange_bool_acq/atomic_compare_and_exchange_boot_rel
defenitions and also for gcc-4.7 and higher in the case of unsupported
atomic compare and swap operation, it uses the kernel helper inlines.
Tested on arm a9 with no new regressions. Ok to commit?
Oh, sorry. I missed to attach the change. Here it is.
                    thanks, Dinar.

[-- Attachment #2: arm_atomic.patch --]
[-- Type: application/octet-stream, Size: 4864 bytes --]

--- glibc-orig/ports/sysdeps/arm/bits/atomic.h	2013-08-19 21:46:44.592731210 +0400
+++ glibc/ports/sysdeps/arm/bits/atomic.h	2013-09-01 07:03:05.691924824 +0400
@@ -51,6 +51,113 @@ void __arm_link_error (void);
 # define __arm_assisted_full_barrier()  __arm_link_error()
 #endif
 
+#if __GNUC_PREREQ (4, 7)
+
+#ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+
+#define atomic_exchange_acq(mem, value)                                \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_rel(mem, value)                                \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE)
+
+/* Atomic exchange (without compare).  */
+
+#define __arch_exchange_8_int(mem, newval, model)      \
+  (abort (), (typeof(*mem)) 0)
+
+#define __arch_exchange_16_int(mem, newval, model)     \
+  (abort (), (typeof(*mem)) 0)
+
+#define __arch_exchange_32_int(mem, newval, model)     \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_64_int(mem, newval, model)     \
+  (abort (), (typeof(*mem)) 0)
+
+/* Compare and exchange with "acquire" semantics, ie barrier after.  */
+
+# define atomic_compare_and_exchange_bool_acq(mem, new, old)    \
+  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int,  \
+                        mem, new, old, __ATOMIC_ACQUIRE)
+
+# define atomic_compare_and_exchange_val_acq(mem, new, old)     \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int,    \
+                       mem, new, old, __ATOMIC_ACQUIRE)
+
+/* Compare and exchange with "release" semantics, ie barrier before.  */
+
+# define atomic_compare_and_exchange_bool_rel(mem, new, old)    \
+  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int,  \
+                        mem, new, old, __ATOMIC_RELEASE)
+
+# define atomic_compare_and_exchange_val_rel(mem, new, old)      \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int,    \
+                       mem, new, old, __ATOMIC_RELEASE)
+
+/* Compare and exchange.
+   For all "bool" routines, we return FALSE if exchange succesful.  */
+
+# define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \
+  (abort (), 0)
+
+# define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \
+  (abort (), 0)
+
+# define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \
+  ({                                                                    \
+    typeof (*mem) __oldval = (oldval);                                  \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,   \
+                                  model, __ATOMIC_RELAXED);             \
+  })
+
+# define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \
+  (abort (), 0)
+
+# define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \
+  (abort (), (typeof(*mem)) 0)
+
+# define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \
+  (abort (), (typeof(*mem)) 0)
+
+# define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \
+  ({                                                                    \
+    typeof (*mem) __oldval = (oldval);                                  \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,    \
+                                 model, __ATOMIC_RELAXED);              \
+    __oldval;                                                           \
+  })
+
+# define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \
+  (abort (), (typeof(*mem)) 0)
+
+#else
+
+# define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
+  __arm_assisted_compare_and_exchange_val_32_acq ((mem), (newval), (oldval))
+
+/* We don't support atomic operations on any non-word types.
+   So make them link errors.  */
+#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
+  ({ __arm_link_error (); oldval; })
+
+#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
+  ({ __arm_link_error (); oldval; })
+
+#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
+  ({ __arm_link_error (); oldval; })
+
+/* An OS-specific bits/atomic.h file will define this macro if
+   the OS can provide something.  If not, we'll fail to build
+   with a compiler that doesn't supply the operation.  */
+#ifndef __arm_assisted_compare_and_exchange_val_32_acq
+# define __arm_assisted_compare_and_exchange_val_32_acq(mem, newval, oldval) \
+  ({ __arm_link_error (); oldval; })
+#endif
+
+#endif
+#else /* !__GNUC_PREREQ (4, 7) */
+
 /* Atomic compare and exchange.  */
 
 #ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
@@ -79,3 +186,5 @@ void __arm_link_error (void);
 # define __arm_assisted_compare_and_exchange_val_32_acq(mem, newval, oldval) \
   ({ __arm_link_error (); oldval; })
 #endif
+
+#endif

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2013-09-19 16:29 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-13 17:11 [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n Dinar Temirbulatov
2013-08-15 21:46 ` Abhishek Deb
2013-08-16 22:57   ` Dinar Temirbulatov
2013-08-17  2:42     ` Abhishek Deb
2013-08-19 19:21       ` Dinar Temirbulatov
2013-08-18 20:29 ` Joseph S. Myers
2013-09-01 20:42 Dinar Temirbulatov
2013-09-01 20:43 Dinar Temirbulatov
2013-09-02 15:08 ` Joseph S. Myers
2013-09-03 17:31   ` Abhishek Deb
2013-09-05 12:56   ` Dinar Temirbulatov
2013-09-05 15:48     ` Joseph S. Myers
2013-09-05 17:09       ` Abhishek Deb
2013-09-11 19:25         ` Dinar Temirbulatov
2013-09-11 19:27         ` Dinar Temirbulatov
2013-09-11 20:40           ` Abhishek Deb
2013-09-13 17:14           ` Joseph S. Myers
2013-09-14  3:29             ` Dinar Temirbulatov
2013-09-18 17:16               ` Joseph S. Myers
2013-09-19  6:53                 ` Maxim Kuvyrkov
2013-09-19 16:29                   ` Joseph S. Myers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).