diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2016-08-19 01:05:39 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2016-08-19 01:09:03 +0300 |
commit | 48205b221a6df0244338436825b193b8e869ef29 (patch) | |
tree | 9c36f5b0c7f7cb62b15f42927625cba555877e90 | |
parent | e22ab43457f837d06a46ba1affcd4881b49cb6d7 (diff) | |
download | libatomic_ops-48205b221a6df0244338436825b193b8e869ef29.tar.gz |
Avoid extra nop_full in stack_pop_acquire if atomic intrinsics used (x86)
* src/atomic_ops/generalize.h [AO_HAVE_double_compare_and_swap_acquire]
(AO_compare_double_and_swap_double_acquire): Implement (by redirecting
to AO_double_compare_and_swap_acquire).
* src/atomic_ops/generalize.h [AO_HAVE_double_compare_and_swap_release]
(AO_compare_double_and_swap_double_release): Implement (by redirecting
to AO_double_compare_and_swap_release).
-rw-r--r-- | src/atomic_ops/generalize.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/atomic_ops/generalize.h b/src/atomic_ops/generalize.h index 3e66341..317c5e7 100644 --- a/src/atomic_ops/generalize.h +++ b/src/atomic_ops/generalize.h @@ -323,6 +323,40 @@ } # define AO_HAVE_compare_double_and_swap_double # endif +# if defined(AO_HAVE_double_compare_and_swap_acquire) \ + && !defined(AO_HAVE_compare_double_and_swap_double_acquire) + AO_INLINE int + AO_compare_double_and_swap_double_acquire(volatile AO_double_t *addr, + AO_t old_val1, AO_t old_val2, + AO_t new_val1, AO_t new_val2) + { + AO_double_t old_w; + AO_double_t new_w; + old_w.AO_val1 = old_val1; + old_w.AO_val2 = old_val2; + new_w.AO_val1 = new_val1; + new_w.AO_val2 = new_val2; + return AO_double_compare_and_swap_acquire(addr, old_w, new_w); + } +# define AO_HAVE_compare_double_and_swap_double_acquire +# endif +# if defined(AO_HAVE_double_compare_and_swap_release) \ + && !defined(AO_HAVE_compare_double_and_swap_double_release) + AO_INLINE int + AO_compare_double_and_swap_double_release(volatile AO_double_t *addr, + AO_t old_val1, AO_t old_val2, + AO_t new_val1, AO_t new_val2) + { + AO_double_t old_w; + AO_double_t new_w; + old_w.AO_val1 = old_val1; + old_w.AO_val2 = old_val2; + new_w.AO_val1 = new_val1; + new_w.AO_val2 = new_val2; + return AO_double_compare_and_swap_release(addr, old_w, new_w); + } +# define AO_HAVE_compare_double_and_swap_double_release +# endif # if defined(AO_HAVE_double_compare_and_swap_full) \ && !defined(AO_HAVE_compare_double_and_swap_double_full) AO_INLINE int |