Commit 430616e7 by Richard Henderson Committed by Richard Henderson

libitm: Work around assembler missing AVX insns.

From-SVN: r181246
parent 41582ffe
2011-11-09 Richard Henderson <rth@redhat.com> 2011-11-09 Richard Henderson <rth@redhat.com>
* acinclude.m4 (LIBITM_CHECK_AS_AVX): New.
* configure.ac: Use it.
* config.h.in, configure: Rebuild.
* config/x86/x86_avx.cc: Handle !HAVE_AS_AVX.
2011-11-09 Richard Henderson <rth@redhat.com>
* barrier.tpl, memcpy.cc, memset.cc, method-wbetl.cc: Remove file. * barrier.tpl, memcpy.cc, memset.cc, method-wbetl.cc: Remove file.
* config/alpha/unaligned.h: Remove file. * config/alpha/unaligned.h: Remove file.
* config/generic/unaligned.h: Remove file. * config/generic/unaligned.h: Remove file.
......
...@@ -95,6 +95,20 @@ AC_DEFUN([LIBITM_CHECK_SIZE_T_MANGLING], [ ...@@ -95,6 +95,20 @@ AC_DEFUN([LIBITM_CHECK_SIZE_T_MANGLING], [
[Define to the letter to which size_t is mangled.]) [Define to the letter to which size_t is mangled.])
]) ])
dnl Check if as supports AVX instructions.
AC_DEFUN([LIBITM_CHECK_AS_AVX], [
case "${target_cpu}" in
i[3456]86 | x86_64)
AC_CACHE_CHECK([if the assembler supports AVX], libitm_cv_as_avx, [
AC_TRY_COMPILE([], [asm("vzeroupper");],
[libitm_cv_as_avx=yes], [libitm_cv_as_avx=no])
])
if test x$libitm_cv_as_avx = xyes; then
AC_DEFINE(HAVE_AS_AVX, 1, [Define to 1 if the assembler supports AVX.])
fi
;;
esac])
sinclude(../libtool.m4) sinclude(../libtool.m4)
dnl The lines below arrange for aclocal not to bring an installed dnl The lines below arrange for aclocal not to bring an installed
dnl libtool.m4 into aclocal.m4, while still arranging for automake to dnl libtool.m4 into aclocal.m4, while still arranging for automake to
......
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
/* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */ /* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */
#undef HAVE_64BIT_SYNC_BUILTINS #undef HAVE_64BIT_SYNC_BUILTINS
/* Define to 1 if the assembler supports AVX. */
#undef HAVE_AS_AVX
/* Define if your assembler supports .cfi_* directives. */ /* Define if your assembler supports .cfi_* directives. */
#undef HAVE_AS_CFI_PSEUDO_OP #undef HAVE_AS_CFI_PSEUDO_OP
......
...@@ -22,9 +22,66 @@ ...@@ -22,9 +22,66 @@
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "config.h"
// ??? This is pretty gross, but we're going to frob types of the functions.
// Is this better or worse than just admitting we need to do this in pure
// assembly?
#ifndef HAVE_AS_AVX
#undef __AVX__
#endif
#include "libitm_i.h" #include "libitm_i.h"
#include "dispatch.h" #include "dispatch.h"
extern "C" {
#ifndef HAVE_AS_AVX
typedef float _ITM_TYPE_M256 __attribute__((vector_size(32), may_alias));
#endif
// ??? Re-define the memcpy implementations so that we can frob the
// interface to deal with possibly missing AVX instruction set support.
#ifdef HAVE_AS_AVX
#define RETURN(X) return X
#define STORE(X,Y) X = Y
#define OUTPUT(T) _ITM_TYPE_##T
#define INPUT(T,X) , _ITM_TYPE_##T X
#else
/* Emit vmovaps (%rax),%ymm0. */
#define RETURN(X) \
asm volatile(".byte 0xc5,0xfc,0x28,0x00" : "=m"(X) : "a"(&X));
/* Emit vmovaps %ymm0,(%rax); vzeroupper. */
#define STORE(X,Y) \
asm volatile(".byte 0xc5,0xfc,0x29,0x00,0xc5,0xf8,0x77" : "=m"(X) : "a"(&X));
#define OUTPUT(T) void
#define INPUT(T,X)
#endif
#undef ITM_READ_MEMCPY
#define ITM_READ_MEMCPY(T, LSMOD, TARGET, M2) \
OUTPUT(T) ITM_REGPARM _ITM_##LSMOD##T (const _ITM_TYPE_##T *ptr) \
{ \
_ITM_TYPE_##T v; \
TARGET memtransfer##M2(&v, ptr, sizeof(_ITM_TYPE_##T), false, \
GTM::abi_dispatch::NONTXNAL, \
GTM::abi_dispatch::LSMOD); \
RETURN(v); \
}
#undef ITM_WRITE_MEMCPY
#define ITM_WRITE_MEMCPY(T, LSMOD, TARGET, M2) \
void ITM_REGPARM _ITM_##LSMOD##T (_ITM_TYPE_##T *ptr INPUT(T,in)) \
{ \
_ITM_TYPE_##T v; \
STORE(v, in); \
TARGET memtransfer##M2(ptr, &v, sizeof(_ITM_TYPE_##T), false, \
GTM::abi_dispatch::LSMOD, \
GTM::abi_dispatch::NONTXNAL); \
}
// ??? Use memcpy for now, until we have figured out how to best instantiate // ??? Use memcpy for now, until we have figured out how to best instantiate
// these loads/stores. // these loads/stores.
CREATE_DISPATCH_FUNCTIONS_T_MEMCPY(M256, GTM::abi_disp()->, ) CREATE_DISPATCH_FUNCTIONS_T_MEMCPY(M256, GTM::abi_disp()->, )
...@@ -34,3 +91,5 @@ _ITM_LM256 (const _ITM_TYPE_M256 *ptr) ...@@ -34,3 +91,5 @@ _ITM_LM256 (const _ITM_TYPE_M256 *ptr)
{ {
GTM::GTM_LB (ptr, sizeof (*ptr)); GTM::GTM_LB (ptr, sizeof (*ptr));
} }
}
...@@ -17115,6 +17115,43 @@ $as_echo "#define HAVE_64BIT_SYNC_BUILTINS 1" >>confdefs.h ...@@ -17115,6 +17115,43 @@ $as_echo "#define HAVE_64BIT_SYNC_BUILTINS 1" >>confdefs.h
fi fi
case "${target_cpu}" in
i345686 | x86_64)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler supports AVX" >&5
$as_echo_n "checking if the assembler supports AVX... " >&6; }
if test "${libitm_cv_as_avx+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
asm("vzeroupper");
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
libitm_cv_as_avx=yes
else
libitm_cv_as_avx=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libitm_cv_as_avx" >&5
$as_echo "$libitm_cv_as_avx" >&6; }
if test x$libitm_cv_as_avx = xyes; then
$as_echo "#define HAVE_AS_AVX 1" >>confdefs.h
fi
;;
esac
# Cleanup and exit. # Cleanup and exit.
CFLAGS="$save_CFLAGS" CFLAGS="$save_CFLAGS"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
......
...@@ -237,6 +237,7 @@ CFLAGS="$save_CFLAGS $XCFLAGS" ...@@ -237,6 +237,7 @@ CFLAGS="$save_CFLAGS $XCFLAGS"
# had a chance to set XCFLAGS. # had a chance to set XCFLAGS.
LIBITM_CHECK_SYNC_BUILTINS LIBITM_CHECK_SYNC_BUILTINS
LIBITM_CHECK_64BIT_SYNC_BUILTINS LIBITM_CHECK_64BIT_SYNC_BUILTINS
LIBITM_CHECK_AS_AVX
# Cleanup and exit. # Cleanup and exit.
CFLAGS="$save_CFLAGS" CFLAGS="$save_CFLAGS"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment