commit fbacab082931842817446a59c09f1c1c0f3ce38e
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Sat Apr 8 14:38:40 2023 +0200

    Prefer atomic variants
    
    They usually provide 64bit support even on architectures which don't
    have native support for them.
    
    This has become necessary with the 64bit event counters.
    
    Fixes #16

diff --git a/configure.ac b/configure.ac
index 020da89bd5..5f21d11367 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1188,6 +1188,8 @@ fi
 AM_CONDITIONAL(STARPU_HAVE_HDF5, test "x$enable_hdf5" = "xyes")
 
 
+AC_CHECK_LIB([atomic], [exit])
+
 # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP
 STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP
 
diff --git a/include/starpu_config.h.in b/include/starpu_config.h.in
index 99c60dc69d..669ad7cc99 100644
--- a/include/starpu_config.h.in
+++ b/include/starpu_config.h.in
@@ -190,8 +190,12 @@
 #undef STARPU_HAVE_SYNC_FETCH_AND_ADD
 #undef STARPU_HAVE_SYNC_FETCH_AND_OR
 #undef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET
-#undef STARPU_HAVE_SYNC_SYNCHRONIZE
+#undef STARPU_HAVE_ATOMIC_COMPARE_EXCHANGE_N
 #undef STARPU_HAVE_ATOMIC_EXCHANGE_N
+#undef STARPU_HAVE_ATOMIC_FETCH_ADD
+#undef STARPU_HAVE_ATOMIC_FETCH_OR
+#undef STARPU_HAVE_ATOMIC_TEST_AND_SET
+#undef STARPU_HAVE_SYNC_SYNCHRONIZE
 
 #undef STARPU_DEVEL
 #undef STARPU_MODEL_DEBUG
diff --git a/include/starpu_util.h b/include/starpu_util.h
index 00508ff379..a35969480f 100644
--- a/include/starpu_util.h
+++ b/include/starpu_util.h
@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2008-2021  Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
+ * Copyright (C) 2008-2021, 2023  Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -619,7 +619,11 @@ static __starpu_inline uint64_t _starpu_xchg64(uint64_t *ptr, uint64_t next)
 	}
 
 /* Returns the new value */
-#ifdef STARPU_HAVE_SYNC_FETCH_AND_ADD
+#ifdef STARPU_HAVE_ATOMIC_FETCH_ADD
+#define STARPU_ATOMIC_ADD(ptr, value)	(__atomic_fetch_add((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#define STARPU_ATOMIC_ADDL(ptr, value)	(__atomic_fetch_add((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#define STARPU_ATOMIC_ADD64(ptr, value)	(__atomic_fetch_add((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#elif defined(STARPU_HAVE_SYNC_FETCH_AND_ADD)
 #define STARPU_ATOMIC_ADD(ptr, value)	(__sync_fetch_and_add((ptr), (value)) + (value))
 #define STARPU_ATOMIC_ADDL(ptr, value)	(__sync_fetch_and_add((ptr), (value)) + (value))
 #define STARPU_ATOMIC_ADD64(ptr, value) (__sync_fetch_and_add((ptr), (value)) + (value))
@@ -638,7 +642,11 @@ STARPU_ATOMIC_SOMETHING64(add, old + value)
 #endif
 #endif
 
-#ifdef STARPU_HAVE_SYNC_FETCH_AND_OR
+#ifdef STARPU_HAVE_ATOMIC_FETCH_OR
+#define STARPU_ATOMIC_OR(ptr, value)	(__atomic_fetch_or((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#define STARPU_ATOMIC_ORL(ptr, value)	(__atomic_fetch_or((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#define STARPU_ATOMIC_OR64(ptr, value)	(__atomic_fetch_or((ptr), (value), __ATOMIC_SEQ_CST) + (value))
+#elif defined(STARPU_HAVE_SYNC_FETCH_AND_OR)
 #define STARPU_ATOMIC_OR(ptr, value)   (__sync_fetch_and_or((ptr), (value)))
 #define STARPU_ATOMIC_ORL(ptr, value)  (__sync_fetch_and_or((ptr), (value)))
 #define STARPU_ATOMIC_OR64(ptr, value) (__sync_fetch_and_or((ptr), (value)))
@@ -660,15 +668,30 @@ STARPU_ATOMIC_SOMETHING64(or, old | value)
 /* Try to replace `old' with `value' at `ptr'. Returns true iff the swap was successful. */
 #ifdef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP
 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value)	(__sync_bool_compare_and_swap((ptr), (old), (value)))
-#define STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value)
-#define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value)
 #else
 #ifdef STARPU_HAVE_CMPXCHG
 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (_starpu_cmpxchg((ptr), (old), (value)) == (old))
 #endif
+#endif
+
+#ifdef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP
+#define STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) (__sync_bool_compare_and_swap((ptr), (old), (value)))
+#else
 #ifdef STARPU_HAVE_CMPXCHG32
 #define STARPU_BOOL_COMPARE_AND_SWAP32(ptr, old, value) (_starpu_cmpxchg32((ptr), (old), (value)) == (old))
 #endif
+#endif
+
+#if defined(STARPU_HAVE_ATOMIC_EXCHANGE_N)
+static __starpu_inline int starpu_bool_compare_and_swap64(uint64_t *ptr, uint64_t old, uint64_t value)
+{
+	uint64_t expected = old;
+	return __atomic_compare_exchange_n(ptr, &expected, value, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+}
+#define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) starpu_bool_compare_and_swap64((ptr), (old), (value))
+#elif defined(STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP)
+#define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) (__sync_bool_compare_and_swap((ptr), (old), (value)))
+#else
 #ifdef STARPU_HAVE_CMPXCHG64
 #define STARPU_BOOL_COMPARE_AND_SWAP64(ptr, old, value) (_starpu_cmpxchg64((ptr), (old), (value)) == (old))
 #endif
@@ -683,15 +706,31 @@ STARPU_ATOMIC_SOMETHING64(or, old | value)
 /* Try to replace `old' with `value' at `ptr'. Returns the value actually seen at `ptr'. */
 #ifdef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP
 #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value)   (__sync_val_compare_and_swap((ptr), (old), (value)))
-#define STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value)
-#define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value)
 #else
 #ifdef STARPU_HAVE_CMPXCHG
 #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (_starpu_cmpxchg((ptr), (old), (value)))
 #endif
+#endif
+
+#ifdef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP
+#define STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) (__sync_val_compare_and_swap((ptr), (old), (value)))
+#else
 #ifdef STARPU_HAVE_CMPXCHG32
 #define STARPU_VAL_COMPARE_AND_SWAP32(ptr, old, value) (_starpu_cmpxchg32((ptr), (old), (value)))
 #endif
+#endif
+
+#ifdef STARPU_HAVE_ATOMIC_EXCHANGE_N
+static __starpu_inline int starpu_val_compare_and_swap64(uint64_t *ptr, uint64_t old, uint64_t value)
+{
+	uint64_t expected = old;
+	__atomic_compare_exchange_n(ptr, &expected, value, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+	return expected;
+}
+#define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) starpu_bool_compare_and_swap64((ptr), (old), (value))
+#elif defined(STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP)
+#define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) (__sync_val_compare_and_swap((ptr), (old), (value)))
+#else
 #ifdef STARPU_HAVE_CMPXCHG64
 #define STARPU_VAL_COMPARE_AND_SWAP64(ptr, old, value) (_starpu_cmpxchg64((ptr), (old), (value)))
 #endif
