From patchwork Tue Dec 2 17:06:55 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Senkevich X-Patchwork-Id: 4034 Received: (qmail 4667 invoked by alias); 2 Dec 2014 17:07:33 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 4658 invoked by uid 89); 2 Dec 2014 17:07:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS, URIBL_BLACK autolearn=no version=3.3.2 X-HELO: mail-la0-f50.google.com X-Received: by 10.152.88.69 with SMTP id be5mr334717lab.36.1417540046741; Tue, 02 Dec 2014 09:07:26 -0800 (PST) MIME-Version: 1.0 From: Andrew Senkevich Date: Tue, 2 Dec 2014 21:06:55 +0400 Message-ID: Subject: [PATCH 8/N v2] [x86_64] Vectorized math functions To: libc-alpha This patch adds libmvec.so build and ABI check on x86_64 by default, exclude from build with --disable-mathvec configure option. 2014-12-02 Andrew Senkevich * math/bits/mathcalls.h: Added cos declaration with __MATHCALL_VEC. * sysdeps/x86/fpu/bits/math-vector.h: Added SIMD declaration for cos. * sysdeps/x86_64/configure: Regenerated. * sysdeps/x86_64/configure.ac: Options for libmvec build. * sysdeps/unix/sysv/linux/x86_64/libmvec.abilist: New file. * sysdeps/x86_64/fpu/Makefile: New file. --- WBR, Andrew diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index 8a94a7e..82928a1 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -60,7 +60,7 @@ __MATHCALL (atan,, (_Mdouble_ __x)); __MATHCALL (atan2,, (_Mdouble_ __y, _Mdouble_ __x)); /* Cosine of X. */ -__MATHCALL (cos,, (_Mdouble_ __x)); +__MATHCALL_VEC (cos,, (_Mdouble_ __x)); /* Sine of X. */ __MATHCALL (sin,, (_Mdouble_ __x)); /* Tangent of X. */ diff --git a/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist new file mode 100644 index 0000000..b984207 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/libmvec.abilist @@ -0,0 +1,5 @@ +GLIBC_2.21 + GLIBC_2.21 A + _ZGVbN2v_cos F + _ZGVcN4v_cos F + _ZGVdN4v_cos F diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h new file mode 100644 index 0000000..98f414d --- /dev/null +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -0,0 +1,37 @@ +/* Platform-specific SIMD declarations of math functions. + Copyright (C) 2014 Free Software Foundation, Inc. + 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, see + . */ + +#ifndef _MATH_H +# error "Never include directly; \ + include instead." +#endif + +/* Get default empty definitions for simd declarations. */ +#include + +#if defined __x86_64__ && defined __FAST_MATH__ +# if defined _OPENMP && _OPENMP >= 201307 +/* OpenMP case. */ +/* TODO Put here link to document about pragma meaning. */ +# define __DECL_SIMD_VLEN2_SSE4 _Pragma ("omp declare simd notinbranch simdlen(2)") +# define __DECL_SIMD_VLEN4_AVX _Pragma ("omp declare simd notinbranch simdlen(4)") +# define __DECL_SIMD_VLEN4_AVX2 _Pragma ("omp declare simd notinbranch simdlen(4)") +# undef __DECL_SIMD_cos +# define __DECL_SIMD_cos __DECL_SIMD_VLEN2_SSE4 __DECL_SIMD_VLEN4_AVX2 +# endif +#endif diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure index 7d4dadd..1493523 100644 --- a/sysdeps/x86_64/configure +++ b/sysdeps/x86_64/configure @@ -275,6 +275,10 @@ fi config_vars="$config_vars config-cflags-avx2 = $libc_cv_cc_avx2" +if test x"$build_mathvec" = xnotset; then + build_mathvec=yes +fi + $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h # work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac index c9f9a51..1c2b35f 100644 --- a/sysdeps/x86_64/configure.ac +++ b/sysdeps/x86_64/configure.ac @@ -99,6 +99,10 @@ if test $libc_cv_cc_avx2 = yes; then fi LIBC_CONFIG_VAR([config-cflags-avx2], [$libc_cv_cc_avx2]) +if test x"$build_mathvec" = xnotset; then + build_mathvec=yes +fi + dnl It is always possible to access static and hidden symbols in an dnl position independent way. AC_DEFINE(PI_STATIC_AND_HIDDEN) diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile new file mode 100644 index 0000000..25fe0d4 --- /dev/null +++ b/sysdeps/x86_64/fpu/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),mathvec) +libmvec-support += svml_d_cos2_core svml_d_cos4_core_avx \ + svml_d_cos4_core_avx2 svml_d_cos_data +endif