Add x86-32 FMA support

This commit is contained in:
H.J. Lu 2010-04-14 22:27:59 -07:00 committed by Ulrich Drepper
parent df87f54923
commit a11ec63713
11 changed files with 190 additions and 36 deletions

View File

@ -1,5 +1,16 @@
2010-04-14 H.J. Lu <hongjiu.lu@intel.com> 2010-04-14 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/elf/configure.in: Move AVX test to ....
* sysdeps/i386/configure.in: ...here.
* sysdeps/i386/i686/multiarch/Makefile (libm-sysdep_routines): Define.
(CFLAGS-s_fma-fma.c): Define.
(CFLAGS-s_fmaf-fma.c): Define.
* sysdeps/i386/i686/multiarch/Versions: New file.
* sysdeps/i386/i686/multiarch/s_fma-fma.c: New file.
* sysdeps/i386/i686/multiarch/s_fma.c: New file.
* sysdeps/i386/i686/multiarch/s_fmaf-fma.c: New file.
* sysdeps/i386/i686/multiarch/s_fmaf.c: New file.
* sysdeps/x86_64/multiarch/memcmp-sse4.S: Check * sysdeps/x86_64/multiarch/memcmp-sse4.S: Check
DATA_CACHE_SIZE_HALF instead of SHARED_CACHE_SIZE_HALF. DATA_CACHE_SIZE_HALF instead of SHARED_CACHE_SIZE_HALF.

View File

@ -656,3 +656,28 @@ fi
fi fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_as_i686" >&5 { $as_echo "$as_me:$LINENO: result: $libc_cv_as_i686" >&5
$as_echo "$libc_cv_as_i686" >&6; } $as_echo "$libc_cv_as_i686" >&6; }
{ $as_echo "$as_me:$LINENO: checking for AVX support" >&5
$as_echo_n "checking for AVX support... " >&6; }
if test "${libc_cv_cc_avx+set}" = set; then
$as_echo_n "(cached) " >&6
else
if { ac_try='${CC-cc} -mavx -xc /dev/null -S -o /dev/null'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
libc_cv_cc_avx=yes
else
libc_cv_cc_avx=no
fi
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_cc_avx" >&5
$as_echo "$libc_cv_cc_avx" >&6; }
if test $libc_cv_cc_avx = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AVX_SUPPORT 1
_ACEOF
fi

View File

@ -55,3 +55,14 @@ if AC_TRY_COMMAND([${CC-cc} -Wa,-mtune=i686 -xc /dev/null -S -o /dev/null]); the
else else
libc_cv_as_i686=no libc_cv_as_i686=no
fi]) fi])
dnl Check if -mavx works.
AC_CACHE_CHECK(for AVX support, libc_cv_cc_avx, [dnl
if AC_TRY_COMMAND([${CC-cc} -mavx -xc /dev/null -S -o /dev/null]); then
libc_cv_cc_avx=yes
else
libc_cv_cc_avx=no
fi])
if test $libc_cv_cc_avx = yes; then
AC_DEFINE(HAVE_AVX_SUPPORT)
fi

View File

@ -19,3 +19,9 @@ CFLAGS-strstr.c += -msse4
CFLAGS-strcasestr.c += -msse4 CFLAGS-strcasestr.c += -msse4
endif endif
endif endif
ifeq (mathyes,$(subdir)$(config-cflags-avx))
libm-sysdep_routines += s_fma-fma s_fmaf-fma
CFLAGS-s_fma-fma.c += -mavx -mfpmath=sse
CFLAGS-s_fmaf-fma.c += -mavx -mfpmath=sse
endif

View File

@ -0,0 +1,5 @@
libc {
GLIBC_PRIVATE {
__get_cpu_features;
}
}

View File

@ -0,0 +1,30 @@
/* FMA version of fma.
Copyright (C) 2010 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <config.h>
#ifdef HAVE_AVX_SUPPORT
double
__fma_fma (double x, double y, double z)
{
asm ("vfmadd213sd %3, %2, %0" : "=x" (x) : "0" (x), "x" (y), "xm" (z));
return x;
}
#endif

View File

@ -0,0 +1,36 @@
/* Multiple versions of fma.
Copyright (C) 2010 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <config.h>
#ifdef HAVE_AVX_SUPPORT
#include <math.h>
#include <init-arch.h>
extern double __fma_ia32 (double x, double y, double z) attribute_hidden;
extern double __fma_fma (double x, double y, double z) attribute_hidden;
libm_ifunc (__fma, HAS_FMA ? __fma_fma : __fma_ia32);
weak_alias (__fma, fma)
# define __fma __fma_ia32
#endif
#include <math/s_fma.c>

View File

@ -0,0 +1,30 @@
/* FMA version of fmaf.
Copyright (C) 2010 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <config.h>
#ifdef HAVE_AVX_SUPPORT
float
__fmaf_fma (float x, float y, float z)
{
asm ("vfmadd213ss %3, %2, %0" : "=x" (x) : "0" (x), "x" (y), "xm" (z));
return x;
}
#endif

View File

@ -0,0 +1,36 @@
/* Multiple versions of fmaf.
Copyright (C) 2010 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <config.h>
#ifdef HAVE_AVX_SUPPORT
#include <math.h>
#include <init-arch.h>
extern float __fmaf_ia32 (float x, float y, float z) attribute_hidden;
extern float __fmaf_fma (float x, float y, float z) attribute_hidden;
libm_ifunc (__fmaf, HAS_FMA ? __fmaf_fma : __fmaf_ia32);
weak_alias (__fmaf, fmaf)
# define __fmaf __fmaf_ia32
#endif
#include <math/s_fmaf.c>

View File

@ -47,28 +47,3 @@ cat >>confdefs.h <<\_ACEOF
#define PI_STATIC_AND_HIDDEN 1 #define PI_STATIC_AND_HIDDEN 1
_ACEOF _ACEOF
{ $as_echo "$as_me:$LINENO: checking for AVX support" >&5
$as_echo_n "checking for AVX support... " >&6; }
if test "${libc_cv_cc_avx+set}" = set; then
$as_echo_n "(cached) " >&6
else
if { ac_try='${CC-cc} -mavx -xc /dev/null -S -o /dev/null'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
libc_cv_cc_avx=yes
else
libc_cv_cc_avx=no
fi
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_cc_avx" >&5
$as_echo "$libc_cv_cc_avx" >&6; }
if test $libc_cv_cc_avx = yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_AVX_SUPPORT 1
_ACEOF
fi

View File

@ -32,14 +32,3 @@ fi
dnl It is always possible to access static and hidden symbols in an dnl It is always possible to access static and hidden symbols in an
dnl position independent way. dnl position independent way.
AC_DEFINE(PI_STATIC_AND_HIDDEN) AC_DEFINE(PI_STATIC_AND_HIDDEN)
dnl Check if -mavx works.
AC_CACHE_CHECK(for AVX support, libc_cv_cc_avx, [dnl
if AC_TRY_COMMAND([${CC-cc} -mavx -xc /dev/null -S -o /dev/null]); then
libc_cv_cc_avx=yes
else
libc_cv_cc_avx=no
fi])
if test $libc_cv_cc_avx = yes; then
AC_DEFINE(HAVE_AVX_SUPPORT)
fi