Blame confdb/aclocal_atomic.m4

Packit 0848f5
dnl /*D PAC_C_MEMATOMIC - Try and determine how to implement memory-atomic
Packit 0848f5
dnl   operations with the selected C compiler
Packit 0848f5
dnl
Packit 0848f5
dnl Synopsis:
Packit 0848f5
dnl PAC_C_MEMATOMIC
Packit 0848f5
dnl
Packit 0848f5
dnl Notes:
Packit 0848f5
dnl Defines names of the following form
Packit 0848f5
dnl + HAVE_GCC_ASM_AND_X86_{MFENCE,LFENCE,SFENCE} - gcc __asm__ will issue
Packit 0848f5
dnl    mfence, lfence, or sfence
Packit 0848f5
dnl . HAVE___ASM_AND_X86_{MFENCE,LFENCE,SFENCE} - __asm _emit will issue
Packit 0848f5
dnl    mfence, lfence, or sfence
Packit 0848f5
dnl . HAVE_ASM_AND_X86_{MFENCE,LFENCE,SFENCE} - asm("...") will issue
Packit 0848f5
dnl    mfence, lfence, or sfence
Packit 0848f5
dnl . HAVE__INTERLOCKEDEXCHANGE - _InterlockedExchange intrinsic is available
Packit 0848f5
dnl    (IA64)
Packit 0848f5
dnl . HAVE_GCC_ASM_SPARC_MEMBAR - gcc __asm__ will issue SPARC architecture
Packit 0848f5
dnl    memory barrier instruction
Packit 0848f5
dnl . HAVE_SOLARIS_ASM_SPARC_MEMBAR - Solaris asm() will issue SPARC 
Packit 0848f5
dnl    architecture memory barrier instruction
Packit 0848f5
dnl . HAVE_GCC_ASM_SPARC_STBAR - gcc __asm__ will issue stbar
Packit 0848f5
dnl - HAVE_SOLARIS_ASM_SPARC_STBAR - Solaris __asm() will issue stbar
Packit 0848f5
dnl 
Packit 0848f5
dnl D*/
Packit 0848f5
AC_DEFUN([PAC_C_MEMATOMIC],[
Packit 0848f5
AC_CACHE_CHECK([for x86 mfence instruction using __asm__],
Packit 0848f5
    pac_cv_have_gcc_asm_and_x86_mfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm__ __volatile__  ( ".byte 0x0f, 0xae, 0xf0" ::: "memory" );
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_gcc_asm_and_x86_mfence=yes,pac_cv_have_gcc_asm_and_x86_mfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_gcc_asm_and_x86_mfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_GCC_ASM_AND_X86_MFENCE, 1, [Define if using gcc on a x86 system with the mfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 sfence instruction using __asm__],
Packit 0848f5
    pac_cv_have_gcc_asm_and_x86_sfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm__ __volatile__  ( ".byte 0x0f, 0xae, 0xf8" ::: "memory" );
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_gcc_asm_and_x86_sfence=yes,pac_cv_have_gcc_asm_and_x86_sfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_gcc_asm_and_x86_sfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_GCC_ASM_AND_X86_SFENCE, 1, [Define if using gcc on a x86 system with the sfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 lfence instruction using __asm__],
Packit 0848f5
    pac_cv_have_gcc_asm_and_x86_lfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm__ __volatile__  ( ".byte 0x0f, 0xae, 0xe8" ::: "memory" );
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_gcc_asm_and_x86_lfence=yes,pac_cv_have_gcc_asm_and_x86_lfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_gcc_asm_and_x86_lfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_GCC_ASM_AND_X86_LFENCE, 1, [Define if using gcc on a x86 system with the lfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
dnl Some compilers, like icc, may want __asm _emit
Packit 0848f5
AC_CACHE_CHECK([for x86 mfence instruction using __asm],
Packit 0848f5
     pac_cv_have___asm_and_x86_mfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm _emit 0x0f __asm _emit 0xae __asm _emit 0xf0 ;
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have___asm_and_x86_mfence=yes,pac_cv_have___asm_and_x86_mfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have___asm_and_x86_mfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE___ASM_AND_X86_MFENCE, 1, [Define if using __asm on a x86 system with the mfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 sfence instruction using __asm],
Packit 0848f5
    pac_cv_have___asm_and_x86_sfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm sfence ;
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have___asm_and_x86_sfence=yes,pac_cv_have___asm_and_x86_sfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have___asm_and_x86_sfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE___ASM_AND_X86_SFENCE, 1, [Define if using __asm on a x86 system with the sfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 lfence instruction using __asm],
Packit 0848f5
    pac_cv_have___asm_and_x86_lfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    __asm _emit 0x0f __asm _emit 0xae __asm _emit 0xe8 ;
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have___asm_and_x86_lfence=yes,pac_cv_have___asm_and_x86_lfence=no)])
Packit 0848f5
Packit 0848f5
if test "$lac_cv_have___asm_and_x86_lfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE___ASM_AND_X86_LFENCE, 1, [Define if using __asm on a x86 system with the lfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
dnl 
Packit 0848f5
dnl Some compilers, such as pgcc, may require additional arguments.
Packit 0848f5
dnl pgcc may need -Masmkeyword flag.  We may want to try this with and 
Packit 0848f5
dnl without adding -Masmkeyword to CFLAGS
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 mfence instruction using asm()],
Packit 0848f5
    pac_cv_have_asm_and_x86_mfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    asm("_emit 0x0f __asm _emit 0xae __asm _emit 0xf0");
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_asm_and_x86_mfence=yes,pac_cv_have_asm_and_x86_mfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_asm_and_x86_mfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_ASM_AND_X86_MFENCE, 1, [Define if using asm() on a x86 system with the mfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 sfence instruction using asm()],
Packit 0848f5
    pac_cv_have_asm_and_x86_sfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    asm("sfence");
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_asm_and_x86_sfence=yes,pac_cv_have_asm_and_x86_sfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_asm_and_x86_sfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_ASM_AND_X86_SFENCE, 1, [Define if using asm() on a x86 system with the sfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for x86 lfence instruction using asm()],
Packit 0848f5
    pac_cv_have_asm_and_x86_lfence,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    asm("_emit 0x0f __asm _emit 0xae __asm _emit 0xe8");
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have_asm_and_x86_lfence=yes,pac_cv_have_asm_and_x86_lfence=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have_asm_and_x86_lfence" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE_ASM_AND_X86_LFENCE, 1, [Define if using asm() on a x86 system with the lfence instruction])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for _InterlockedExchange intrinsic],
Packit 0848f5
    pac_cv_have__InterlockedExchange,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv)
Packit 0848f5
{
Packit 0848f5
    unsigned long lock, *lock_ptr;
Packit 0848f5
    lock_ptr = &loc;;
Packit 0848f5
    _InterlockedExchange(lock_ptr, 1);
Packit 0848f5
    exit(0);
Packit 0848f5
}
Packit 0848f5
],
Packit 0848f5
pac_cv_have__InterlockedExchange=yes,pac_cv_have__InterlockedExchange=no)])
Packit 0848f5
Packit 0848f5
if test "$pac_cv_have__InterlockedExchange" = "yes" ; then
Packit 0848f5
    AC_DEFINE(HAVE__INTERLOCKEDEXCHANGE, 1, [Define if _InterlockedExchange intrinsic is available])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for SPARC membar instruction with gcc],
Packit 0848f5
    pac_cv_gcc_sparc_membar,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv){
Packit 0848f5
    __asm__ __volatile__ ( "membar #StoreLoad | #StoreStore" : : : "memory" );
Packit 0848f5
    exit(0);
Packit 0848f5
}],pac_cv_gcc_sparc_membar=yes,pac_cv_gcc_sparc_membar=no)])
Packit 0848f5
if test "$pac_cv_gcc_sparc_membar" = yes ; then
Packit 0848f5
    AC_DEFINE(HAVE_GCC_ASM_SPARC_MEMBAR,1,[Define if gcc asm membar supported])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for SPARC membar instruction with Solaris C],
Packit 0848f5
    pac_cv_solaris_sparc_membar,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv){
Packit 0848f5
    __asm ( "membar #StoreLoad | #StoreStore");
Packit 0848f5
    exit(0);
Packit 0848f5
}],pac_cv_solaris_sparc_membar=yes,pac_cv_solaris_sparc_membar=no)])
Packit 0848f5
if test "$pac_cv_solaris_sparc_membar" = yes ; then
Packit 0848f5
    AC_DEFINE(HAVE_SOLARIS_ASM_SPARC_MEMBAR,1,[Define if solaris asm membar supported])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for SPARC stbar instruction with gcc],
Packit 0848f5
    pac_cv_gcc_sparc_stbar,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv){
Packit 0848f5
    __asm__ __volatile__ ( "stbar" : : : "memory" );
Packit 0848f5
    exit(0);
Packit 0848f5
}],pac_cv_gcc_sparc_stbar=yes,pac_cv_gcc_sparc_stbar=no)])
Packit 0848f5
if test "$pac_cv_gcc_sparc_stbar" = yes ; then
Packit 0848f5
    AC_DEFINE(HAVE_GCC_ASM_SPARC_STBAR,1,[Define if gcc asm stbar supported])
Packit 0848f5
fi
Packit 0848f5
Packit 0848f5
AC_CACHE_CHECK([for SPARC stbar instruction with Solaris C],
Packit 0848f5
    pac_cv_solaris_sparc_stbar,[
Packit 0848f5
AC_TRY_RUN([
Packit 0848f5
int main(int argc, char **argv){
Packit 0848f5
    __asm ( "stbar" );
Packit 0848f5
    exit(0);
Packit 0848f5
}],pac_cv_solaris_sparc_stbar=yes,pac_cv_solaris_sparc_stbar=no)])
Packit 0848f5
if test "$pac_cv_solaris_sparc_stbar" = yes ; then
Packit 0848f5
    AC_DEFINE(HAVE_SOLARIS_ASM_SPARC_STBAR,1,[Define if solaris asm stbar supported])
Packit 0848f5
fi
Packit 0848f5
])