You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.0 KiB
83 lines
2.0 KiB
dnl Check for the __sync_add_and_fetch() and __sync_sub_and_fetch()
|
|
dnl compiler built-ins.
|
|
|
|
AC_DEFUN([AX__SYNC],
|
|
[
|
|
AH_TEMPLATE([HAVE___SYNC_ADD_AND_FETCH],
|
|
[Defined if the compiler provides __sync_add_and_fetch().])
|
|
|
|
AC_CACHE_CHECK([for __sync_add_and_fetch], [ac_cv___sync_add_and_fetch],
|
|
[
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[[
|
|
#include <stdlib.h>
|
|
]],
|
|
[[
|
|
volatile int x = 1;
|
|
volatile int y = __sync_add_and_fetch (&x, 1);
|
|
if (x != 2 || y != 2)
|
|
abort ();
|
|
]])],
|
|
[ac_cv___sync_add_and_fetch=yes],
|
|
[ac_cv___sync_add_and_fetch=no])
|
|
])
|
|
|
|
AS_IF([test "x$ac_cv___sync_add_and_fetch" = "xyes"],
|
|
[AC_DEFINE([HAVE___SYNC_ADD_AND_FETCH], [1])])
|
|
|
|
AH_TEMPLATE([HAVE___SYNC_SUB_AND_FETCH],
|
|
[Defined if the compiler provides __sync_sub_and_fetch().])
|
|
|
|
AC_CACHE_CHECK([for __sync_sub_and_fetch], [ac_cv___sync_sub_and_fetch],
|
|
[
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[[
|
|
#include <stdlib.h>
|
|
]],
|
|
[[
|
|
volatile int x = 2;
|
|
volatile int y = __sync_sub_and_fetch (&x, 1);
|
|
if (x != 1 || y != 1)
|
|
abort ();
|
|
]])],
|
|
[ac_cv___sync_sub_and_fetch=yes],
|
|
[ac_cv___sync_sub_and_fetch=no])
|
|
])
|
|
|
|
AS_IF([test "x$ac_cv___sync_sub_and_fetch" = "xyes"],
|
|
[AC_DEFINE([HAVE___SYNC_SUB_AND_FETCH], [1])])
|
|
|
|
AH_TEMPLATE([HAVE_CXX11_ATOMICS], [Defined if the compiler provides
|
|
C++11 <atomic> header and increment, decrement operations.])
|
|
|
|
AC_CACHE_CHECK([for C++11 atomics], [ac_cv_cxx11_atomics],
|
|
[
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM(
|
|
[[
|
|
#include <atomic>
|
|
]],
|
|
[[
|
|
#define TEST_ATOMIC(type) do { \
|
|
std::atomic<type> x (0); \
|
|
std::atomic_fetch_add_explicit (&x, static_cast<type>(1), std::memory_order_acquire); \
|
|
std::atomic_fetch_sub_explicit (&x, static_cast<type>(1), std::memory_order_release); \
|
|
} while (0)
|
|
|
|
TEST_ATOMIC(int);
|
|
TEST_ATOMIC(unsigned int);
|
|
TEST_ATOMIC(long);
|
|
TEST_ATOMIC(unsigned long);
|
|
std::atomic_thread_fence (std::memory_order_acquire);
|
|
]])],
|
|
[ac_cv_cxx11_atomics=yes],
|
|
[ac_cv_cxx11_atomics=no])
|
|
])
|
|
|
|
AS_IF([test "x$ac_cv_cxx11_atomics" = "xyes"],
|
|
[AC_DEFINE([HAVE_CXX11_ATOMICS], [1])])
|
|
|
|
])
|
|
|