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.
* config/alpha/unaligned.h: Remove file.
* config/generic/unaligned.h: Remove file.
[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
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()->, )
{
GTM::GTM_LB (ptr, sizeof (*ptr));
}
+
+}
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