aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-08-09 16:48:54 -0500
committerGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>2017-06-26 15:04:47 -0300
commitf819dbea0a58270293c49b514b64848c6e84fda1 (patch)
tree8445824e54752726301e6d4c8d906bd3273451d0
parenta27d2c19355a15569dfcdd5da741b57acf1a106a (diff)
downloadglibc-f819dbea0a58270293c49b514b64848c6e84fda1.tar.xz
glibc-f819dbea0a58270293c49b514b64848c6e84fda1.zip
powerpc64le: Enable float128
This patch adds ULPs for the float128 type, updates the abilist for libc and libm, and adds the files bits/floatn.h and float128-abi.h, in order to enable the new type for powerpc64le. This patch also adds the implementation of sqrtf128 for powerpc64le, since it is not implemented in libgcc. The sfp-machine.h header is taken from libgcc. Tested for powerpc64le (GCC 6.2 and GCC 7.1), powerpc64 and s390x. * manual/math.texi (Mathematics): Mention the enabling of float128 for powerpc64le. * sysdeps/powerpc/bits/floatn.h: New file. * sysdeps/powerpc/fpu/libm-test-ulps: Regenerated. * sysdeps/powerpc/fpu/math_private.h: (__ieee754_sqrtf128): New inline override. * sysdeps/powerpc/powerpc64le/Implies-before: New file. * sysdeps/powerpc/powerpc64le/Makefile: New file. * sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c: New file. * sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h: New file. * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c: New file. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Updated. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h: New file.
-rw-r--r--ChangeLog21
-rw-r--r--NEWS94
-rw-r--r--manual/math.texi3
-rw-r--r--sysdeps/powerpc/bits/floatn.h92
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps578
-rw-r--r--sysdeps/powerpc/fpu/math_private.h10
-rw-r--r--sysdeps/powerpc/powerpc64le/Implies-before1
-rw-r--r--sysdeps/powerpc/powerpc64le/Makefile45
-rw-r--r--sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c51
-rw-r--r--sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h115
-rw-r--r--sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c36
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist138
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h2
14 files changed, 1192 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2cfe569757..4fada927c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2017-06-26 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
+ Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
+
+ * manual/math.texi (Mathematics): Mention the enabling of float128
+ for powerpc64le.
+ * sysdeps/powerpc/bits/floatn.h: New file.
+ * sysdeps/powerpc/fpu/libm-test-ulps: Regenerated.
+ * sysdeps/powerpc/fpu/math_private.h:
+ (__ieee754_sqrtf128): New inline override.
+ * sysdeps/powerpc/powerpc64le/Implies-before: New file.
+ * sysdeps/powerpc/powerpc64le/Makefile: New file.
+ * sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c: New file.
+ * sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h: New file.
+ * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c: New file.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist:
+ Updated.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
+ Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h:
+ New file.
+
2017-06-26 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
* sysdeps/powerpc/powerpc64le/configure.ac: Check for POWER8.
diff --git a/NEWS b/NEWS
index e8546e118e..027f09b8c7 100644
--- a/NEWS
+++ b/NEWS
@@ -121,6 +121,100 @@ Version 2.26
C Library is GCC 4.9. Older GCC versions, and non-GNU compilers, can
still be used to compile programs using the GNU C Library.
+* Support is added, on powerpc64le, for interfaces supporting the _Float128
+ type from ISO/IEC TS 18661-3:2015. Most of the interfaces are taken from
+ TS 18661-3. The type-generic macros in <math.h> support this type, but
+ those in <tgmath.h> do not. The GNU C Library now requires GCC 6.2 or
+ later to build for powerpc64le. When used with GCC versions before GCC
+ 7, these interfaces may be used with the type under the non-standard name
+ __float128.
+
+ New <stdlib.h> functions from ISO/IEC TS 18661-3:
+
+ - String Conversion Functions: strfromf128 and strtof128.
+
+ New <math.h> features from ISO/IEC TS 18661-3:
+
+ - Very Large Number macro: HUGE_VAL_F128.
+
+ - Signaling NaN macro: SNANF128.
+
+ - Trigonometric Functions: acosf128, asinf128, atanf128, atan2f128,
+ cosf128, sinf128, tanf128.
+
+ - Hyperbolic Functions: acoshf128, asinhf128, atanhf128, coshf128,
+ sinhf128, tanhf128.
+
+ - Exponential and Logarithmic Functions: expf128, exp2f128, expm1f128,
+ frexpf128, ilogbf128, ldexpf128, llogbf128, logf128, log10f128,
+ log1pf128, log2f128, logbf128, modff128, scalbnf128, scalblnf128.
+
+ - Power and Absolute Functions: cbrtf128, fabsf128, hypotf128, powf128,
+ sqrtf128.
+
+ - Error and Gamma Functions: erff128, erfcf128, lgammaf128, tgammaf128.
+
+ - Nearest Integer Functions: ceilf128, floorf128, nearbyintf128,
+ rintf128, lrintf128, llrintf128, roundf128, lroundf128, llroundf128,
+ roundevenf128, truncf128, fromfpf128, ufromfpf128, fromfpxf128,
+ ufromfpxf128.
+
+ - Remainder Functions: fmodf128, remainderf128, remquof128.
+
+ - Manipulation Functions: copysignf128, nanf128, nextafterf128,
+ nextupf128, nextdownf128, canonicalizef128.
+
+ - Minimum, Maximum, and Positive Difference Functions: fdimf128,
+ fmaxf128, fminf128, fmaxmagf128, fminmagf128.
+
+ - Floating Multiply-Add Function: fmaf128.
+
+ - Total Order Functions: totalorderf128, totalordermagf128.
+
+ - Payload Functions: getpayloadf128, setpayloadf128, setpayloadsigf128.
+
+ New <complex.h> functions from ISO/IEC TS 18661-3:
+
+ - Trigonometric Functions: cacosf128, casinf128, catanf128, ccosf128,
+ csinf128, ctanf128.
+
+ - Hyperbolic Functions: cacoshf128, casinhf128, catanhf128, ccoshf128,
+ csinhf128, ctanhf128.
+
+ - Exponential and Logarithmic Functions: cexpf128, clogf128.
+
+ - Power and Absolute Functions: cabsf128, cpowf128, csqrtf128.
+
+ - Manipulation Functions: cargf128, cimagf128, CMPLXF128, conjf128,
+ cprojf128, crealf128.
+
+ The following <wchar.h> functions are added as GNU extensions:
+
+ - Wide String Conversion Functions: wsctof128, wcstof128_l.
+
+ The following <stdlib.h> function is added as a GNU extension:
+
+ - String Conversion Function: strtof128_l.
+
+ The following <math.h> features are added as GNU extensions:
+
+ - Predefined Mathematical Constants: M_Ef128, M_LOG2Ef128,
+ M_LOG10Ef128, M_LN2f128, M_LN10f128, M_PIf128, M_PI_2f128,
+ M_PI_4f128, M_1_PIf128, M_2_PIf128, M_2_SQRTPIf128, M_SQRT2f128,
+ M_SQRT1_2f128.
+
+ - Trigonometric Function: sincosf128.
+
+ - Exponential and Logarithmic Function: exp10f128.
+
+ - Error and Gamma Function: lgammaf128_r.
+
+ - Bessel Functions: j0f128, j1f128, jnf128, y0f128, y1f128, ynf128.
+
+ The following <complex.h> function is added as a GNU extension:
+
+ - Exponential and Logarithmic Function: clog10f128.
+
Security related changes:
* The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes,
diff --git a/manual/math.texi b/manual/math.texi
index a8e16885cd..275b72bf33 100644
--- a/manual/math.texi
+++ b/manual/math.texi
@@ -66,7 +66,8 @@ these functions are described along with the @code{double},
@w{ISO/IEC TS 18661-3}, unless explicitly stated otherwise.
Currently, support for @code{_Float@var{N}} or @code{_Float@var{N}x}
-types is not provided for any machine.
+types is only provided for @code{_Float128} on powerpc64le (PowerPC
+64-bits little-endian).
@menu
* Mathematical Constants:: Precise numeric values for often-used
diff --git a/sysdeps/powerpc/bits/floatn.h b/sysdeps/powerpc/bits/floatn.h
new file mode 100644
index 0000000000..be57e7015f
--- /dev/null
+++ b/sysdeps/powerpc/bits/floatn.h
@@ -0,0 +1,92 @@
+/* Macros to control TS 18661-3 glibc features on powerpc.
+ Copyright (C) 2017 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 _BITS_FLOATN_H
+#define _BITS_FLOATN_H
+
+#include <features.h>
+
+/* Defined to 1 if the current compiler invocation provides a
+ floating-point type with the IEEE 754 binary128 format, and this glibc
+ includes corresponding *f128 interfaces for it. */
+#if defined _ARCH_PWR8 && defined __LITTLE_ENDIAN__ && (_CALL_ELF == 2) \
+ && defined __FLOAT128__
+# define __HAVE_FLOAT128 1
+#else
+# define __HAVE_FLOAT128 0
+#endif
+
+/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct
+ from the default float, double and long double types in this glibc. */
+#if __HAVE_FLOAT128
+# define __HAVE_DISTINCT_FLOAT128 1
+#else
+# define __HAVE_DISTINCT_FLOAT128 0
+#endif
+
+/* Defined to concatenate the literal suffix to be used with _Float128
+ types, if __HAVE_FLOAT128 is 1. */
+#if __HAVE_FLOAT128
+# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+/* The literal suffix (f128) exist for powerpc only since GCC 7.0. */
+# define __f128(x) x##q
+# else
+# define __f128(x) x##f128
+# endif
+#endif
+
+/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
+#if __HAVE_FLOAT128
+# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+/* Add a typedef for older GCC compilers which don't natively support
+ _Complex _Float128. */
+typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__KC__)));
+# define __CFLOAT128 __cfloat128
+# else
+# define __CFLOAT128 _Complex _Float128
+# endif
+#endif
+
+/* The remaining of this file provides support for older compilers. */
+#if __HAVE_FLOAT128
+
+/* The type _Float128 exist for powerpc only since GCC 7.0. */
+# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+typedef __float128 _Float128;
+# endif
+
+/* Builtin __builtin_huge_valf128 doesn't exist before GCC 7.0. */
+# if !__GNUC_PREREQ (7, 0)
+# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
+# endif
+
+/* The following builtins (suffixed with 'q') are available in GCC >= 6.2,
+ which is the minimum version required for float128 support on powerpc64le.
+ Since GCC 7.0 the builtins suffixed with f128 are also available, then
+ there is no need to redefined them. */
+# if !__GNUC_PREREQ (7, 0)
+# define __builtin_copysignf128 __builtin_copysignq
+# define __builtin_fabsf128 __builtin_fabsq
+# define __builtin_inff128 __builtin_infq
+# define __builtin_nanf128 __builtin_nanq
+# define __builtin_nansf128 __builtin_nansq
+# endif
+
+#endif
+
+#endif /* _BITS_FLOATN_H */
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index 72eb2b1e5a..7fb67446a5 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -3,1583 +3,1985 @@
# Maximal error of functions:
Function: "acos":
float: 1
+float128: 1
ifloat: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "acos_downward":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 3
ldouble: 3
Function: "acos_towardzero":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 3
ldouble: 3
Function: "acos_upward":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 2
ldouble: 2
Function: "acosh":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "acosh_downward":
double: 2
float: 2
+float128: 3
idouble: 2
ifloat: 2
+ifloat128: 3
ildouble: 3
ldouble: 3
Function: "acosh_towardzero":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 4
ldouble: 4
Function: "acosh_upward":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 3
ldouble: 4
Function: "asin":
float: 1
+float128: 1
ifloat: 1
+ifloat128: 1
ildouble: 2
ldouble: 2
Function: "asin_downward":
double: 1
float: 1
+float128: 2
idouble: 1
ifloat: 1
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "asin_towardzero":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "asin_upward":
double: 1
float: 1
+float128: 2
idouble: 1
ifloat: 1
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "asinh":
double: 1
float: 1
+float128: 3
idouble: 1
ifloat: 1
+ifloat128: 3
ildouble: 2
ldouble: 2
Function: "asinh_downward":
double: 3
float: 3
+float128: 4
idouble: 3
ifloat: 3
+ifloat128: 4
ildouble: 5
ldouble: 5
Function: "asinh_towardzero":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 5
ldouble: 5
Function: "asinh_upward":
double: 3
float: 3
+float128: 4
idouble: 3
ifloat: 3
+ifloat128: 4
ildouble: 7
ldouble: 7
Function: "atan":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "atan2":
float: 1
+float128: 1
ifloat: 1
+ifloat128: 1
ildouble: 2
ldouble: 2
Function: "atan2_downward":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 5
ldouble: 5
Function: "atan2_towardzero":
double: 1
float: 2
+float128: 3
idouble: 1
ifloat: 2
+ifloat128: 3
ildouble: 6
ldouble: 6
Function: "atan2_upward":
double: 1
float: 1
+float128: 2
idouble: 1
ifloat: 1
+ifloat128: 2
ildouble: 3
ldouble: 3
Function: "atan_downward":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 1
ldouble: 1
Function: "atan_towardzero":
double: 1
float: 1
+float128: 1
idouble: 1
ifloat: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "atan_upward":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "atanh":
double: 2
float: 2
+float128: 3
idouble: 2
ifloat: 2
+ifloat128: 3
ildouble: 2
ldouble: 2
Function: "atanh_downward":
double: 3
float: 3
+float128: 4
idouble: 3
ifloat: 3
+ifloat128: 4
ildouble: 3
ldouble: 3
Function: "atanh_towardzero":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "atanh_upward":
double: 3
float: 3
+float128: 4
idouble: 3
ifloat: 3
+ifloat128: 4
ildouble: 4
ldouble: 4
Function: "cabs":
double: 1
+float128: 1
idouble: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "cabs_downward":
double: 1
+float128: 1
idouble: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "cabs_towardzero":
double: 1
+float128: 1
idouble: 1
+ifloat128: 1
ildouble: 1
ldouble: 1
Function: "cabs_upward":
double: 1
+float128: 1
idouble: 1
+ifloat128: 1
ildouble: 2
ldouble: 2
Function: Real part of "cacos":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 1
ldouble: 1
Function: Imaginary part of "cacos":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: Real part of "cacos_downward":
double: 3
float: 2
+float128: 3
idouble: 3
ifloat: 2
+ifloat128: 3
ildouble: 6
ldouble: 6
Function: Imaginary part of "cacos_downward":
double: 5
float: 3
+float128: 6
idouble: 5
ifloat: 3
+ifloat128: 6
ildouble: 8
ldouble: 8
Function: Real part of "cacos_towardzero":
double: 3
float: 2
+float128: 3
idouble: 3
ifloat: 2
+ifloat128: 3
ildouble: 7
ldouble: 7
Function: Imaginary part of "cacos_towardzero":
double: 5
float: 3
+float128: 5
idouble: 5
ifloat: 3
+ifloat128: 5
ildouble: 8
ldouble: 8
Function: Real part of "cacos_upward":
double: 2
float: 2
+float128: 3
idouble: 2
ifloat: 2
+ifloat128: 3
ildouble: 7
ldouble: 7
Function: Imaginary part of "cacos_upward":
double: 5
float: 5
+float128: 7
idouble: 5
ifloat: 5
+ifloat128: 7
ildouble: 13
ldouble: 13
Function: Real part of "cacosh":
double: 2
float: 2
+float128: 2
idouble: 2
ifloat: 2
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: Imaginary part of "cacosh":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 1
ldouble: 1
Function: Real part of "cacosh_downward":
double: 5
float: 3
+float128: 5
idouble: 5
ifloat: 3
+ifloat128: 5
ildouble: 8
ldouble: 8
Function: Imaginary part of "cacosh_downward":
double: 3
float: 3
+float128: 4
idouble: 3
ifloat: 3
+ifloat128: 4
ildouble: 6
ldouble: 6
Function: Real part of "cacosh_towardzero":
double: 5
float: 3
+float128: 5
idouble: 5
ifloat: 3
+ifloat128: 5
ildouble: 8
ldouble: 8
Function: Imaginary part of "cacosh_towardzero":
double: 3
float: 2
+float128: 3
idouble: 3
ifloat: 2
+ifloat128: 3
ildouble: 7
ldouble: 7
Function: Real part of "cacosh_upward":
double: 4
float: 4
+float128: 6
idouble: 4
ifloat: 4
+ifloat128: 6
ildouble: 12
ldouble: 12
Function: Imaginary part of "cacosh_upward":
double: 3
float: 2
+float128: 4
idouble: 3
ifloat: 2
+ifloat128: 4
ildouble: 8
ldouble: 8
Function: "carg":
double: 1
float: 1
+float128: 2
idouble: 1
ifloat: 1
+ifloat128: 2
ildouble: 2
ldouble: 2
Function: "carg_downward":
double: 1
float: 2
+float128: 2
idouble: 1
ifloat: 2
+ifloat128: 2
ildouble: 5
ldouble: 5
Function: "carg_towardzero":
double: 1
float: 2</