atomic_ops/sysdeps/gcc/arm.h \
atomic_ops/sysdeps/gcc/avr32.h \
atomic_ops/sysdeps/gcc/cris.h \
+ atomic_ops/sysdeps/gcc/generic-arithm.h \
+ atomic_ops/sysdeps/gcc/generic-small.h \
atomic_ops/sysdeps/gcc/generic.h \
atomic_ops/sysdeps/gcc/hexagon.h \
atomic_ops/sysdeps/gcc/hppa.h \
--- /dev/null
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+AO_INLINE AO_t
+AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_fetch_and_add
+
+AO_INLINE AO_t
+AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_fetch_and_add_acquire
+
+AO_INLINE AO_t
+AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_fetch_and_add_release
+
+AO_INLINE AO_t
+AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
+{
+ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_fetch_and_add_full
+
+AO_INLINE void
+AO_and(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_and
+
+AO_INLINE void
+AO_and_acquire(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_and_acquire
+
+AO_INLINE void
+AO_and_release(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_and_release
+
+AO_INLINE void
+AO_and_full(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_and_full
+
+AO_INLINE void
+AO_or(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_or
+
+AO_INLINE void
+AO_or_acquire(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_or_acquire
+
+AO_INLINE void
+AO_or_release(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_or_release
+
+AO_INLINE void
+AO_or_full(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_or_full
+
+AO_INLINE void
+AO_xor(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_xor
+
+AO_INLINE void
+AO_xor_acquire(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_xor_acquire
+
+AO_INLINE void
+AO_xor_release(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_xor_release
+
+AO_INLINE void
+AO_xor_full(volatile AO_t *addr, AO_t value)
+{
+ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
+}
+#define AO_HAVE_xor_full
+
+/* TODO: Add AO_char/short/int_ primitives (via template header). */
--- /dev/null
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P.
+ *
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+AO_INLINE AO_t
+AO_load(const volatile AO_t *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_load
+
+AO_INLINE AO_t
+AO_load_acquire(const volatile AO_t *addr)
+{
+ return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
+}
+#define AO_HAVE_load_acquire
+
+/* AO_load_full is generalized using AO_load and AO_nop_full, so that */
+/* AO_load_read is defined using AO_load and AO_nop_read. */
+
+AO_INLINE void
+AO_store(volatile AO_t *addr, AO_t value)
+{
+ __atomic_store_n(addr, value, __ATOMIC_RELAXED);
+}
+#define AO_HAVE_store
+
+AO_INLINE void
+AO_store_release(volatile AO_t *addr, AO_t value)
+{
+ __atomic_store_n(addr, value, __ATOMIC_RELEASE);
+}
+#define AO_HAVE_store_release
+
+/* AO_store_full definition is omitted similar to AO_load_full reason. */
+
+AO_INLINE AO_t
+AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+{
+ return __sync_val_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+}
+#define AO_HAVE_fetch_compare_and_swap
+
+/* TODO: Add CAS _acquire/release/full primitives. */
+
+#ifndef AO_GENERALIZE_ASM_BOOL_CAS
+ AO_INLINE int
+ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
+ {
+ return __sync_bool_compare_and_swap(addr, old_val, new_val
+ /* empty protection list */);
+ }
+# define AO_HAVE_compare_and_swap
+#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
+
+/* TODO: Add AO_char/short/int_ primitives (via template header). */
# define AO_HAVE_nop_full
#endif /* !AO_UNIPROCESSOR */
-AO_INLINE AO_t
-AO_load(const volatile AO_t *addr)
-{
- return __atomic_load_n(addr, __ATOMIC_RELAXED);
-}
-#define AO_HAVE_load
-
-AO_INLINE AO_t
-AO_load_acquire(const volatile AO_t *addr)
-{
- return __atomic_load_n(addr, __ATOMIC_ACQUIRE);
-}
-#define AO_HAVE_load_acquire
-
-/* AO_load_full is generalized using AO_load and AO_nop_full, so that */
-/* AO_load_read is defined using AO_load and AO_nop_read. */
-
-AO_INLINE void
-AO_store(volatile AO_t *addr, AO_t value)
-{
- __atomic_store_n(addr, value, __ATOMIC_RELAXED);
-}
-#define AO_HAVE_store
-
-AO_INLINE void
-AO_store_release(volatile AO_t *addr, AO_t value)
-{
- __atomic_store_n(addr, value, __ATOMIC_RELEASE);
-}
-#define AO_HAVE_store_release
-
-/* AO_store_full definition is omitted similar to AO_load_full reason. */
+#include "generic-small.h"
#ifndef AO_PREFER_GENERALIZED
+# include "generic-arithm.h"
+
AO_INLINE AO_TS_VAL_t
AO_test_and_set(volatile AO_TS_t *addr)
{
return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_SEQ_CST);
}
# define AO_HAVE_test_and_set_full
-
- AO_INLINE AO_t
- AO_fetch_and_add(volatile AO_t *addr, AO_t incr)
- {
- return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED);
- }
-# define AO_HAVE_fetch_and_add
-
- AO_INLINE AO_t
- AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr)
- {
- return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE);
- }
-# define AO_HAVE_fetch_and_add_acquire
-
- AO_INLINE AO_t
- AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr)
- {
- return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE);
- }
-# define AO_HAVE_fetch_and_add_release
-
- AO_INLINE AO_t
- AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr)
- {
- return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST);
- }
-# define AO_HAVE_fetch_and_add_full
-
- AO_INLINE void
- AO_and(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED);
- }
-# define AO_HAVE_and
-
- AO_INLINE void
- AO_and_acquire(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE);
- }
-# define AO_HAVE_and_acquire
-
- AO_INLINE void
- AO_and_release(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE);
- }
-# define AO_HAVE_and_release
-
- AO_INLINE void
- AO_and_full(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST);
- }
-# define AO_HAVE_and_full
-
- AO_INLINE void
- AO_or(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED);
- }
-# define AO_HAVE_or
-
- AO_INLINE void
- AO_or_acquire(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE);
- }
-# define AO_HAVE_or_acquire
-
- AO_INLINE void
- AO_or_release(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE);
- }
-# define AO_HAVE_or_release
-
- AO_INLINE void
- AO_or_full(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST);
- }
-# define AO_HAVE_or_full
-
- AO_INLINE void
- AO_xor(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED);
- }
-# define AO_HAVE_xor
-
- AO_INLINE void
- AO_xor_acquire(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE);
- }
-# define AO_HAVE_xor_acquire
-
- AO_INLINE void
- AO_xor_release(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE);
- }
-# define AO_HAVE_xor_release
-
- AO_INLINE void
- AO_xor_full(volatile AO_t *addr, AO_t value)
- {
- (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST);
- }
-# define AO_HAVE_xor_full
#endif /* !AO_PREFER_GENERALIZED */
-/* CAS primitives */
-AO_INLINE AO_t
-AO_fetch_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
-{
- return __sync_val_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
-}
-#define AO_HAVE_fetch_compare_and_swap
-
-/* TODO: Add CAS _acquire/release/full primitives. */
-
-#ifndef AO_GENERALIZE_ASM_BOOL_CAS
- AO_INLINE int
- AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
- {
- return __sync_bool_compare_and_swap(addr, old_val, new_val
- /* empty protection list */);
- }
-# define AO_HAVE_compare_and_swap
-#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */
-
-/* TODO: Add AO_char/short/int_ primitives (via template header). */
-
#ifdef AO_HAVE_DOUBLE_PTR_STORAGE
-
AO_INLINE AO_double_t
AO_double_load(const volatile AO_double_t *addr)
{