public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
From: Dinar Temirbulatov <dtemirbulatov@gmail.com>
To: libc-ports@sourceware.org
Cc: joseph@codesourcery.com, adeb@nvidia.com
Subject: Re: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
Date: Sun, 01 Sep 2013 20:43:00 -0000	[thread overview]
Message-ID: <CAMnfPmMADb=ZqSmC4J6=fMpQp56uGG8v9MKRj_Ly94kcXEtNZA@mail.gmail.com> (raw)

[-- 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

             reply	other threads:[~2013-09-01 20:43 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-01 20:43 Dinar Temirbulatov [this message]
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
  -- strict thread matches above, loose matches on Subject: below --
2013-09-01 20:42 Dinar Temirbulatov
2013-08-13 17:11 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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAMnfPmMADb=ZqSmC4J6=fMpQp56uGG8v9MKRj_Ly94kcXEtNZA@mail.gmail.com' \
    --to=dtemirbulatov@gmail.com \
    --cc=adeb@nvidia.com \
    --cc=joseph@codesourcery.com \
    --cc=libc-ports@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).