diff options
-rw-r--r-- | NEWS | 11 | ||||
-rw-r--r-- | sysdeps/powerpc/bits/math-vector.h | 41 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/libm-test-ulps | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/Versions | 5 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/configure | 6 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/configure.ac | 6 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/math-tests-arch.h | 34 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile | 16 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/multiarch/test-double-vlen2-wrappers.c | 24 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_cos2_vsx.c | 88 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_trig_data.h | 60 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/libmvec.abilist | 1 |
12 files changed, 295 insertions, 0 deletions
diff --git a/NEWS b/NEWS index 77631ca707..ef0843fd91 100644 --- a/NEWS +++ b/NEWS @@ -257,6 +257,17 @@ Version 2.30 Major new features: +* Start of implementing vector math library libmvec on PPC64/POWER8. + The double-precision cosine now has a vector version. + GCC support for auto-vectorization of functions on PPC64 is not yet + available. Until that is done, the new vector math functions are + inaccessible to applications. + Library libmvec is built by default for PPC64. Disable its creation by + passing flag --disable-mathvec to configure. + The library ABI specification is x86_64 Vector Function ABI. + More information on libmvec including a link to the ABI document is at: + <https://sourceware.org/glibc/wiki/libmvec> + * Unicode 12.1.0 Support: Character encoding, character type info, and transliteration tables are all updated to Unicode 12.1.0, using generator scripts contributed by Mike FABIAN (Red Hat). diff --git a/sysdeps/powerpc/bits/math-vector.h b/sysdeps/powerpc/bits/math-vector.h new file mode 100644 index 0000000000..78d9db64bf --- /dev/null +++ b/sysdeps/powerpc/bits/math-vector.h @@ -0,0 +1,41 @@ +/* Platform-specific SIMD declarations of math functions. + Copyright (C) 2019 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _MATH_H +# error "Never include <bits/math-vector.h> directly;\ + include <math.h> instead." +#endif + +/* Get default empty definitions for simd declarations. */ +#include <bits/libm-simd-decl-stubs.h> + +#if defined __PPC64__ && defined __FAST_MATH__ +# if defined _OPENMP && _OPENMP >= 201307 +/* OpenMP case. */ +# define __DECL_SIMD_PPC64 _Pragma ("omp declare simd notinbranch") +# elif __GNUC_PREREQ (6,0) +/* W/o OpenMP use GCC 6.* __attribute__ ((__simd__)). */ +# define __DECL_SIMD_PPC64 __attribute__ ((__simd__ ("notinbranch"))) +# endif + +# ifdef __DECL_SIMD_PPC64 +# undef __DECL_SIMD_cos +# define __DECL_SIMD_cos __DECL_SIMD_PPC64 + +# endif +#endif diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 1eec27c1dc..d392b135a7 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -1311,6 +1311,9 @@ ifloat128: 2 ildouble: 5 ldouble: 5 +Function: "cos_vlen2": +double: 2 + Function: "cosh": double: 1 float: 1 diff --git a/sysdeps/powerpc/powerpc64/fpu/Versions b/sysdeps/powerpc/powerpc64/fpu/Versions new file mode 100644 index 0000000000..9a3e1211cc --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/Versions @@ -0,0 +1,5 @@ +libmvec { + GLIBC_2.30 { + _ZGVbN2v_cos; + } +} diff --git a/sysdeps/powerpc/powerpc64/fpu/configure b/sysdeps/powerpc/powerpc64/fpu/configure new file mode 100644 index 0000000000..1b2bb78165 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/configure @@ -0,0 +1,6 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/powerpc/powerpc64/fpu/. + +if test "$enable_mathvec" != "no" ; then + build_mathvec=yes +fi diff --git a/sysdeps/powerpc/powerpc64/fpu/configure.ac b/sysdeps/powerpc/powerpc64/fpu/configure.ac new file mode 100644 index 0000000000..d2ef5c8739 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/configure.ac @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/powerpc/powerpc64/fpu/. + +if test "$enable_mathvec" != "no" ; then + build_mathvec=yes +fi diff --git a/sysdeps/powerpc/powerpc64/fpu/math-tests-arch.h b/sysdeps/powerpc/powerpc64/fpu/math-tests-arch.h new file mode 100644 index 0000000000..74fac298d2 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/math-tests-arch.h @@ -0,0 +1,34 @@ +/* Runtime architecture check for math tests. PPC64 version. + Copyright (C) 2014-2019 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 + <http://www.gnu.org/licenses/>. */ + +#if defined REQUIRE_VSX + +# include "init-arch.h" + +# define INIT_ARCH_EXT +# define CHECK_ARCH_EXT \ + do \ + { \ + INIT_ARCH() \ + if (!(hwcap & PPC_FEATURE_HAS_VSX )) return; \ + } \ + while (0) + +#else +# include <sysdeps/generic/math-tests-arch.h> +#endif diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile new file mode 100644 index 0000000000..b56e756f80 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile @@ -0,0 +1,16 @@ +ifeq ($(subdir),mathvec) +libmvec-sysdep_routines += vec_d_cos2_vsx +CFLAGS-vec_d_cos2_vsx.c += -mabi=altivec -maltivec -mvsx +endif + +# Variables for libmvec tests. +ifeq ($(subdir),math) +ifeq ($(build-mathvec),yes) +libmvec-tests += double-vlen2 + +double-vlen2-funcs = cos + +double-vlen2-arch-ext-cflags = -mabi=altivec -maltivec -mvsx -DREQUIRE_VSX +CFLAGS-test-double-vlen2-wrappers.c += -mabi=altivec -maltivec -mvsx -DREQUIRE_VSX +endif +endif diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/test-double-vlen2-wrappers.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/test-double-vlen2-wrappers.c new file mode 100644 index 0000000000..17e2cc0724 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/test-double-vlen2-wrappers.c @@ -0,0 +1,24 @@ +/* Wrapper part of tests for VSX ISA versions of vector math functions. + Copyright (C) 2019 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 + <http://www.gnu.org/licenses/>. */ + +#include "test-double-vlen2.h" +#include <altivec.h> + +#define VEC_TYPE vector double + +VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVbN2v_cos) diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_cos2_vsx.c b/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_cos2_vsx.c new file mode 100644 index 0000000000..e1467a78b1 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_cos2_vsx.c @@ -0,0 +1,88 @@ +/* Function cos vectorized with VSX. + Copyright (C) 2019 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 + <http://www.gnu.org/licenses/>. */ + +#include <math.h> +#include "vec_d_trig_data.h" + +vector double +_ZGVbN2v_cos (vector double x) +{ + + /* + ARGUMENT RANGE REDUCTION: + Add Pi/2 to argument: X' = X+Pi/2. */ + vector double x_prime = (vector double) __d_half_pi + x; + + /* Get absolute argument value: X' = |X'|. */ + vector double abs_x_prime = vec_abs (x_prime); + + /* Y = X'*InvPi + RS : right shifter add. */ + vector double y = (x_prime * __d_inv_pi) + __d_rshifter; + + /* Check for large arguments path. */ + vector bool long long large_in = vec_cmpgt (abs_x_prime, __d_rangeval); + + /* N = Y - RS : right shifter sub. */ + vector double n = y - __d_rshifter; + + /* SignRes = Y<<63 : shift LSB to MSB place for result sign. */ + vector double sign_res = (vector double) vec_sl ((vector long long) y, + (vector unsigned long long) + vec_splats (63)); + + /* N = N - 0.5. */ + n = n - __d_one_half; + + /* R = X - N*Pi1. */ + vector double r = x - (n * __d_pi1_fma); + + /* R = R - N*Pi2. */ + r = r - (n * __d_pi2_fma); + + /* R = R - N*Pi3. */ + r = r - (n * __d_pi3_fma); + + /* R2 = R*R. */ + vector double r2 = r * r; + + /* Poly = C3+R2*(C4+R2*(C5+R2*(C6+R2*C7))). */ + vector double poly = r2 * __d_coeff7 + __d_coeff6; + poly = poly * r2 + __d_coeff5; + poly = poly * r2 + __d_coeff4; + poly = poly * r2 + __d_coeff3; + + /* Poly = R+R*(R2*(C1+R2*(C2+R2*Poly))). */ + poly = poly * r2 + __d_coeff2; + poly = poly * r2 + __d_coeff1; + poly = poly * r2 * r + r; + + /* + RECONSTRUCTION: + Final sign setting: Res = Poly^SignRes. */ + vector double out + = (vector double) ((vector long long) poly ^ (vector long long) sign_res); + + if (large_in[0] != 0) + out[0] = cos (x[0]); + + if (large_in[1] != 0) + out[1] = cos (x[1]); + + return out; + +} diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_trig_data.h b/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_trig_data.h new file mode 100644 index 0000000000..ecd47d258f --- /dev/null +++ b/sysdeps/powerpc/powerpc64/fpu/multiarch/vec_d_trig_data.h @@ -0,0 +1,60 @@ +/* Constants used in polynomial approximations for vectorized sin, cos, + and sincos functions. + Copyright (C) 2019 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef D_TRIG_DATA_H +#define D_TRIG_DATA_H + +#include <altivec.h> + +/* PI/2. */ +const vector double __d_half_pi = {0x1.921fb54442d18p+0, 0x1.921fb54442d18p+0}; + +/* Inverse PI. */ +const vector double __d_inv_pi = {0x1.45f306dc9c883p-2, 0x1.45f306dc9c883p-2}; + +/* Right-shifter constant. */ +const vector double __d_rshifter = {0x1.8p+52, 0x1.8p+52}; + +/* Working range threshold. */ +const vector double __d_rangeval = {0x1p+23, 0x1p+23}; + +/* One-half. */ +const vector double __d_one_half = {0x1p-1, 0x1p-1}; + +/* Range reduction PI-based constants if FMA available: + PI high part (FMA available). */ +const vector double __d_pi1_fma = {0x1.921fb54442d18p+1, 0x1.921fb54442d18p+1}; + +/* PI mid part (FMA available). */ +const vector double __d_pi2_fma = {0x1.1a62633145c06p-53, 0x1.1a62633145c06p-53}; + +/* PI low part (FMA available). */ +const vector double __d_pi3_fma += {0x1.c1cd129024e09p-106,0x1.c1cd129024e09p-106}; + +/* Polynomial coefficients (relative error 2^(-52.115)). */ +const vector double __d_coeff7 = {-0x1.9f0d60811aac8p-41,-0x1.9f0d60811aac8p-41}; +const vector double __d_coeff6 = {0x1.60e6857a2f22p-33,0x1.60e6857a2f22p-33}; +const vector double __d_coeff5 = {-0x1.ae63546002231p-26,-0x1.ae63546002231p-26}; +const vector double __d_coeff4 = {0x1.71de38030feap-19,0x1.71de38030feap-19}; +const vector double __d_coeff3 = {-0x1.a01a019a5b86dp-13,-0x1.a01a019a5b86dp-13}; +const vector double __d_coeff2 = {0x1.111111110a4a8p-7,0x1.111111110a4a8p-7}; +const vector double __d_coeff1 = {-0x1.55555555554a7p-3,-0x1.55555555554a7p-3}; + +#endif /* D_TRIG_DATA_H. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libmvec.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libmvec.abilist new file mode 100644 index 0000000000..656ce0541f --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libmvec.abilist @@ -0,0 +1 @@ +GLIBC_2.30 _ZGVbN2v_cos F |