libitm: Work around assembler missing AVX insns.
From-SVN: r181246
This commit is contained in:
parent
41582ffe43
commit
430616e7a7
6 changed files with 121 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
|||
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.
|
||||
|
|
|
@ -95,6 +95,20 @@ AC_DEFUN([LIBITM_CHECK_SIZE_T_MANGLING], [
|
|||
[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)
|
||||
dnl The lines below arrange for aclocal not to bring an installed
|
||||
dnl libtool.m4 into aclocal.m4, while still arranging for automake to
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
/* Define to 1 if the target supports 64-bit __sync_*_compare_and_swap */
|
||||
#undef HAVE_64BIT_SYNC_BUILTINS
|
||||
|
||||
/* Define to 1 if the assembler supports AVX. */
|
||||
#undef HAVE_AS_AVX
|
||||
|
||||
/* Define if your assembler supports .cfi_* directives. */
|
||||
#undef HAVE_AS_CFI_PSEUDO_OP
|
||||
|
||||
|
|
|
@ -22,9 +22,66 @@
|
|||
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
<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 "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
|
||||
// these loads/stores.
|
||||
CREATE_DISPATCH_FUNCTIONS_T_MEMCPY(M256, GTM::abi_disp()->, )
|
||||
|
@ -34,3 +91,5 @@ _ITM_LM256 (const _ITM_TYPE_M256 *ptr)
|
|||
{
|
||||
GTM::GTM_LB (ptr, sizeof (*ptr));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
37
libitm/configure
vendored
37
libitm/configure
vendored
|
@ -17115,6 +17115,43 @@ $as_echo "#define HAVE_64BIT_SYNC_BUILTINS 1" >>confdefs.h
|
|||
|
||||
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.
|
||||
CFLAGS="$save_CFLAGS"
|
||||
cat >confcache <<\_ACEOF
|
||||
|
|
|
@ -237,6 +237,7 @@ CFLAGS="$save_CFLAGS $XCFLAGS"
|
|||
# had a chance to set XCFLAGS.
|
||||
LIBITM_CHECK_SYNC_BUILTINS
|
||||
LIBITM_CHECK_64BIT_SYNC_BUILTINS
|
||||
LIBITM_CHECK_AS_AVX
|
||||
|
||||
# Cleanup and exit.
|
||||
CFLAGS="$save_CFLAGS"
|
||||
|
|
Loading…
Add table
Reference in a new issue