This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch tuliom/float128 created. glibc-2.25-377-g0ded005
- From: tuliom at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 25 May 2017 20:45:25 -0000
- Subject: GNU C Library master sources branch tuliom/float128 created. glibc-2.25-377-g0ded005
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, tuliom/float128 has been created
at 0ded00553f47d1e19bad2df60b4d6ee54eaff1ad (commit)
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=0ded00553f47d1e19bad2df60b4d6ee54eaff1ad
commit 0ded00553f47d1e19bad2df60b4d6ee54eaff1ad
Author: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Tue Aug 9 16:48:54 2016 -0500
powerpc64le: Enable float128
Add ulps for the float128 type, bits/floatn.h, and float128-abi.h.
Likewise, sqrt is not implemented in libgcc. The sfp-machine.h
header is taken from libgcc, and used to build a P7/P8 soft-fp
sqrtf128.
* 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/bits/floatn.h: 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:
Regenerated.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h
New file.
diff --git a/sysdeps/powerpc/bits/floatn.h b/sysdeps/powerpc/bits/floatn.h
new file mode 100644
index 0000000..d5a8b74
--- /dev/null
+++ b/sysdeps/powerpc/bits/floatn.h
@@ -0,0 +1,88 @@
+/* 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/>. */
+
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.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)
+/* 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)
+/* 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)
+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
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index 72eb2b1..6571538 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -6,6 +6,8 @@ float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "acos_downward":
double: 1
@@ -14,6 +16,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "acos_towardzero":
double: 1
@@ -22,6 +26,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "acos_upward":
double: 1
@@ -30,6 +36,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "acosh":
double: 2
@@ -38,6 +46,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "acosh_downward":
double: 2
@@ -46,6 +56,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: "acosh_towardzero":
double: 2
@@ -54,6 +66,8 @@ idouble: 2
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: "acosh_upward":
double: 2
@@ -62,12 +76,16 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 4
+ifloat128: 2
+float128: 2
Function: "asin":
float: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "asin_downward":
double: 1
@@ -76,6 +94,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "asin_towardzero":
double: 1
@@ -84,6 +104,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "asin_upward":
double: 1
@@ -92,6 +114,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "asinh":
double: 1
@@ -100,6 +124,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 3
+float128: 3
Function: "asinh_downward":
double: 3
@@ -108,6 +134,8 @@ idouble: 3
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 4
+float128: 4
Function: "asinh_towardzero":
double: 2
@@ -116,6 +144,8 @@ idouble: 2
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: "asinh_upward":
double: 3
@@ -124,6 +154,8 @@ idouble: 3
ifloat: 3
ildouble: 7
ldouble: 7
+ifloat128: 4
+float128: 4
Function: "atan":
double: 1
@@ -132,12 +164,16 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "atan2":
float: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "atan2_downward":
double: 1
@@ -146,6 +182,8 @@ idouble: 1
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: "atan2_towardzero":
double: 1
@@ -154,6 +192,8 @@ idouble: 1
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "atan2_upward":
double: 1
@@ -162,6 +202,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "atan_downward":
double: 1
@@ -170,6 +212,8 @@ idouble: 1
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "atan_towardzero":
double: 1
@@ -178,6 +222,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "atan_upward":
double: 1
@@ -186,6 +232,8 @@ idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "atanh":
double: 2
@@ -194,6 +242,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 3
+float128: 3
Function: "atanh_downward":
double: 3
@@ -202,6 +252,8 @@ idouble: 3
ifloat: 3
ildouble: 3
ldouble: 3
+ifloat128: 4
+float128: 4
Function: "atanh_towardzero":
double: 2
@@ -210,6 +262,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "atanh_upward":
double: 3
@@ -218,30 +272,40 @@ idouble: 3
ifloat: 3
ildouble: 4
ldouble: 4
+ifloat128: 4
+float128: 4
Function: "cabs":
double: 1
idouble: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "cabs_downward":
double: 1
idouble: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "cabs_towardzero":
double: 1
idouble: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "cabs_upward":
double: 1
idouble: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "cacos":
double: 1
@@ -250,6 +314,8 @@ idouble: 1
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Imaginary part of "cacos":
double: 2
@@ -258,6 +324,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: Real part of "cacos_downward":
double: 3
@@ -266,6 +334,8 @@ idouble: 3
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: Imaginary part of "cacos_downward":
double: 5
@@ -274,6 +344,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 6
+float128: 6
Function: Real part of "cacos_towardzero":
double: 3
@@ -282,6 +354,8 @@ idouble: 3
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: Imaginary part of "cacos_towardzero":
double: 5
@@ -290,6 +364,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: Real part of "cacos_upward":
double: 2
@@ -298,6 +374,8 @@ idouble: 2
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: Imaginary part of "cacos_upward":
double: 5
@@ -306,6 +384,8 @@ idouble: 5
ifloat: 5
ildouble: 13
ldouble: 13
+ifloat128: 7
+float128: 7
Function: Real part of "cacosh":
double: 2
@@ -314,6 +394,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: Imaginary part of "cacosh":
double: 1
@@ -322,6 +404,8 @@ idouble: 1
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Real part of "cacosh_downward":
double: 5
@@ -330,6 +414,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: Imaginary part of "cacosh_downward":
double: 3
@@ -338,6 +424,8 @@ idouble: 3
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 4
+float128: 4
Function: Real part of "cacosh_towardzero":
double: 5
@@ -346,6 +434,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: Imaginary part of "cacosh_towardzero":
double: 3
@@ -354,6 +444,8 @@ idouble: 3
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: Real part of "cacosh_upward":
double: 4
@@ -362,6 +454,8 @@ idouble: 4
ifloat: 4
ildouble: 12
ldouble: 12
+ifloat128: 6
+float128: 6
Function: Imaginary part of "cacosh_upward":
double: 3
@@ -370,6 +464,8 @@ idouble: 3
ifloat: 2
ildouble: 8
ldouble: 8
+ifloat128: 4
+float128: 4
Function: "carg":
double: 1
@@ -378,6 +474,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "carg_downward":
double: 1
@@ -386,6 +484,8 @@ idouble: 1
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: "carg_towardzero":
double: 1
@@ -394,6 +494,8 @@ idouble: 1
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "carg_upward":
double: 1
@@ -402,6 +504,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Real part of "casin":
double: 1
@@ -410,6 +514,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Imaginary part of "casin":
double: 2
@@ -418,6 +524,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: Real part of "casin_downward":
double: 3
@@ -426,6 +534,8 @@ idouble: 3
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: Imaginary part of "casin_downward":
double: 5
@@ -434,6 +544,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 6
+float128: 6
Function: Real part of "casin_towardzero":
double: 3
@@ -442,6 +554,8 @@ idouble: 3
ifloat: 1
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: Imaginary part of "casin_towardzero":
double: 5
@@ -450,6 +564,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: Real part of "casin_upward":
double: 3
@@ -458,6 +574,8 @@ idouble: 3
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: Imaginary part of "casin_upward":
double: 5
@@ -466,6 +584,8 @@ idouble: 5
ifloat: 5
ildouble: 13
ldouble: 13
+ifloat128: 7
+float128: 7
Function: Real part of "casinh":
double: 2
@@ -474,6 +594,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: Imaginary part of "casinh":
double: 1
@@ -482,6 +604,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Real part of "casinh_downward":
double: 5
@@ -490,6 +614,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 6
+float128: 6
Function: Imaginary part of "casinh_downward":
double: 3
@@ -498,6 +624,8 @@ idouble: 3
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: Real part of "casinh_towardzero":
double: 5
@@ -506,6 +634,8 @@ idouble: 5
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: Imaginary part of "casinh_towardzero":
double: 3
@@ -514,6 +644,8 @@ idouble: 3
ifloat: 1
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: Real part of "casinh_upward":
double: 5
@@ -522,6 +654,8 @@ idouble: 5
ifloat: 5
ildouble: 13
ldouble: 13
+ifloat128: 7
+float128: 7
Function: Imaginary part of "casinh_upward":
double: 3
@@ -530,6 +664,8 @@ idouble: 3
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: Real part of "catan":
double: 1
@@ -538,6 +674,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: Imaginary part of "catan":
double: 1
@@ -546,6 +684,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "catan_downward":
double: 1
@@ -554,6 +694,8 @@ idouble: 1
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "catan_downward":
double: 2
@@ -562,6 +704,8 @@ idouble: 2
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 2
+float128: 2
Function: Real part of "catan_towardzero":
double: 1
@@ -570,6 +714,8 @@ idouble: 1
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 2
+float128: 2
Function: Imaginary part of "catan_towardzero":
double: 2
@@ -578,6 +724,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Real part of "catan_upward":
double: 1
@@ -586,6 +734,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "catan_upward":
double: 3
@@ -594,6 +744,8 @@ idouble: 3
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 3
+float128: 3
Function: Real part of "catanh":
double: 1
@@ -602,6 +754,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Imaginary part of "catanh":
double: 1
@@ -610,6 +764,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: Real part of "catanh_downward":
double: 2
@@ -618,6 +774,8 @@ idouble: 2
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: Imaginary part of "catanh_downward":
double: 1
@@ -626,6 +784,8 @@ idouble: 1
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "catanh_towardzero":
double: 2
@@ -634,6 +794,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Imaginary part of "catanh_towardzero":
double: 1
@@ -642,6 +804,8 @@ idouble: 1
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 2
+float128: 2
Function: Real part of "catanh_upward":
double: 4
@@ -650,6 +814,8 @@ idouble: 4
ifloat: 4
ildouble: 8
ldouble: 8
+ifloat128: 4
+float128: 4
Function: Imaginary part of "catanh_upward":
double: 1
@@ -658,6 +824,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: "cbrt":
double: 3
@@ -666,6 +834,8 @@ idouble: 3
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "cbrt_downward":
double: 4
@@ -674,6 +844,8 @@ idouble: 4
ifloat: 1
ildouble: 5
ldouble: 5
+ifloat128: 1
+float128: 1
Function: "cbrt_towardzero":
double: 3
@@ -682,6 +854,8 @@ idouble: 3
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "cbrt_upward":
double: 5
@@ -690,6 +864,8 @@ idouble: 5
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "ccos":
double: 1
@@ -698,6 +874,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: Imaginary part of "ccos":
double: 1
@@ -706,6 +884,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "ccos_downward":
double: 1
@@ -714,6 +894,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "ccos_downward":
double: 2
@@ -722,6 +904,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "ccos_towardzero":
double: 1
@@ -730,6 +914,8 @@ idouble: 1
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "ccos_towardzero":
double: 2
@@ -738,6 +924,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "ccos_upward":
double: 1
@@ -746,6 +934,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "ccos_upward":
double: 2
@@ -754,6 +944,8 @@ idouble: 2
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: Real part of "ccosh":
double: 1
@@ -762,6 +954,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: Imaginary part of "ccosh":
double: 1
@@ -770,6 +964,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "ccosh_downward":
double: 1
@@ -778,6 +974,8 @@ idouble: 1
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "ccosh_downward":
double: 2
@@ -786,6 +984,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "ccosh_towardzero":
double: 1
@@ -794,6 +994,8 @@ idouble: 1
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "ccosh_towardzero":
double: 2
@@ -802,6 +1004,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "ccosh_upward":
double: 1
@@ -810,6 +1014,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "ccosh_upward":
double: 2
@@ -818,6 +1024,8 @@ idouble: 2
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: Real part of "cexp":
double: 2
@@ -826,6 +1034,8 @@ idouble: 2
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Imaginary part of "cexp":
double: 1
@@ -834,6 +1044,8 @@ idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "cexp_downward":
double: 1
@@ -842,6 +1054,8 @@ idouble: 1
ifloat: 2
ildouble: 11
ldouble: 11
+ifloat128: 2
+float128: 2
Function: Imaginary part of "cexp_downward":
double: 1
@@ -850,6 +1064,8 @@ idouble: 1
ifloat: 3
ildouble: 11
ldouble: 11
+ifloat128: 2
+float128: 2
Function: Real part of "cexp_towardzero":
double: 1
@@ -858,6 +1074,8 @@ idouble: 1
ifloat: 2
ildouble: 11
ldouble: 11
+ifloat128: 2
+float128: 2
Function: Imaginary part of "cexp_towardzero":
double: 1
@@ -866,6 +1084,8 @@ idouble: 1
ifloat: 3
ildouble: 11
ldouble: 11
+ifloat128: 2
+float128: 2
Function: Real part of "cexp_upward":
double: 1
@@ -874,6 +1094,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "cexp_upward":
double: 1
@@ -882,6 +1104,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Real part of "clog":
double: 3
@@ -890,6 +1114,8 @@ idouble: 3
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: Imaginary part of "clog":
double: 1
@@ -898,6 +1124,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "clog10":
double: 3
@@ -906,6 +1134,8 @@ idouble: 3
ifloat: 4
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Imaginary part of "clog10":
double: 2
@@ -914,6 +1144,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: Real part of "clog10_downward":
double: 6
@@ -922,6 +1154,8 @@ idouble: 6
ifloat: 6
ildouble: 10
ldouble: 10
+ifloat128: 3
+float128: 3
Function: Imaginary part of "clog10_downward":
double: 2
@@ -930,6 +1164,8 @@ idouble: 2
ifloat: 4
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: Real part of "clog10_towardzero":
double: 5
@@ -938,6 +1174,8 @@ idouble: 5
ifloat: 5
ildouble: 9
ldouble: 9
+ifloat128: 4
+float128: 4
Function: Imaginary part of "clog10_towardzero":
double: 2
@@ -946,6 +1184,8 @@ idouble: 2
ifloat: 4
ildouble: 8
ldouble: 8
+ifloat128: 3
+float128: 3
Function: Real part of "clog10_upward":
double: 8
@@ -954,6 +1194,8 @@ idouble: 8
ifloat: 5
ildouble: 10
ldouble: 10
+ifloat128: 4
+float128: 4
Function: Imaginary part of "clog10_upward":
double: 2
@@ -962,6 +1204,8 @@ idouble: 2
ifloat: 4
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: Real part of "clog_downward":
double: 7
@@ -970,6 +1214,8 @@ idouble: 7
ifloat: 5
ildouble: 11
ldouble: 11
+ifloat128: 3
+float128: 3
Function: Imaginary part of "clog_downward":
double: 1
@@ -978,6 +1224,8 @@ idouble: 1
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: Real part of "clog_towardzero":
double: 7
@@ -986,6 +1234,8 @@ idouble: 7
ifloat: 5
ildouble: 10
ldouble: 10
+ifloat128: 3
+float128: 3
Function: Imaginary part of "clog_towardzero":
double: 1
@@ -994,6 +1244,8 @@ idouble: 1
ifloat: 3
ildouble: 7
ldouble: 7
+ifloat128: 2
+float128: 2
Function: Real part of "clog_upward":
double: 8
@@ -1002,6 +1254,8 @@ idouble: 8
ifloat: 5
ildouble: 10
ldouble: 10
+ifloat128: 4
+float128: 4
Function: Imaginary part of "clog_upward":
double: 1
@@ -1010,12 +1264,16 @@ idouble: 1
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: "cos":
float: 3
ifloat: 3
ildouble: 4
ldouble: 4
+ifloat128: 1
+float128: 1
Function: "cos_downward":
double: 1
@@ -1024,6 +1282,8 @@ idouble: 1
ifloat: 4
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: "cos_towardzero":
double: 1
@@ -1032,6 +1292,8 @@ idouble: 1
ifloat: 3
ildouble: 4
ldouble: 4
+ifloat128: 1
+float128: 1
Function: "cos_upward":
double: 1
@@ -1040,6 +1302,8 @@ idouble: 1
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 2
+float128: 2
Function: "cosh":
double: 1
@@ -1048,6 +1312,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "cosh_downward":
double: 1
@@ -1056,6 +1322,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 2
Function: "cosh_towardzero":
double: 1
@@ -1064,6 +1332,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 2
Function: "cosh_upward":
double: 1
@@ -1072,6 +1342,8 @@ idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 3
Function: Real part of "cpow":
double: 2
@@ -1080,12 +1352,16 @@ idouble: 2
ifloat: 5
ildouble: 4
ldouble: 4
+ifloat128: 4
+float128: 4
Function: Imaginary part of "cpow":
float: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 9
+float128: 9
Function: Real part of "cpow_downward":
double: 4
@@ -1094,6 +1370,8 @@ idouble: 4
ifloat: 8
ildouble: 7
ldouble: 7
+ifloat128: 6
+float128: 6
Function: Imaginary part of "cpow_downward":
double: 1
@@ -1102,6 +1380,8 @@ idouble: 1
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: Real part of "cpow_towardzero":
double: 4
@@ -1110,6 +1390,8 @@ idouble: 4
ifloat: 8
ildouble: 8
ldouble: 8
+ifloat128: 6
+float128: 6
Function: Imaginary part of "cpow_towardzero":
double: 1
@@ -1118,6 +1400,8 @@ idouble: 1
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: Real part of "cpow_upward":
double: 4
@@ -1126,6 +1410,8 @@ idouble: 4
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "cpow_upward":
double: 1
@@ -1134,6 +1420,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Real part of "csin":
double: 1
@@ -1142,10 +1430,14 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Imaginary part of "csin":
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: Real part of "csin_downward":
double: 2
@@ -1154,6 +1446,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csin_downward":
double: 1
@@ -1162,6 +1456,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "csin_towardzero":
double: 2
@@ -1170,6 +1466,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csin_towardzero":
double: 1
@@ -1178,6 +1476,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "csin_upward":
double: 2
@@ -1186,6 +1486,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csin_upward":
double: 1
@@ -1194,12 +1496,16 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Real part of "csinh":
float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: Imaginary part of "csinh":
double: 1
@@ -1208,6 +1514,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: Real part of "csinh_downward":
double: 2
@@ -1216,6 +1524,8 @@ idouble: 2
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csinh_downward":
double: 2
@@ -1224,6 +1534,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "csinh_towardzero":
double: 2
@@ -1232,6 +1544,8 @@ idouble: 2
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csinh_towardzero":
double: 2
@@ -1240,6 +1554,8 @@ idouble: 2
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 2
+float128: 2
Function: Real part of "csinh_upward":
double: 1
@@ -1248,6 +1564,8 @@ idouble: 1
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "csinh_upward":
double: 2
@@ -1256,6 +1574,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: Real part of "csqrt":
double: 2
@@ -1264,6 +1584,8 @@ idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Imaginary part of "csqrt":
double: 2
@@ -1272,6 +1594,8 @@ idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: Real part of "csqrt_downward":
double: 5
@@ -1280,6 +1604,8 @@ idouble: 5
ifloat: 4
ildouble: 4
ldouble: 4
+ifloat128: 4
+float128: 4
Function: Imaginary part of "csqrt_downward":
double: 4
@@ -1288,6 +1614,8 @@ idouble: 4
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: Real part of "csqrt_towardzero":
double: 4
@@ -1296,6 +1624,8 @@ idouble: 4
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: Imaginary part of "csqrt_towardzero":
double: 4
@@ -1304,6 +1634,8 @@ idouble: 4
ifloat: 3
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: Real part of "csqrt_upward":
double: 5
@@ -1312,6 +1644,8 @@ idouble: 5
ifloat: 4
ildouble: 12
ldouble: 12
+ifloat128: 4
+float128: 4
Function: Imaginary part of "csqrt_upward":
double: 3
@@ -1320,6 +1654,8 @@ idouble: 3
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 3
+float128: 3
Function: Real part of "ctan":
double: 1
@@ -1328,6 +1664,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "ctan":
double: 2
@@ -1336,6 +1674,8 @@ idouble: 2
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 3
+float128: 3
Function: Real part of "ctan_downward":
double: 6
@@ -1344,6 +1684,8 @@ idouble: 6
ifloat: 5
ildouble: 6
ldouble: 6
+ifloat128: 4
+float128: 4
Function: Imaginary part of "ctan_downward":
double: 2
@@ -1352,6 +1694,8 @@ idouble: 2
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 5
+float128: 5
Function: Real part of "ctan_towardzero":
double: 5
@@ -1360,6 +1704,8 @@ idouble: 5
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 4
+float128: 4
Function: Imaginary part of "ctan_towardzero":
double: 2
@@ -1368,6 +1714,8 @@ idouble: 2
ifloat: 2
ildouble: 13
ldouble: 13
+ifloat128: 5
+float128: 5
Function: Real part of "ctan_upward":
double: 2
@@ -1376,6 +1724,8 @@ idouble: 2
ifloat: 3
ildouble: 7
ldouble: 7
+ifloat128: 5
+float128: 5
Function: Imaginary part of "ctan_upward":
double: 2
@@ -1384,6 +1734,8 @@ idouble: 2
ifloat: 3
ildouble: 10
ldouble: 10
+ifloat128: 5
+float128: 5
Function: Real part of "ctanh":
double: 2
@@ -1392,6 +1744,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Imaginary part of "ctanh":
double: 2
@@ -1400,6 +1754,8 @@ idouble: 2
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: Real part of "ctanh_downward":
double: 4
@@ -1408,6 +1764,8 @@ idouble: 4
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 5
+float128: 5
Function: Imaginary part of "ctanh_downward":
double: 6
@@ -1416,6 +1774,8 @@ idouble: 6
ifloat: 5
ildouble: 6
ldouble: 6
+ifloat128: 4
+float128: 4
Function: Real part of "ctanh_towardzero":
double: 2
@@ -1424,6 +1784,8 @@ idouble: 2
ifloat: 2
ildouble: 13
ldouble: 13
+ifloat128: 5
+float128: 5
Function: Imaginary part of "ctanh_towardzero":
double: 5
@@ -1432,6 +1794,8 @@ idouble: 5
ifloat: 2
ildouble: 10
ldouble: 10
+ifloat128: 3
+float128: 3
Function: Real part of "ctanh_upward":
double: 2
@@ -1440,6 +1804,8 @@ idouble: 2
ifloat: 3
ildouble: 10
ldouble: 10
+ifloat128: 5
+float128: 5
Function: Imaginary part of "ctanh_upward":
double: 2
@@ -1448,6 +1814,8 @@ idouble: 2
ifloat: 3
ildouble: 10
ldouble: 10
+ifloat128: 5
+float128: 5
Function: "erf":
double: 1
@@ -1456,6 +1824,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "erf_downward":
double: 1
@@ -1464,6 +1834,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "erf_towardzero":
double: 1
@@ -1472,6 +1844,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "erf_upward":
double: 1
@@ -1480,6 +1854,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "erfc":
double: 2
@@ -1488,6 +1864,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "erfc_downward":
double: 3
@@ -1496,6 +1874,8 @@ idouble: 3
ifloat: 4
ildouble: 10
ldouble: 10
+ifloat128: 5
+float128: 5
Function: "erfc_towardzero":
double: 3
@@ -1504,6 +1884,8 @@ idouble: 3
ifloat: 3
ildouble: 9
ldouble: 9
+ifloat128: 4
+float128: 4
Function: "erfc_upward":
double: 3
@@ -1512,6 +1894,8 @@ idouble: 3
ifloat: 4
ildouble: 7
ldouble: 7
+ifloat128: 5
+float128: 5
Function: "exp":
double: 1
@@ -1520,12 +1904,16 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "exp10":
double: 2
idouble: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "exp10_downward":
double: 2
@@ -1534,6 +1922,8 @@ idouble: 2
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 3
+float128: 3
Function: "exp10_towardzero":
double: 2
@@ -1542,6 +1932,8 @@ idouble: 2
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 3
+float128: 3
Function: "exp10_upward":
double: 2
@@ -1550,6 +1942,8 @@ idouble: 2
ifloat: 1
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: "exp2":
double: 1
@@ -1558,6 +1952,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "exp2_downward":
double: 1
@@ -1566,6 +1962,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "exp2_towardzero":
double: 1
@@ -1574,6 +1972,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "exp2_upward":
double: 1
@@ -1582,6 +1982,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "exp_downward":
double: 1
@@ -1610,6 +2012,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "expm1_downward":
double: 1
@@ -1618,6 +2022,8 @@ idouble: 1
ifloat: 1
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "expm1_towardzero":
double: 1
@@ -1626,6 +2032,8 @@ idouble: 1
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 4
+float128: 4
Function: "expm1_upward":
double: 1
@@ -1634,6 +2042,8 @@ idouble: 1
ifloat: 1
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "fma":
ildouble: 1
@@ -1674,6 +2084,8 @@ idouble: 3
ifloat: 4
ildouble: 3
ldouble: 3
+ifloat128: 9
+float128: 9
Function: "gamma_downward":
double: 4
@@ -1682,6 +2094,8 @@ idouble: 4
ifloat: 4
ildouble: 15
ldouble: 15
+ifloat128: 9
+float128: 9
Function: "gamma_towardzero":
double: 4
@@ -1690,6 +2104,8 @@ idouble: 4
ifloat: 3
ildouble: 16
ldouble: 16
+ifloat128: 9
+float128: 9
Function: "gamma_upward":
double: 4
@@ -1698,30 +2114,40 @@ idouble: 4
ifloat: 5
ildouble: 11
ldouble: 11
+ifloat128: 9
+float128: 9
Function: "hypot":
double: 1
idouble: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "hypot_downward":
double: 1
idouble: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "hypot_towardzero":
double: 1
idouble: 1
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "hypot_upward":
double: 1
idouble: 1
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "j0":
double: 2
@@ -1730,6 +2156,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "j0_downward":
double: 2
@@ -1738,6 +2166,8 @@ idouble: 2
ifloat: 3
ildouble: 11
ldouble: 11
+ifloat128: 4
+float128: 4
Function: "j0_towardzero":
double: 2
@@ -1746,6 +2176,8 @@ idouble: 2
ifloat: 1
ildouble: 8
ldouble: 8
+ifloat128: 2
+float128: 2
Function: "j0_upward":
double: 3
@@ -1754,6 +2186,8 @@ idouble: 3
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 5
+float128: 5
Function: "j1":
double: 1
@@ -1762,6 +2196,8 @@ idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 4
+float128: 4
Function: "j1_downward":
double: 3
@@ -1770,6 +2206,8 @@ idouble: 3
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 4
+float128: 4
Function: "j1_towardzero":
double: 3
@@ -1778,6 +2216,8 @@ idouble: 3
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 4
+float128: 4
Function: "j1_upward":
double: 3
@@ -1786,6 +2226,8 @@ idouble: 3
ifloat: 4
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "jn":
double: 4
@@ -1794,6 +2236,8 @@ idouble: 4
ifloat: 4
ildouble: 4
ldouble: 4
+ifloat128: 7
+float128: 7
Function: "jn_downward":
double: 4
@@ -1802,6 +2246,8 @@ idouble: 4
ifloat: 5
ildouble: 7
ldouble: 7
+ifloat128: 8
+float128: 8
Function: "jn_towardzero":
double: 4
@@ -1810,6 +2256,8 @@ idouble: 4
ifloat: 5
ildouble: 7
ldouble: 7
+ifloat128: 8
+float128: 8
Function: "jn_upward":
double: 5
@@ -1818,6 +2266,8 @@ idouble: 5
ifloat: 4
ildouble: 5
ldouble: 5
+ifloat128: 7
+float128: 7
Function: "lgamma":
double: 3
@@ -1826,6 +2276,8 @@ idouble: 3
ifloat: 4
ildouble: 3
ldouble: 3
+ifloat128: 9
+float128: 9
Function: "lgamma_downward":
double: 4
@@ -1834,6 +2286,8 @@ idouble: 4
ifloat: 4
ildouble: 15
ldouble: 15
+ifloat128: 9
+float128: 9
Function: "lgamma_towardzero":
double: 4
@@ -1842,6 +2296,8 @@ idouble: 4
ifloat: 3
ildouble: 16
ldouble: 16
+ifloat128: 9
+float128: 9
Function: "lgamma_upward":
double: 4
@@ -1850,12 +2306,16 @@ idouble: 4
ifloat: 5
ildouble: 11
ldouble: 11
+ifloat128: 9
+float128: 9
Function: "log":
float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "log10":
double: 2
@@ -1864,6 +2324,8 @@ idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "log10_downward":
double: 2
@@ -1872,6 +2334,8 @@ idouble: 2
ifloat: 3
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "log10_towardzero":
double: 2
@@ -1880,6 +2344,8 @@ idouble: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "log10_upward":
double: 2
@@ -1888,6 +2354,8 @@ idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "log1p":
double: 1
@@ -1896,6 +2364,8 @@ idouble: 1
ifloat: 1
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "log1p_downward":
double: 1
@@ -1904,6 +2374,8 @@ idouble: 1
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 3
+float128: 3
Function: "log1p_towardzero":
double: 2
@@ -1912,6 +2384,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 3
+float128: 3
Function: "log1p_upward":
double: 2
@@ -1920,6 +2394,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "log2":
double: 1
@@ -1928,6 +2404,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "log2_downward":
double: 3
@@ -1936,6 +2414,8 @@ idouble: 3
ifloat: 3
ildouble: 2
ldouble: 2
+ifloat128: 3
+float128: 3
Function: "log2_towardzero":
double: 2
@@ -1944,6 +2424,8 @@ idouble: 2
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 1
+float128: 1
Function: "log2_upward":
double: 3
@@ -1952,18 +2434,24 @@ idouble: 3
ifloat: 3
ildouble: 4
ldouble: 4
+ifloat128: 1
+float128: 1
Function: "log_downward":
float: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "log_towardzero":
float: 2
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "log_upward":
double: 1
@@ -1972,6 +2460,8 @@ idouble: 1
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "nextafter_downward":
ildouble: 1
@@ -1986,12 +2476,16 @@ float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "pow10":
double: 2
idouble: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "pow10_downward":
double: 2
@@ -2000,6 +2494,8 @@ idouble: 2
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 3
+float128: 3
Function: "pow10_towardzero":
double: 2
@@ -2008,6 +2504,8 @@ idouble: 2
ifloat: 1
ildouble: 9
ldouble: 9
+ifloat128: 3
+float128: 3
Function: "pow10_upward":
double: 2
@@ -2016,6 +2514,8 @@ idouble: 2
ifloat: 1
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: "pow_downward":
double: 1
@@ -2024,6 +2524,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "pow_towardzero":
double: 1
@@ -2032,6 +2534,8 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "pow_upward":
double: 1
@@ -2040,12 +2544,16 @@ idouble: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "sin":
float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "sin_downward":
double: 1
@@ -2054,6 +2562,8 @@ idouble: 1
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: "sin_towardzero":
double: 1
@@ -2062,6 +2572,8 @@ idouble: 1
ifloat: 1
ildouble: 4
ldouble: 4
+ifloat128: 2
+float128: 2
Function: "sin_upward":
double: 1
@@ -2070,12 +2582,16 @@ idouble: 1
ifloat: 2
ildouble: 5
ldouble: 5
+ifloat128: 3
+float128: 3
Function: "sincos":
float: 1
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 1
+float128: 1
Function: "sincos_downward":
double: 1
@@ -2084,6 +2600,8 @@ idouble: 1
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: "sincos_towardzero":
double: 1
@@ -2092,6 +2610,8 @@ idouble: 1
ifloat: 1
ildouble: 7
ldouble: 7
+ifloat128: 2
+float128: 2
Function: "sincos_upward":
double: 1
@@ -2100,6 +2620,8 @@ idouble: 1
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 3
+float128: 3
Function: "sinh":
double: 2
@@ -2108,6 +2630,8 @@ idouble: 2
ifloat: 2
ildouble: 3
ldouble: 3
+ifloat128: 2
+float128: 2
Function: "sinh_downward":
double: 3
@@ -2116,6 +2640,8 @@ idouble: 3
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "sinh_towardzero":
double: 2
@@ -2124,6 +2650,8 @@ idouble: 2
ifloat: 2
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "sinh_upward":
double: 3
@@ -2132,6 +2660,8 @@ idouble: 3
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 4
+float128: 4
Function: "sqrt":
ildouble: 1
@@ -2154,6 +2684,8 @@ float: 3
ifloat: 3
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "tan_downward":
double: 1
@@ -2162,6 +2694,8 @@ idouble: 1
ifloat: 3
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "tan_towardzero":
double: 1
@@ -2170,6 +2704,8 @@ idouble: 1
ifloat: 3
ildouble: 2
ldouble: 2
+ifloat128: 1
+float128: 1
Function: "tan_upward":
double: 1
@@ -2178,6 +2714,8 @@ idouble: 1
ifloat: 3
ildouble: 3
ldouble: 3
+ifloat128: 1
+float128: 1
Function: "tanh":
double: 2
@@ -2186,6 +2724,8 @@ idouble: 2
ifloat: 2
ildouble: 1
ldouble: 1
+ifloat128: 2
+float128: 2
Function: "tanh_downward":
double: 3
@@ -2194,6 +2734,8 @@ idouble: 3
ifloat: 3
ildouble: 4
ldouble: 4
+ifloat128: 4
+float128: 4
Function: "tanh_towardzero":
double: 2
@@ -2202,6 +2744,8 @@ idouble: 2
ifloat: 2
ildouble: 4
ldouble: 4
+ifloat128: 3
+float128: 3
Function: "tanh_upward":
double: 3
@@ -2210,6 +2754,8 @@ idouble: 3
ifloat: 3
ildouble: 6
ldouble: 6
+ifloat128: 3
+float128: 3
Function: "tgamma":
double: 5
@@ -2218,6 +2764,8 @@ idouble: 5
ifloat: 4
ildouble: 5
ldouble: 5
+ifloat128: 4
+float128: 4
Function: "tgamma_downward":
double: 5
@@ -2226,6 +2774,8 @@ idouble: 5
ifloat: 5
ildouble: 6
ldouble: 6
+ifloat128: 5
+float128: 5
Function: "tgamma_towardzero":
double: 5
@@ -2234,6 +2784,8 @@ idouble: 5
ifloat: 4
ildouble: 5
ldouble: 5
+ifloat128: 5
+float128: 5
Function: "tgamma_upward":
double: 4
@@ -2242,6 +2794,8 @@ idouble: 4
ifloat: 4
ildouble: 5
ldouble: 5
+ifloat128: 4
+float128: 4
Function: "y0":
double: 2
@@ -2250,6 +2804,8 @@ idouble: 2
ifloat: 1
ildouble: 1
ldouble: 1
+ifloat128: 3
+float128: 3
Function: "y0_downward":
double: 3
@@ -2258,6 +2814,8 @@ idouble: 3
ifloat: 2
ildouble: 10
ldouble: 10
+ifloat128: 4
+float128: 4
Function: "y0_towardzero":
double: 3
@@ -2266,6 +2824,8 @@ idouble: 3
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 3
+float128: 3
Function: "y0_upward":
double: 2
@@ -2274,6 +2834,8 @@ idouble: 2
ifloat: 3
ildouble: 9
ldouble: 9
+ifloat128: 3
+float128: 3
Function: "y1":
double: 3
@@ -2282,6 +2844,8 @@ idouble: 3
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 2
+float128: 2
Function: "y1_downward":
double: 3
@@ -2290,6 +2854,8 @@ idouble: 3
ifloat: 2
ildouble: 7
ldouble: 7
+ifloat128: 4
+float128: 4
Function: "y1_towardzero":
double: 3
@@ -2298,6 +2864,8 @@ idouble: 3
ifloat: 2
ildouble: 9
ldouble: 9
+ifloat128: 2
+float128: 2
Function: "y1_upward":
double: 5
@@ -2306,6 +2874,8 @@ idouble: 5
ifloat: 2
ildouble: 9
ldouble: 9
+ifloat128: 5
+float128: 5
Function: "yn":
double: 3
@@ -2314,6 +2884,8 @@ idouble: 3
ifloat: 2
ildouble: 2
ldouble: 2
+ifloat128: 5
+float128: 5
Function: "yn_downward":
double: 3
@@ -2322,6 +2894,8 @@ idouble: 3
ifloat: 2
ildouble: 10
ldouble: 10
+ifloat128: 5
+float128: 5
Function: "yn_towardzero":
double: 3
@@ -2330,6 +2904,8 @@ idouble: 3
ifloat: 3
ildouble: 8
ldouble: 8
+ifloat128: 5
+float128: 5
Function: "yn_upward":
double: 4
@@ -2338,5 +2914,7 @@ idouble: 4
ifloat: 3
ildouble: 9
ldouble: 9
+ifloat128: 5
+float128: 5
# end of automatic generation
diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h
index 3c71275..35b0d8e 100644
--- a/sysdeps/powerpc/fpu/math_private.h
+++ b/sysdeps/powerpc/fpu/math_private.h
@@ -23,8 +23,19 @@
#include <ldsodefs.h>
#include <dl-procinfo.h>
#include <fenv_private.h>
+
#include_next <math_private.h>
+#if defined _ARCH_PWR9 && __HAVE_DISTINCT_FLOAT128
+extern __always_inline _Float128
+__ieee754_sqrtf128 (_Float128 __x)
+{
+ _Float128 __z;
+ asm ("xssqrtqp %0,%1" : "=wq" (__z) : "wq" (__x));
+ return __z;
+}
+#endif
+
extern double __slow_ieee754_sqrt (double);
extern __always_inline double
__ieee754_sqrt (double __x)
diff --git a/sysdeps/powerpc/powerpc64le/Implies-before b/sysdeps/powerpc/powerpc64le/Implies-before
new file mode 100644
index 0000000..4806514
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/Implies-before
@@ -0,0 +1 @@
+ieee754/float128
diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile
new file mode 100644
index 0000000..0e3c449
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/Makefile
@@ -0,0 +1,48 @@
+# When building float128 we need to ensure -mfloat128 is
+# passed to all such object files.
+
+ifeq ($(subdir),math)
+# sqrtf128 requires emulation on POWER8 and below.
+CPPFLAGS += -I../soft-fp
+
+# float128 requires adding a handful of extra flags.
+%f128.o %f128.os %f128_r.o %f128_r.os: CFLAGS += -mfloat128
+$(objpfx)test-float128%.o $(objpfx)test-float128%.os: CFLAGS += -mfloat128
+$(objpfx)test-ifloat128%.o $(objpfx)test-ifloat128%.os: CFLAGS += -mfloat128
+CFLAGS-libm-test-support-float128.c += -mfloat128
+endif
+
+# Append flags to string <-> _Float128 routines.
+ifneq ($(filter $(subdir),wcsmbs stdlib),)
+%f128.o %f128.os %f128_l.o %f128_l.os %f128_nan.o %f128_nan.os %float1282mpn.o %float1282mpn.os %mpn2float128.o %mpn2float128.os: CFLAGS += -mfloat128
+CFLAGS-bug-strtod.c += -mfloat128
+CFLAGS-bug-strtod2.c += -mfloat128
+CFLAGS-tst-strtod-round.c += -mfloat128
+CFLAGS-tst-wcstod-round.c += -mfloat128
+CFLAGS-tst-strtod6.c += -mfloat128
+CFLAGS-tst-strfrom.c += -mfloat128
+CFLAGS-tst-strfrom-locale.c += -mfloat128
+CFLAGS-strfrom-skeleton.c += -mfloat128
+
+# The strfrom class of functions call __printf_fp in order to convert the
+# floating-point value to characters. This requires the value of IO_MTSAFE_IO.
+CFLAGS-strfromf128.c += $(libio-mtsafe)
+
+# When building glibc with support for _Float128, the powers of ten tables in
+# fpioconst.c and in the string conversion functions must be extended.
+sysdep-CFLAGS += $(sysdep-CFLAGS-$(<F))
+sysdep-CFLAGS-fpioconst.c += -mfloat128
+sysdep-CFLAGS-strtod_l.c += -mfloat128
+sysdep-CFLAGS-strtof_l.c += -mfloat128
+sysdep-CFLAGS-strtold_l.c += -mfloat128
+sysdep-CFLAGS-wcstod_l.c += -mfloat128
+sysdep-CFLAGS-wcstof_l.c += -mfloat128
+sysdep-CFLAGS-wcstold_l.c += -mfloat128
+endif
+
+# Append flags to printf routines.
+ifeq ($(subdir),stdio-common)
+CFLAGS-printf_fp.c = -mfloat128
+CFLAGS-printf_fphex.c = -mfloat128
+CFLAGS-printf_size.c = -mfloat128
+endif
diff --git a/sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c b/sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c
new file mode 100644
index 0000000..1ed58e5
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c
@@ -0,0 +1,57 @@
+/* soft-fp sqrt for _Float128
+ Return sqrt(a)
+ 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.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file into
+ combinations with other programs, and to distribute those
+ combinations without any restriction coming from the use of this
+ file. (The Lesser General Public License restrictions do apply in
+ other respects; for example, they cover modification of the file,
+ and distribution when not linked into a combine executable.)
+
+ 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/>. */
+
+/* Unavoidable hacks since TFmode is assumed to be binary128. */
+#define TFtype KFtype
+#define TF KF
+
+#include <soft-fp.h>
+#include <quad.h>
+
+__float128
+__ieee754_sqrtf128 (__float128 a)
+{
+#ifndef _ARCH_PWR9
+ FP_DECL_EX;
+ FP_DECL_Q (A);
+ FP_DECL_Q (R);
+ __float128 r;
+
+ FP_INIT_ROUNDMODE;
+ FP_UNPACK_Q (A, a);
+ FP_SQRT_Q (R, A);
+ FP_PACK_Q (r, R);
+ FP_HANDLE_EXCEPTIONS;
+ return r;
+#else
+ __float128 z;
+ asm ("xssqrtqp %0,%1" : "=wq" (z) : "wq" (a));
+ return z;
+#endif
+}
+strong_alias (__ieee754_sqrtf128, __sqrtf128_finite)
diff --git a/sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h b/sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h
new file mode 100644
index 0000000..b5448d8
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h
@@ -0,0 +1,158 @@
+/* Decide whether to use 64 or 32-bit types to do the emulation. If we are
+ doing IEEE-128 with VSX, use 64-bit emulation even if we are compiling for a
+ 32-bit target. */
+
+#if defined(_ARCH_PPC64) || defined(__VSX__) || defined(__FLOAT128__)
+#define _FP_W_TYPE_SIZE 64
+#define _FP_W_TYPE unsigned long long
+#define _FP_WS_TYPE signed long long
+#define _FP_I_TYPE long long
+
+#ifdef _ARCH_PPC64
+typedef int TItype __attribute__ ((mode (TI)));
+typedef unsigned int UTItype __attribute__ ((mode (TI)));
+
+#define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype))
+#endif
+
+#else /* 32-bits */
+#define _FP_W_TYPE_SIZE 32
+#define _FP_W_TYPE unsigned int
+#define _FP_WS_TYPE signed int
+#define _FP_I_TYPE int
+#endif /* 32-bits */
+
+/* The type of the result of a floating point comparison. This must
+ match `__libgcc_cmp_return__' in GCC for the target. */
+typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
+#define CMPtype __gcc_CMPtype
+
+#define _FP_MUL_MEAT_S(R,X,Y) \
+ _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+
+#if (_FP_W_TYPE_SIZE==64)
+#define _FP_MUL_MEAT_D(R,X,Y) \
+ _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y) \
+ _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+#else
+#define _FP_MUL_MEAT_D(R,X,Y) \
+ _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y) \
+ _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+#endif
+
+#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y)
+
+#if (_FP_W_TYPE_SIZE==64)
+#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
+#else
+#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
+#endif
+
+#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
+
+#if (_FP_W_TYPE_SIZE==64)
+#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1)
+#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1
+#else
+#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#endif
+
+#define _FP_NANSIGN_S 0
+#define _FP_NANSIGN_D 0
+#define _FP_NANSIGN_Q 0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+/* Someone please check this. */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
+ do { \
+ if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
+ && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
+ { \
+ R##_s = Y##_s; \
+ _FP_FRAC_COPY_##wc(R,Y); \
+ } \
+ else \
+ { \
+ R##_s = X##_s; \
+ _FP_FRAC_COPY_##wc(R,X); \
+ } \
+ R##_c = FP_CLS_NAN; \
+ } while (0)
+
+#define _FP_TININESS_AFTER_ROUNDING 0
+
+#define __LITTLE_ENDIAN 1234
+#define __BIG_ENDIAN 4321
+
+#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
+# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+# error "Both BIG_ENDIAN and LITTLE_ENDIAN defined!"
+# endif
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+# define __BYTE_ORDER __LITTLE_ENDIAN
+# else
+# error "Cannot determine current byte order"
+# endif
+#endif
+
+/* Only provide exception support if we have hardware floating point using
+ floating point registers and we can execute the mtfsf instruction. This
+ would only be true if we are using the emulation routines for IEEE 128-bit
+ floating point on pre-ISA 3.0 machines without the IEEE 128-bit floating
+ point support. */
+
+#ifdef __FLOAT128__
+#define ISA_BIT(x) (1LL << (63 - x))
+
+/* Use the same bits of the FPSCR. */
+# define FP_EX_INVALID ISA_BIT(34)
+# define FP_EX_OVERFLOW ISA_BIT(35)
+# define FP_EX_UNDERFLOW ISA_BIT(36)
+# define FP_EX_DIVZERO ISA_BIT(37)
+# define FP_EX_INEXACT ISA_BIT(38)
+# define FP_EX_ALL (FP_EX_INVALID | FP_EX_OVERFLOW \
+ | FP_EX_UNDERFLOW | FP_EX_DIVZERO \
+ | FP_EX_INEXACT)
+
+void __sfp_handle_exceptions (int);
+
+# define FP_HANDLE_EXCEPTIONS \
+ do { \
+ if (__builtin_expect (_fex, 0)) \
+ __sfp_handle_exceptions (_fex); \
+ } while (0);
+
+/* The FP_EX_* bits track whether the exception has occurred. This macro
+ must set the FP_EX_* bits of those exceptions which are configured to
+ trap. The FPSCR bit which indicates this is 22 ISA bits above the
+ respective FP_EX_* bit. Note, the ISA labels bits from msb to lsb,
+ so 22 ISA bits above is 22 bits below when counted from the lsb. */
+# define FP_TRAPPING_EXCEPTIONS ((_fpscr.i << 22) & FP_EX_ALL)
+
+# define FP_RND_NEAREST 0x0
+# define FP_RND_ZERO 0x1
+# define FP_RND_PINF 0x2
+# define FP_RND_MINF 0x3
+# define FP_RND_MASK 0x3
+
+# define _FP_DECL_EX \
+ union { unsigned long long i; double d; } _fpscr __attribute__ ((unused)) = \
+ { .i = FP_RND_NEAREST }
+
+#define FP_INIT_ROUNDMODE \
+ do { \
+ __asm__ __volatile__ ("mffs %0" \
+ : "=f" (_fpscr.d)); \
+ } while (0)
+
+# define FP_ROUNDMODE (_fpscr.i & FP_RND_MASK)
+#endif /* !__FLOAT128__ */
diff --git a/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c
new file mode 100644
index 0000000..769d3f8
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c
@@ -0,0 +1,36 @@
+/* POWER9 sqrt for _Float128
+ Return sqrt(a)
+ 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.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file into
+ combinations with other programs, and to distribute those
+ combinations without any restriction coming from the use of this
+ file. (The Lesser General Public License restrictions do apply in
+ other respects; for example, they cover modification of the file,
+ and distribution when not linked into a combine executable.)
+
+ 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/>. */
+
+__float128
+__ieee754_sqrtf128 (__float128 a)
+{
+ __float128 z;
+ asm ("xssqrtqp %0,%1" : "=wq" (z) : "wq" (a));
+ return z;
+}
+strong_alias (__ieee754_sqrtf128, __sqrtf128_finite)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
index c761221..c36bed2 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist
@@ -2179,9 +2179,16 @@ GLIBC_2.24 GLIBC_2.24 A
GLIBC_2.24 quick_exit F
GLIBC_2.25 GLIBC_2.25 A
GLIBC_2.25 __explicit_bzero_chk F
+GLIBC_2.25 __strtof128_internal F
+GLIBC_2.25 __wcstof128_internal F
GLIBC_2.25 explicit_bzero F
GLIBC_2.25 getentropy F
GLIBC_2.25 getrandom F
GLIBC_2.25 strfromd F
GLIBC_2.25 strfromf F
+GLIBC_2.25 strfromf128 F
GLIBC_2.25 strfroml F
+GLIBC_2.25 strtof128 F
+GLIBC_2.25 strtof128_l F
+GLIBC_2.25 wcstof128 F
+GLIBC_2.25 wcstof128_l F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index 9658ded..68fab09 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -416,54 +416,191 @@ GLIBC_2.24 nextup F
GLIBC_2.24 nextupf F
GLIBC_2.24 nextupl F
GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 __acosf128_finite F
+GLIBC_2.25 __acoshf128_finite F
+GLIBC_2.25 __asinf128_finite F
+GLIBC_2.25 __atan2f128_finite F
+GLIBC_2.25 __atanhf128_finite F
+GLIBC_2.25 __coshf128_finite F
+GLIBC_2.25 __exp10f128_finite F
+GLIBC_2.25 __exp2f128_finite F
+GLIBC_2.25 __expf128_finite F
GLIBC_2.25 __fe_dfl_mode D 0x8
+GLIBC_2.25 __finitef128 F
+GLIBC_2.25 __fmodf128_finite F
+GLIBC_2.25 __fpclassifyf128 F
+GLIBC_2.25 __gammaf128_r_finite F
+GLIBC_2.25 __hypotf128_finite F
GLIBC_2.25 __iscanonicall F
GLIBC_2.25 __iseqsig F
GLIBC_2.25 __iseqsigf F
+GLIBC_2.25 __iseqsigf128 F
GLIBC_2.25 __iseqsigl F
+GLIBC_2.25 __isinff128 F
+GLIBC_2.25 __isnanf128 F
+GLIBC_2.25 __issignalingf128 F
+GLIBC_2.25 __j0f128_finite F
+GLIBC_2.25 __j1f128_finite F
+GLIBC_2.25 __jnf128_finite F
+GLIBC_2.25 __lgammaf128_r_finite F
+GLIBC_2.25 __log10f128_finite F
+GLIBC_2.25 __log2f128_finite F
+GLIBC_2.25 __logf128_finite F
+GLIBC_2.25 __powf128_finite F
+GLIBC_2.25 __remainderf128_finite F
+GLIBC_2.25 __signbitf128 F
+GLIBC_2.25 __sinhf128_finite F
+GLIBC_2.25 __sqrtf128_finite F
+GLIBC_2.25 __y0f128_finite F
+GLIBC_2.25 __y1f128_finite F
+GLIBC_2.25 __ynf128_finite F
+GLIBC_2.25 acosf128 F
+GLIBC_2.25 acoshf128 F
+GLIBC_2.25 asinf128 F
+GLIBC_2.25 asinhf128 F
+GLIBC_2.25 atan2f128 F
+GLIBC_2.25 atanf128 F
+GLIBC_2.25 atanhf128 F
+GLIBC_2.25 cabsf128 F
+GLIBC_2.25 cacosf128 F
+GLIBC_2.25 cacoshf128 F
GLIBC_2.25 canonicalize F
GLIBC_2.25 canonicalizef F
+GLIBC_2.25 canonicalizef128 F
GLIBC_2.25 canonicalizel F
+GLIBC_2.25 cargf128 F
+GLIBC_2.25 casinf128 F
+GLIBC_2.25 casinhf128 F
+GLIBC_2.25 catanf128 F
+GLIBC_2.25 catanhf128 F
+GLIBC_2.25 cbrtf128 F
+GLIBC_2.25 ccosf128 F
+GLIBC_2.25 ccoshf128 F
+GLIBC_2.25 ceilf128 F
+GLIBC_2.25 cexpf128 F
+GLIBC_2.25 cimagf128 F
+GLIBC_2.25 clog10f128 F
+GLIBC_2.25 clogf128 F
+GLIBC_2.25 conjf128 F
+GLIBC_2.25 copysignf128 F
+GLIBC_2.25 cosf128 F
+GLIBC_2.25 coshf128 F
+GLIBC_2.25 cpowf128 F
+GLIBC_2.25 cprojf128 F
+GLIBC_2.25 crealf128 F
+GLIBC_2.25 csinf128 F
+GLIBC_2.25 csinhf128 F
+GLIBC_2.25 csqrtf128 F
+GLIBC_2.25 ctanf128 F
+GLIBC_2.25 ctanhf128 F
+GLIBC_2.25 erfcf128 F
+GLIBC_2.25 erff128 F
+GLIBC_2.25 exp10f128 F
+GLIBC_2.25 exp2f128 F
+GLIBC_2.25 expf128 F
+GLIBC_2.25 expm1f128 F
+GLIBC_2.25 fabsf128 F
+GLIBC_2.25 fdimf128 F
GLIBC_2.25 fegetmode F
GLIBC_2.25 fesetexcept F
GLIBC_2.25 fesetmode F
GLIBC_2.25 fetestexceptflag F
+GLIBC_2.25 floorf128 F
+GLIBC_2.25 fmaf128 F
+GLIBC_2.25 fmaxf128 F
GLIBC_2.25 fmaxmag F
GLIBC_2.25 fmaxmagf F
+GLIBC_2.25 fmaxmagf128 F
GLIBC_2.25 fmaxmagl F
+GLIBC_2.25 fminf128 F
GLIBC_2.25 fminmag F
GLIBC_2.25 fminmagf F
+GLIBC_2.25 fminmagf128 F
GLIBC_2.25 fminmagl F
+GLIBC_2.25 fmodf128 F
+GLIBC_2.25 frexpf128 F
GLIBC_2.25 fromfp F
GLIBC_2.25 fromfpf F
+GLIBC_2.25 fromfpf128 F
GLIBC_2.25 fromfpl F
GLIBC_2.25 fromfpx F
GLIBC_2.25 fromfpxf F
+GLIBC_2.25 fromfpxf128 F
GLIBC_2.25 fromfpxl F
GLIBC_2.25 getpayload F
GLIBC_2.25 getpayloadf F
+GLIBC_2.25 getpayloadf128 F
GLIBC_2.25 getpayloadl F
+GLIBC_2.25 hypotf128 F
+GLIBC_2.25 ilogbf128 F
+GLIBC_2.25 j0f128 F
+GLIBC_2.25 j1f128 F
+GLIBC_2.25 jnf128 F
+GLIBC_2.25 ldexpf128 F
+GLIBC_2.25 lgammaf128 F
+GLIBC_2.25 lgammaf128_r F
GLIBC_2.25 llogb F
GLIBC_2.25 llogbf F
+GLIBC_2.25 llogbf128 F
GLIBC_2.25 llogbl F
+GLIBC_2.25 llrintf128 F
+GLIBC_2.25 llroundf128 F
+GLIBC_2.25 log10f128 F
+GLIBC_2.25 log1pf128 F
+GLIBC_2.25 log2f128 F
+GLIBC_2.25 logbf128 F
+GLIBC_2.25 logf128 F
+GLIBC_2.25 lrintf128 F
+GLIBC_2.25 lroundf128 F
+GLIBC_2.25 modff128 F
+GLIBC_2.25 nanf128 F
+GLIBC_2.25 nearbyintf128 F
+GLIBC_2.25 nextafterf128 F
+GLIBC_2.25 nextdownf128 F
+GLIBC_2.25 nextupf128 F
+GLIBC_2.25 powf128 F
+GLIBC_2.25 remainderf128 F
+GLIBC_2.25 remquof128 F
+GLIBC_2.25 rintf128 F
GLIBC_2.25 roundeven F
GLIBC_2.25 roundevenf F
+GLIBC_2.25 roundevenf128 F
GLIBC_2.25 roundevenl F
+GLIBC_2.25 roundf128 F
+GLIBC_2.25 scalblnf128 F
+GLIBC_2.25 scalbnf128 F
GLIBC_2.25 setpayload F
GLIBC_2.25 setpayloadf F
+GLIBC_2.25 setpayloadf128 F
GLIBC_2.25 setpayloadl F
GLIBC_2.25 setpayloadsig F
GLIBC_2.25 setpayloadsigf F
+GLIBC_2.25 setpayloadsigf128 F
GLIBC_2.25 setpayloadsigl F
+GLIBC_2.25 sincosf128 F
+GLIBC_2.25 sinf128 F
+GLIBC_2.25 sinhf128 F
+GLIBC_2.25 sqrtf128 F
+GLIBC_2.25 tanf128 F
+GLIBC_2.25 tanhf128 F
+GLIBC_2.25 tgammaf128 F
GLIBC_2.25 totalorder F
GLIBC_2.25 totalorderf F
+GLIBC_2.25 totalorderf128 F
GLIBC_2.25 totalorderl F
GLIBC_2.25 totalordermag F
GLIBC_2.25 totalordermagf F
+GLIBC_2.25 totalordermagf128 F
GLIBC_2.25 totalordermagl F
+GLIBC_2.25 truncf128 F
GLIBC_2.25 ufromfp F
GLIBC_2.25 ufromfpf F
+GLIBC_2.25 ufromfpf128 F
GLIBC_2.25 ufromfpl F
GLIBC_2.25 ufromfpx F
GLIBC_2.25 ufromfpxf F
+GLIBC_2.25 ufromfpxf128 F
GLIBC_2.25 ufromfpxl F
+GLIBC_2.25 y0f128 F
+GLIBC_2.25 y1f128 F
+GLIBC_2.25 ynf128 F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h
new file mode 100644
index 0000000..c47621c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h
@@ -0,0 +1,2 @@
+/* ABI version for _Float128 ABI introduction. */
+#define FLOAT128_VERSION GLIBC_2.25
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=6675666a8233b38c726df28d4c61d6e806585215
commit 6675666a8233b38c726df28d4c61d6e806585215
Author: Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Date: Tue Oct 11 13:50:19 2016 -0300
powerpc64le: Require gcc >= 6.2 for powerpc64le
On powerpc64le, support for __float128 will start to be built by default,
which requires gcc versions greater than or equal to 6.2.
Tested for ppc64 (still works with older compilers) and ppc64le.
2017-04-28 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
* sysdeps/powerpc/powerpc64le/configure.ac: New file with test for
the required minimum gcc version.
* sysdeps/powerpc/powerpc64le/configure: New, auto-generated file.
diff --git a/sysdeps/powerpc/powerpc64le/configure b/sysdeps/powerpc/powerpc64le/configure
new file mode 100644
index 0000000..f5f1069
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/configure
@@ -0,0 +1,71 @@
+
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/powerpc/powerpc64le.
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build libc for powerpc64le" >&5
+$as_echo_n "checking if $CC is sufficient to build libc for powerpc64le... " >&6; }
+if ${libc_cv_compiler_powerpc64le_compiler_ok+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if !defined __GNUC__ || __GNUC__ < 6 || (__GNUC__ == 6 && __GNUC_MINOR__ < 2)
+#error insufficient compiler
+#endif
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ libc_cv_compiler_powerpc64le_compiler_ok=yes
+else
+ libc_cv_compiler_powerpc64le_compiler_ok=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_compiler_powerpc64le_compiler_ok" >&5
+$as_echo "$libc_cv_compiler_powerpc64le_compiler_ok" >&6; }
+if test "$libc_cv_compiler_powerpc64le_compiler_ok" != "yes"; then :
+ critic_missing="$critic_missing GCC >= 6.2 is required on powerpc64le."
+fi
+
+test -n "$critic_missing" && as_fn_error $? "*** $critic_missing" "$LINENO" 5
diff --git a/sysdeps/powerpc/powerpc64le/configure.ac b/sysdeps/powerpc/powerpc64le/configure.ac
new file mode 100644
index 0000000..9d8c54c
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64le/configure.ac
@@ -0,0 +1,17 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/powerpc/powerpc64le.
+
+dnl Require __float128 support on powerpc64le (available in GCC 6.2).
+AC_CACHE_CHECK([if $CC is sufficient to build libc for powerpc64le],
+ libc_cv_compiler_powerpc64le_compiler_ok, [
+AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
+#if !defined __GNUC__ || __GNUC__ < 6 || (__GNUC__ == 6 && __GNUC_MINOR__ < 2)
+#error insufficient compiler
+#endif
+]])],
+ [libc_cv_compiler_powerpc64le_compiler_ok=yes],
+ [libc_cv_compiler_powerpc64le_compiler_ok=no])])
+AS_IF([test "$libc_cv_compiler_powerpc64le_compiler_ok" != "yes"],
+ [critic_missing="$critic_missing GCC >= 6.2 is required on powerpc64le."])
+
+test -n "$critic_missing" && AC_MSG_ERROR([*** $critic_missing])
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=60195247ade8c911dcde1cb9c0f5f7c1d5d158f3
commit 60195247ade8c911dcde1cb9c0f5f7c1d5d158f3
Author: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Fri Jul 15 14:29:51 2016 -0500
float128: Add test-{float128,ifloat128,float128-finite}
This adds test support for float128, and lays some
groundwork for future _FloatN types.
* math/Makefile
(CFLAGS-test-float128.c): Add appropriate test flags.
(CFLAGS-test-float128-finite.c): Likewise
(CPPFLAGS-test-ifloat128.c): Likewise
* math/test-support.h (CFLOAT): New macro to compensate for older
compilers not supporting _Complex __float128.
* math/libm-test-support.c (check_complex): Use CFLOAT instead
of __complex__ FLOAT.
* math/test-float128-finite.c: New file.
* math/test-float128.c: New file.
* math/test-float128.h: New file.
* math/test-ifloat128.c: New file.
* math/test-math-floatn.h: New file.
* math/gen-libm-test.pl (all_floats): Add float128 variants.
(all_floats_pfx): Add float128 mapping.
* math/gen-libm-have-vector-test.sh: Add support for float128.
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index a931bc5..e82b2ac 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -45,13 +45,15 @@ use vars qw (%auto_tests);
# all_floats is sorted and contains all recognised float types
@all_floats = ('double', 'float', 'idouble',
- 'ifloat', 'ildouble', 'ldouble');
+ 'ifloat', 'ildouble', 'ldouble',
+ 'ifloat128', 'float128');
# all_floats_pfx maps C types to their C like prefix for macros.
%all_floats_pfx =
( "double" => "DBL",
"ldouble" => "LDBL",
"float" => "FLT",
+ "float128" => "FLT128",
);
%beautify =
diff --git a/math/libm-test-exp10.inc b/math/libm-test-exp10.inc
index 92c81ad..374d12a 100644
--- a/math/libm-test-exp10.inc
+++ b/math/libm-test-exp10.inc
@@ -39,8 +39,10 @@ exp10_test (void)
static void
pow10_test (void)
{
+#if !TEST_FLOATN
/* pow10 uses the same test data as exp10. */
ALL_RM_TEST (pow10, 0, exp10_test_data, RUN_TEST_LOOP_f_f, END);
+#endif
}
static void
diff --git a/math/libm-test-lgamma.inc b/math/libm-test-lgamma.inc
index 9799aa9..0927dd0 100644
--- a/math/libm-test-lgamma.inc
+++ b/math/libm-test-lgamma.inc
@@ -45,8 +45,10 @@ lgamma_test (void)
static void
gamma_test (void)
{
+#if !TEST_FLOATN
/* gamma uses the same test data as lgamma. */
ALL_RM_TEST (gamma, 0, lgamma_test_data, RUN_TEST_LOOP_f_f1, END, signgam);
+#endif
}
static void
diff --git a/math/libm-test-nexttoward.inc b/math/libm-test-nexttoward.inc
index f05cf5f..37a9338 100644
--- a/math/libm-test-nexttoward.inc
+++ b/math/libm-test-nexttoward.inc
@@ -20,6 +20,7 @@
static const struct test_fj_f_data nexttoward_test_data[] =
{
+#if !TEST_FLOATN
TEST_fj_f (nexttoward, 0, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fj_f (nexttoward, minus_zero, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fj_f (nexttoward, 0, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -80,6 +81,7 @@ static const struct test_fj_f_data nexttoward_test_data[] =
TEST_fj_f (nexttoward, min_subnorm_value, minus_zero, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
TEST_fj_f (nexttoward, -min_subnorm_value, 0, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
TEST_fj_f (nexttoward, -min_subnorm_value, minus_zero, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE),
+#endif
#if TEST_COND_binary32
TEST_fj_f (nexttoward, 1.0, 1.1L, 0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -153,7 +155,9 @@ static const struct test_fj_f_data nexttoward_test_data[] =
static void
nexttoward_test (void)
{
+#if !TEST_FLOATN
ALL_RM_TEST (nexttoward, 1, nexttoward_test_data, RUN_TEST_LOOP_fj_f, END);
+#endif
}
static void
diff --git a/math/libm-test-remainder.inc b/math/libm-test-remainder.inc
index ddeba66..65503c7 100644
--- a/math/libm-test-remainder.inc
+++ b/math/libm-test-remainder.inc
@@ -184,8 +184,10 @@ remainder_test (void)
static void
drem_test (void)
{
+#if !TEST_FLOATN
/* drem uses the same test data as remainder. */
ALL_RM_TEST (drem, 1, remainder_test_data, RUN_TEST_LOOP_ff_f, END);
+#endif
}
static void
diff --git a/math/libm-test-scalb.inc b/math/libm-test-scalb.inc
index 228a93d..b96f767 100644
--- a/math/libm-test-scalb.inc
+++ b/math/libm-test-scalb.inc
@@ -20,6 +20,7 @@
static const struct test_ff_f_data scalb_test_data[] =
{
+#if !TEST_FLOATN
/* Results in this case are unspecified by POSIX, so, for an
otherwise fully-determined function, spurious "inexact"
exceptions are OK. */
@@ -144,12 +145,15 @@ static const struct test_ff_f_data scalb_test_data[] =
TEST_ff_f (scalb, 0.8L, 4, 12.8L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_f (scalb, -0.854375L, 5, -27.34L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
};
static void
scalb_test (void)
{
+#if !TEST_FLOATN
ALL_RM_TEST (scalb, 1, scalb_test_data, RUN_TEST_LOOP_ff_f, END);
+#endif
}
static void
diff --git a/math/libm-test-significand.inc b/math/libm-test-significand.inc
index 372c076..5797e97 100644
--- a/math/libm-test-significand.inc
+++ b/math/libm-test-significand.inc
@@ -20,6 +20,7 @@
static const struct test_f_f_data significand_test_data[] =
{
+#if !TEST_FLOATN
/* significand returns the mantissa of the exponential
representation. Tests for infinities, zero and NaNs reflect
the implementation (including possibility of "inexact" and
@@ -45,12 +46,15 @@ static const struct test_f_f_data significand_test_data[] =
TEST_f_f (significand, -6.0, -1.5, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_f_f (significand, 8.0, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_f_f (significand, -8.0, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+#endif
};
static void
significand_test (void)
{
+#if !TEST_FLOATN
ALL_RM_TEST (significand, 1, significand_test_data, RUN_TEST_LOOP_f_f, END);
+#endif
}
static void
diff --git a/math/libm-test-support.c b/math/libm-test-support.c
index 07b8f25..7612d39 100644
--- a/math/libm-test-support.c
+++ b/math/libm-test-support.c
@@ -732,8 +732,8 @@ check_float (const char *test_name, FLOAT computed, FLOAT expected,
void
-check_complex (const char *test_name, __complex__ FLOAT computed,
- __complex__ FLOAT expected,
+check_complex (const char *test_name, CFLOAT computed,
+ CFLOAT expected,
int exception)
{
FLOAT part_comp, part_exp;
diff --git a/math/libm-test-support.h b/math/libm-test-support.h
index 0e78144..a57a8b3 100644
--- a/math/libm-test-support.h
+++ b/math/libm-test-support.h
@@ -138,12 +138,20 @@ extern const char doc[];
#define TEST_COND_before_rounding (!TININESS_AFTER_ROUNDING)
#define TEST_COND_after_rounding TININESS_AFTER_ROUNDING
+#ifndef TEST_FLOATN
+# define TEST_FLOATN 0
+#endif
+
+#ifndef CFLOAT
+# define CFLOAT __complex__ FLOAT
+#endif
+
int enable_test (int);
void init_max_error (const char *, int);
void print_max_error (const char *);
void print_complex_max_error (const char *);
void check_float (const char *, FLOAT, FLOAT, int);
-void check_complex (const char *, __complex__ FLOAT, __complex__ FLOAT, int);
+void check_complex (const char *, CFLOAT, CFLOAT, int);
void check_int (const char *, int, int, int);
void check_long (const char *, long int, long int, int);
void check_bool (const char *, int, int, int);
diff --git a/math/test-float128.h b/math/test-float128.h
new file mode 100644
index 0000000..177c10c
--- /dev/null
+++ b/math/test-float128.h
@@ -0,0 +1,63 @@
+/* Common definitions for libm tests for _Float128.
+
+ 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/>. */
+
+#define FUNC(function) function ## f128
+#define PRINTF_EXPR "e"
+#define PRINTF_XEXPR "a"
+#define PRINTF_NEXPR "f"
+#define BUILD_COMPLEX(real, imag) (CMPLXF128 ((real), (imag)))
+#define PREFIX FLT128
+#define TYPE_STR "float128"
+#define LITM(x) x ## f128
+#define FTOSTR strfromf128
+#define snan_value_MACRO SNANF128
+
+/* Fixup builtins and constants for older compilers. */
+#include <features.h>
+#if !__GNUC_PREREQ (7, 0)
+# define LIT(x) (x ## Q)
+# define FLOAT __float128
+# define CFLOAT __CFLOAT128
+/* The following macros are only provided since GCC 7.0. */
+# define FLT128_MANT_DIG 113
+# define FLT128_DECIMAL_DIG 36
+# define FLT128_DIG 33
+# define FLT128_MIN_EXP (-16381)
+# define FLT128_MIN_10_EXP (-4931)
+# define FLT128_MAX_EXP 16384
+# define FLT128_MAX_10_EXP 4932
+# define FLT128_MAX 1.18973149535723176508575932662800702e+4932Q
+# define FLT128_EPSILON 1.92592994438723585305597794258492732e-34Q
+# define FLT128_MIN 3.36210314311209350626267781732175260e-4932Q
+# define FLT128_TRUE_MIN 6.47517511943802511092443895822764655e-4966Q
+#else
+# define LIT(x) (x ## f128)
+# define FLOAT _Float128
+#endif
+
+#include "test-math-floatn.h"
+
+/* Similarly, finitef128 is not API */
+extern int __finitef128 (FLOAT);
+
+static inline int
+finitef128(FLOAT f)
+{
+ return __finitef128 (f);
+}
diff --git a/math/test-math-floatn.h b/math/test-math-floatn.h
new file mode 100644
index 0000000..a5e2eee
--- /dev/null
+++ b/math/test-math-floatn.h
@@ -0,0 +1,21 @@
+/* Common definitions for libm tests for TS 18661-3 derived types.
+ 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/>. */
+
+#define TEST_FLOATN 1
+#define __STDC_WANT_IEC_60559_BFP_EXT__
+#define __STDC_WANT_IEC_60559_TYPES_EXT__
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=aee0db1113e789c78377a32ca487a19c6091cda4
commit aee0db1113e789c78377a32ca487a19c6091cda4
Author: Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Date: Mon Nov 14 14:36:18 2016 -0200
float128: Add strfromf128, strtof128, and wcstof128 to the manual
2016-11-14 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
* manual/arith.texi: Add descriptions for strfromf128, strtof128,
and wcstof128.
diff --git a/manual/arith.texi b/manual/arith.texi
index dec12a0..fa1fd88 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -2990,23 +2990,38 @@ double} is a separate type).
These functions have been GNU extensions and are new to @w{ISO C99}.
@end deftypefun
+@comment stdlib.h
+@comment ISO/IEC TS 18661-3
+@deftypefun _Float128 strtof128 (const char *@var{string}, char **@var{tailptr})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
+The @code{strtof128} function (``string-to-float128'') is like
+@code{strtod}, except that it returns a @code{_Float128} value.
+
+The @code{strtof128} function was introduced in @w{ISO/IEC TS 18661-3}.
+@end deftypefun
+
@comment wchar.h
@comment ISO
@deftypefun double wcstod (const wchar_t *restrict @var{string}, wchar_t **restrict @var{tailptr})
-@comment stdlib.h
+@comment wchar.h
@comment ISO
@deftypefunx float wcstof (const wchar_t *@var{string}, wchar_t **@var{tailptr})
-@comment stdlib.h
+@comment wchar.h
@comment ISO
@deftypefunx {long double} wcstold (const wchar_t *@var{string}, wchar_t **@var{tailptr})
+@comment wchar.h
+@deftypefunx _Float128 wcstof128 (const wchar_t *@var{string}, wchar_t **@var{tailptr})
@safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}}
-The @code{wcstod}, @code{wcstof}, and @code{wcstol} functions are
-equivalent in nearly all aspect to the @code{strtod}, @code{strtof}, and
-@code{strtold} functions but it handles wide character string.
+The @code{wcstod}, @code{wcstof}, @code{wcstol}, and @code{wcstof128}
+functions are equivalent in nearly all aspect to the @code{strtod},
+@code{strtof}, @code{strtold}, and @code{strtof128} functions but they
+handle wide character string.
The @code{wcstod} function was introduced in @w{Amendment 1} of @w{ISO
C90}. The @code{wcstof} and @code{wcstold} functions were introduced in
-@w{ISO C99}.
+@w{ISO C99}. The @code{wcstof128} function is not in any standard, but is
+added to provide completeness for the non-deprecated interface of wide
+character string to floating-point conversion functions.
@end deftypefun
@comment stdlib.h
@@ -3064,6 +3079,18 @@ has been completely written if and only if the returned value is less than
These functions were introduced by ISO/IEC TS 18661-1.
@end deftypefun
+@comment stdlib.h
+@comment ISO/IEC TS 18661-3
+@deftypefun int strfromf128 (char *restrict @var{string}, size_t @var{size}, const char *restrict @var{format}, _Float128 @var{value})
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+@comment this function depends on __printf_fp and __printf_fphex, which are
+@comment AS-unsafe (ascuheap) and AC-unsafe (acsmem).
+The @code{strfromf128} function (``string-from-float128'') is like
+@code{strfromd}, except that @var{value} has floating type _Float128.
+
+The @code{strfromf128} function was introduced by ISO/IEC TS 18661-3.
+@end deftypefun
+
@node System V Number Conversion
@section Old-fashioned System V number-to-string functions
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=3d9c4a47798dbf95be62e1a72d9860ba0c9c2657
commit 3d9c4a47798dbf95be62e1a72d9860ba0c9c2657
Author: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Mon Jul 25 13:10:00 2016 -0500
float128: Add strtof128, wcstof128, and related functions.
The implementations are contained with sysdeps/ieee754/float128 as
they are only built when _Float128 is enabled within libc/m.
2017-05-23 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
* NEWS: Mention the addition of strtof128 and wcstof128.
* include/gmp.h (__mpn_construct_float128): New declaration.
* include/stdlib.h: Include bits/floatn.h for _Float128 tests.
(__strtof128_l): New declaration.
(__strtof128_nan): Likewise.
(__wcstof128_nan): Likewise.
(__strtof128_internal): Likewise.
(____strtof128_l_internal): Likewise.
* include/wchar.h: Include bits/floatn.h for _Float128 tests.
(__wcstof128_l): New declaration.
(__wcstof128_internal): Likewise.
* stdlib/Makefile (bug-strtod2): Link libm too.
* stdlib/stdlib.h (strtof128): New declaration.
(strtof128_l): Likewise.
* stdlib/tst-strtod-nan-locale-main.c: Updated to use
tst-strtod.h macros to ensure float128 gets tested too.
* stdlib/tst-strtod-round-skeleton.c (CHOOSE_f128): New macro.
* stdlib/tst-strtod.h: Include bits/floatn.h for _Float128
tests.
(_GEN_F128): New macro.
(_GEN): Likewise.
(_GENx): Likewise.
(_DO_F128): Likewise.
(_DO): Likewise.
(_DOx): Likewise.
(GEN_TEST_STRTOD): Update to optionally include _Float128 in
the tests.
(STRTOD_TEST_FOREACH): Likewise.
* sysdeps/ieee754/float128/Makefile: Insert new strtof128 and
wcstof128 functions into libc.
* sysdeps/ieee754/float128/Versions: Add exports for the above
new functions.
* sysdeps/ieee754/float128/mpn2float128.c: New file.
* sysdeps/ieee754/float128/strtod_nan_float128.h: New file.
* sysdeps/ieee754/float128/strtof128.c: New file.
* sysdeps/ieee754/float128/strtof128_l.c: New file.
* sysdeps/ieee754/float128/strtof128_nan.c: New file.
* sysdeps/ieee754/float128/wcstof128.c: New file.
* sysdeps/ieee754/float128/wcstof128_l.c: New file.
* sysdeps/ieee754/float128/wcstof128_nan.c: New fike.
* wcsmbs/Makefile: (CFLAGS-wcstof128.c): Append strtox-CFLAGS.
(CFLAGS-wcstof128_l): Likewise.
* wcsmbs/wchar.h (wcstof128): New declaration.
(wcstof128_l): Likewise.
diff --git a/NEWS b/NEWS
index 8cb17cc..39e15fa 100644
--- a/NEWS
+++ b/NEWS
@@ -69,6 +69,10 @@ Version 2.26
* The function strfromf128, from ISO/IEC TS 18661-3:2015, is added to libc.
It converts a _Float128 value into string.
+* The function strtof128, from ISO/IEC TS 18661-3:2015, is added to libc.
+ It converts a string into a floating-point number of _Float128 type. Its
+ wide character counterpart, wsctof128, is added as a GNU extension.
+
Security related changes:
* The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes,
diff --git a/include/gmp.h b/include/gmp.h
index e6f635e..3590acf 100644
--- a/include/gmp.h
+++ b/include/gmp.h
@@ -31,5 +31,9 @@ extern double __mpn_construct_double (mp_srcptr frac_ptr, int expt,
extern long double __mpn_construct_long_double (mp_srcptr frac_ptr, int expt,
int sign);
+#if __HAVE_DISTINCT_FLOAT128
+extern _Float128 __mpn_construct_float128 (mp_srcptr frac_ptr, int expt,
+ int sign);
+#endif
#endif
diff --git a/include/stdlib.h b/include/stdlib.h
index c3ee680..b8de20e 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -215,6 +215,35 @@ libc_hidden_proto (__wcstof_nan)
libc_hidden_proto (__wcstod_nan)
libc_hidden_proto (__wcstold_nan)
+/* Enable _FloatN bits as needed. */
+#include <bits/floatn.h>
+
+#if __HAVE_DISTINCT_FLOAT128
+extern __typeof (strtof128_l) __strtof128_l;
+
+libc_hidden_proto (__strtof128_l)
+libc_hidden_proto (strtof128)
+
+extern _Float128 __strtof128_nan (const char *, char **, char)
+ internal_function;
+extern _Float128 __wcstof128_nan (const wchar_t *, wchar_t **, wchar_t)
+ internal_function;
+
+libc_hidden_proto (__strtof128_nan)
+libc_hidden_proto (__wcstof128_nan)
+
+extern _Float128 __strtof128_internal (const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __group);
+libc_hidden_proto (__strtof128_internal)
+
+extern _Float128 ____strtof128_l_internal (const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __group, __locale_t __loc);
+
+libc_hidden_proto (____strtof128_l_internal)
+#endif
+
extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt,
int *__restrict __sign);
extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt,
diff --git a/include/wchar.h b/include/wchar.h
index e2579a1..66e8aab 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -4,6 +4,8 @@
# ifndef _ISOMAC
# ifdef _WCHAR_H
+#include <bits/floatn.h>
+
extern __typeof (wcscasecmp_l) __wcscasecmp_l;
extern __typeof (wcsncasecmp_l) __wcsncasecmp_l;
extern __typeof (wcscoll_l) __wcscoll_l;
@@ -70,6 +72,17 @@ libc_hidden_proto (wcstoll)
libc_hidden_proto (wcstoul)
libc_hidden_proto (wcstoull)
+#if __HAVE_DISTINCT_FLOAT128
+extern __typeof (wcstof128_l) __wcstof128_l;
+libc_hidden_proto (__wcstof128_l)
+extern _Float128 __wcstof128_internal (const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __group) __THROW;
+
+libc_hidden_proto (__wcstof128_internal)
+libc_hidden_proto (wcstof128)
+#endif
+
libc_hidden_proto (__wcscasecmp_l)
libc_hidden_proto (__wcsncasecmp_l)
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9b0acce..0314d59 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -198,6 +198,7 @@ $(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os $(link-libc-deps)
libof-tst-putenvmod = extramodules
$(objpfx)bug-getcontext: $(libm)
+$(objpfx)bug-strtod2: $(libm)
$(objpfx)tst-strtod-round: $(libm)
$(objpfx)tst-tininess: $(libm)
$(objpfx)tst-strtod-underflow: $(libm)
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 1313aa5..36987b4 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -128,6 +128,13 @@ extern long double strtold (const char *__restrict __nptr,
__THROW __nonnull ((1));
#endif
+#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
+/* Likewise for the '_Float128' format */
+extern _Float128 strtof128 (const char *__restrict __nptr,
+ char **__restrict __endptr)
+ __THROW __nonnull ((1));
+#endif
+
/* Convert a string to a long integer. */
extern long int strtol (const char *__restrict __nptr,
char **__restrict __endptr, int __base)
@@ -235,6 +242,14 @@ extern long double strtold_l (const char *__restrict __nptr,
char **__restrict __endptr,
__locale_t __loc)
__THROW __nonnull ((1, 3));
+
+# if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
+extern _Float128 strtof128_l (const char *__restrict __nptr,
+ char **__restrict __endptr,
+ __locale_t __loc)
+ __THROW __nonnull ((1, 3));
+# endif
+
#endif /* GNU */
diff --git a/stdlib/tst-strtod-nan-locale-main.c b/stdlib/tst-strtod-nan-locale-main.c
index 8044dad..8222174 100644
--- a/stdlib/tst-strtod-nan-locale-main.c
+++ b/stdlib/tst-strtod-nan-locale-main.c
@@ -23,6 +23,8 @@
#include <stdlib.h>
#include <wchar.h>
+#include <stdlib/tst-strtod.h>
+
#define STR_(X) #X
#define STR(X) STR_(X)
#define FNPFXS STR (FNPFX)
@@ -30,20 +32,22 @@
#define CONCAT(X, Y) CONCAT_ (X, Y)
#define FNX(FN) CONCAT (FNPFX, FN)
-#define TEST(LOC, STR, FN, TYPE) \
- do \
+#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \
+static int \
+test_strto ## FSUF (const char * loc, CHAR * s) \
+{ \
+ CHAR *ep; \
+ FTYPE val = FNX (FSUF) (s, &ep); \
+ if (isnan (val) && *ep == 0) \
+ printf ("PASS: %s: " FNPFXS #FSUF " (" SFMT ")\n", loc, s); \
+ else \
{ \
- CHAR *ep; \
- TYPE val = FNX (FN) (STR, &ep); \
- if (isnan (val) && *ep == 0) \
- printf ("PASS: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \
- else \
- { \
- printf ("FAIL: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \
- result = 1; \
- } \
+ printf ("FAIL: %s: " FNPFXS #FSUF " (" SFMT ")\n", loc, s); \
+ return 1; \
} \
- while (0)
+ return 0; \
+}
+GEN_TEST_STRTOD_FOREACH (TEST_STRTOD)
static int
test_one_locale (const char *loc)
@@ -64,13 +68,9 @@ test_one_locale (const char *loc)
s[4] = L_('A') + i - 10;
s[5] = L_(')');
s[6] = 0;
- TEST (loc, s, f, float);
- TEST (loc, s, d, double);
- TEST (loc, s, ld, long double);
+ result |= STRTOD_TEST_FOREACH (test_strto, loc, s);
s[4] = L_('a') + i - 10;
- TEST (loc, s, f, float);
- TEST (loc, s, d, double);
- TEST (loc, s, ld, long double);
+ result |= STRTOD_TEST_FOREACH (test_strto, loc, s);
}
return result;
}
diff --git a/stdlib/tst-strtod-round-skeleton.c b/stdlib/tst-strtod-round-skeleton.c
index 73603e6..1a9f663 100644
--- a/stdlib/tst-strtod-round-skeleton.c
+++ b/stdlib/tst-strtod-round-skeleton.c
@@ -93,6 +93,7 @@
/* Add type specific choosing macros below. */
#define CHOOSE_f(f,...) f
#define CHOOSE_d(f,d,...) d
+#define CHOOSE_f128(f,d,ld64i,ld64m,ld106,ld113,...) ld113
/* long double is special, and handled above. */
/* Selector for expected result field of a given type. */
diff --git a/stdlib/tst-strtod.h b/stdlib/tst-strtod.h
index bf5f901..d862a67 100644
--- a/stdlib/tst-strtod.h
+++ b/stdlib/tst-strtod.h
@@ -21,11 +21,36 @@
#define FSTRLENMAX 128
+#include <bits/floatn.h>
+
+#if !__GNUC_PREREQ(7,0)
+# define F128 Q
+#endif
+
+/* Test strfromf128 and strtof128 on all platforms that provide them,
+ whether or not the type _FLoat128 is ABI-distinct from long double. */
+#if __HAVE_FLOAT128
+# define _GEN_f128(mfunc, ...) mfunc (__VA_ARGS__)
+# define _DO_f128(mfunc,...) (mfunc ## f128) (__VA_ARGS__)
+# ifndef CHAR
+# define CHAR char
+# endif
+#else
+# define _GEN_f128(...)
+# define _DO_f128(...) 0
+#endif
+
+#define _GEN(mfunc, type, ...) _GENx(_GEN_ ## type, mfunc, type, __VA_ARGS__)
+#define _GENx(mmfunc, mfunc, type, ...) mmfunc (mfunc, type, __VA_ARGS__)
+#define _DO(mfunc, type, ...) _DOx(_DO_ ## type, mfunc, ##__VA_ARGS__)
+#define _DOx(mmfunc, mfunc, ...) mmfunc (mfunc, ##__VA_ARGS__)
+
/* Splat n variants of the same test for the various strtod functions. */
#define GEN_TEST_STRTOD_FOREACH(mfunc, ...) \
mfunc ( f, float, strfromf, f, f, ##__VA_ARGS__) \
mfunc ( d, double, strfromd, , , ##__VA_ARGS__) \
- mfunc ( ld, long double, strfroml, L, l, ##__VA_ARGS__)
+ mfunc ( ld, long double, strfroml, L, l, ##__VA_ARGS__) \
+ _GEN ( mfunc, f128, _Float128, strfromf128, F128, f128, ##__VA_ARGS__)
/* The arguments to the generated macros are:
FSUF - Function suffix
FTYPE - float type
@@ -36,13 +61,14 @@
-#define STRTOD_TEST_FOREACH(mfunc, ...) \
-({ \
- int result = 0; \
- result |= mfunc ## f (__VA_ARGS__); \
- result |= mfunc ## d (__VA_ARGS__); \
- result |= mfunc ## ld (__VA_ARGS__); \
- result; \
+#define STRTOD_TEST_FOREACH(mfunc, ...) \
+({ \
+ int result = 0; \
+ result |= mfunc ## f (__VA_ARGS__); \
+ result |= mfunc ## d (__VA_ARGS__); \
+ result |= mfunc ## ld (__VA_ARGS__); \
+ result |= _DO (mfunc, f128, ##__VA_ARGS__); \
+ result; \
})
diff --git a/sysdeps/ieee754/float128/Makefile b/sysdeps/ieee754/float128/Makefile
index c07586c..166e630 100644
--- a/sysdeps/ieee754/float128/Makefile
+++ b/sysdeps/ieee754/float128/Makefile
@@ -1,3 +1,8 @@
ifeq ($(subdir),stdlib)
routines += float1282mpn strfromf128
+routines += strtof128 strtof128_l strtof128_nan mpn2float128
+endif
+
+ifeq ($(subdir),wcsmbs)
+routines += wcstof128_l wcstof128 wcstof128_nan
endif
diff --git a/sysdeps/ieee754/float128/Versions b/sysdeps/ieee754/float128/Versions
index caf2064..ef9df2d 100644
--- a/sysdeps/ieee754/float128/Versions
+++ b/sysdeps/ieee754/float128/Versions
@@ -4,7 +4,17 @@
%endif
libc {
FLOAT128_VERSION {
+ __strtof128_internal;
+ __wcstof128_internal;
strfromf128;
+ strtof128;
+ strtof128_l;
+ wcstof128;
+ wcstof128_l;
+ }
+ GLIBC_PRIVATE {
+ # For __nanf128.
+ __strtof128_nan;
}
}
libm {
diff --git a/sysdeps/ieee754/float128/mpn2float128.c b/sysdeps/ieee754/float128/mpn2float128.c
new file mode 100644
index 0000000..ad2e699
--- /dev/null
+++ b/sysdeps/ieee754/float128/mpn2float128.c
@@ -0,0 +1,53 @@
+/* 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/>. */
+
+#include "gmp.h"
+#include "gmp-impl.h"
+#include <float.h>
+#include <math.h>
+
+#include "ieee754_float128.h"
+
+/* Convert a multi-precision integer of the needed number of bits (113 for
+ binary128) and an integral power of two to a `__float128' in IEEE854
+ quad-precision format. */
+
+_Float128
+__mpn_construct_float128 (mp_srcptr frac_ptr, int expt, int sign)
+{
+ union ieee854_float128 u;
+
+ u.ieee.negative = sign;
+ u.ieee.exponent = expt + IEEE854_FLOAT128_BIAS;
+#if BITS_PER_MP_LIMB == 32
+ u.ieee.mantissa3 = frac_ptr[0];
+ u.ieee.mantissa2 = frac_ptr[1];
+ u.ieee.mantissa1 = frac_ptr[2];
+ u.ieee.mantissa0 = frac_ptr[3] & (((mp_limb_t) 1
+ << (FLT128_MANT_DIG - 96)) - 1);
+#elif BITS_PER_MP_LIMB == 64
+ u.ieee.mantissa3 = frac_ptr[0] & (((mp_limb_t) 1 << 32) - 1);
+ u.ieee.mantissa2 = frac_ptr[0] >> 32;
+ u.ieee.mantissa1 = frac_ptr[1] & (((mp_limb_t) 1 << 32) - 1);
+ u.ieee.mantissa0 = (frac_ptr[1] >> 32) & (((mp_limb_t) 1
+ << (FLT128_MANT_DIG - 96)) - 1);
+#else
+ #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
+#endif
+
+ return u.d;
+}
diff --git a/sysdeps/ieee754/float128/strtod_nan_float128.h b/sysdeps/ieee754/float128/strtod_nan_float128.h
new file mode 100644
index 0000000..79329fb
--- /dev/null
+++ b/sysdeps/ieee754/float128/strtod_nan_float128.h
@@ -0,0 +1,33 @@
+/* Convert string for NaN payload to corresponding NaN. For _Float128.
+ 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/>. */
+
+#define FLOAT _Float128
+#define SET_MANTISSA(flt, mant) \
+ do \
+ { \
+ union ieee854_float128 u; \
+ u.d = (flt); \
+ u.ieee_nan.mantissa0 = 0; \
+ u.ieee_nan.mantissa1 = 0; \
+ u.ieee_nan.mantissa2 = (mant) >> 32; \
+ u.ieee_nan.mantissa3 = (mant); \
+ if ((u.ieee.mantissa0 | u.ieee.mantissa1 \
+ | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \
+ (flt) = u.d; \
+ } \
+ while (0)
diff --git a/sysdeps/ieee754/float128/strtof128.c b/sysdeps/ieee754/float128/strtof128.c
new file mode 100644
index 0000000..63cc80d
--- /dev/null
+++ b/sysdeps/ieee754/float128/strtof128.c
@@ -0,0 +1,34 @@
+/* strtof128 wrapper of strtof128_l.
+ 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/>. */
+
+/* The actual implementation for all floating point sizes is in strtod.c.
+ These macros tell it to produce the `_Float128' version, `strtof128'. */
+
+#define FLOAT _Float128
+#define FLT FLT128
+#ifdef USE_WIDE_CHAR
+# define STRTOF wcstof128
+# define STRTOF_L __wcstof128_l
+#else
+# define STRTOF strtof128
+# define STRTOF_L __strtof128_l
+#endif
+
+#include <float128_private.h>
+
+#include <stdlib/strtod.c>
diff --git a/sysdeps/ieee754/float128/strtof128_l.c b/sysdeps/ieee754/float128/strtof128_l.c
new file mode 100644
index 0000000..0f768a3
--- /dev/null
+++ b/sysdeps/ieee754/float128/strtof128_l.c
@@ -0,0 +1,43 @@
+/* Convert string representing a number to a _Float128 value, with locale.
+ 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/>. */
+
+#include <xlocale.h>
+
+/* Bring in potential typedef for _Float128 early for declaration below. */
+#include <bits/floatn.h>
+
+extern _Float128 ____strtof128_l_internal (const char *, char **,
+ int, __locale_t);
+
+#define FLOAT _Float128
+#define FLT FLT128
+#ifdef USE_WIDE_CHAR
+# define STRTOF wcstof128_l
+# define __STRTOF __wcstof128_l
+# define STRTOF_NAN __wcstof128_nan
+#else
+# define STRTOF strtof128_l
+# define __STRTOF __strtof128_l
+# define STRTOF_NAN __strtof128_nan
+#endif
+#define MPN2FLOAT __mpn_construct_float128
+#define FLOAT_HUGE_VAL __builtin_huge_valf128 ()
+
+#include <float128_private.h>
+
+#include <stdlib/strtod_l.c>
diff --git a/sysdeps/ieee754/float128/strtof128_nan.c b/sysdeps/ieee754/float128/strtof128_nan.c
new file mode 100644
index 0000000..b9d79e3
--- /dev/null
+++ b/sysdeps/ieee754/float128/strtof128_nan.c
@@ -0,0 +1,28 @@
+/* Convert string for NaN payload to corresponding NaN. Narrow
+ strings, __float128.
+ 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/>. */
+
+#include <math.h>
+
+#include <float128_private.h>
+
+#include <strtod_nan_narrow.h>
+#include <strtod_nan_float128.h>
+
+#define STRTOD_NAN __strtof128_nan
+#include <stdlib/strtod_nan_main.c>
diff --git a/sysdeps/ieee754/float128/wcstof128.c b/sysdeps/ieee754/float128/wcstof128.c
new file mode 100644
index 0000000..d87eff9
--- /dev/null
+++ b/sysdeps/ieee754/float128/wcstof128.c
@@ -0,0 +1,29 @@
+/* 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/>. */
+
+#include <stddef.h>
+#include <xlocale.h>
+
+#define USE_WIDE_CHAR 1
+
+/* Bring in _Float128 typedef if needed. */
+#include <bits/floatn.h>
+
+extern _Float128 ____wcstof128_l_internal (const wchar_t *, wchar_t **, int,
+ __locale_t);
+
+#include "strtof128.c"
diff --git a/sysdeps/ieee754/float128/wcstof128_l.c b/sysdeps/ieee754/float128/wcstof128_l.c
new file mode 100644
index 0000000..670b6af
--- /dev/null
+++ b/sysdeps/ieee754/float128/wcstof128_l.c
@@ -0,0 +1,30 @@
+/* Convert string representing a number to integer value, using given locale.
+ 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/>. */
+
+#include <stddef.h>
+#include <xlocale.h>
+
+
+#define USE_WIDE_CHAR 1
+
+#include <bits/floatn.h>
+
+extern _Float128 ____wcstof128_l_internal (const wchar_t *, wchar_t **, int,
+ __locale_t);
+
+#include "strtof128_l.c"
diff --git a/sysdeps/ieee754/float128/wcstof128_nan.c b/sysdeps/ieee754/float128/wcstof128_nan.c
new file mode 100644
index 0000000..abad881
--- /dev/null
+++ b/sysdeps/ieee754/float128/wcstof128_nan.c
@@ -0,0 +1,24 @@
+/* Convert string for NaN payload to corresponding NaN. Wide strings,
+ _Float128.
+ 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/>. */
+
+#include <stdlib/strtod_nan_wide.h>
+#include <float128_private.h>
+#include <strtod_nan_float128.h>
+#define STRTOD_NAN __wcstof128_nan
+#include <stdlib/strtod_nan_main.c>
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index d6b214b..84cf986 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -81,6 +81,7 @@ CFLAGS-wcstoll.c = $(strtox-CFLAGS)
CFLAGS-wcstoull.c = $(strtox-CFLAGS)
CFLAGS-wcstod.c = $(strtox-CFLAGS)
CFLAGS-wcstold.c = $(strtox-CFLAGS)
+CFLAGS-wcstof128.c = $(strtox-CFLAGS)
CFLAGS-wcstof.c = $(strtox-CFLAGS)
CFLAGS-wcstol_l.c = $(strtox-CFLAGS)
CFLAGS-wcstoul_l.c = $(strtox-CFLAGS)
@@ -88,6 +89,7 @@ CFLAGS-wcstoll_l.c = $(strtox-CFLAGS)
CFLAGS-wcstoull_l.c = $(strtox-CFLAGS)
CFLAGS-wcstod_l.c = $(strtox-CFLAGS)
CFLAGS-wcstold_l.c = $(strtox-CFLAGS)
+CFLAGS-wcstof128_l.c = $(strtox-CFLAGS)
CFLAGS-wcstof_l.c = $(strtox-CFLAGS)
CPPFLAGS-tst-wchar-h.c = -D_FORTIFY_SOURCE=2
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 79be9fc..ba89c22 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -468,6 +468,15 @@ __extension__
extern unsigned long long int wcstouq (const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
int __base) __THROW;
+
+/* Include _Float128 variants of strtof128 if available. */
+#include <bits/floatn.h>
+
+#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
+extern _Float128 wcstof128 (const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr) __THROW;
+#endif
+
#endif /* Use GNU. */
#ifdef __USE_GNU
@@ -518,6 +527,13 @@ extern float wcstof_l (const wchar_t *__restrict __nptr,
extern long double wcstold_l (const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
__locale_t __loc) __THROW;
+
+#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
+extern _Float128 wcstof128_l (const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ __locale_t __loc) __THROW;
+#endif
+
#endif /* use GNU */
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=b2da97305ccbfbbe16778ba3b6acb59268ab625c
commit b2da97305ccbfbbe16778ba3b6acb59268ab625c
Author: Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Date: Thu Nov 3 12:37:08 2016 -0200
float128: Add strfromf128
Add strfromf128 to stdlib when _Float128 support is enabled.
2016-11-07 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
* NEWS: Mention the addition of strfromf128.
* include/gmp.h: Include bits/floatn.h for _Float128 support.
* stdio-common/printf-parsemb.c (__parse_one_specmb): Initialize
spec->info.is_binary128 to zero.
* stdio-common/printf.h (printf_info): Add new member is_binary128
to indicate that the number being converted to string is compatible
with the IEC 60559 binary128 format.
* stdio-common/printf_fp.c (__printf_fp_l): Add code to deal with
_Float128 numbers.
* stdio-common/printf_fphex.c (__printf_fphex): Likewise.
* stdio-common/printf_size.c (__printf_size): Likewise.
* stdio-common/vfprintf.c (process_arg): Initialize member
info.is_binary128 to zero.
* stdlib/fpioconst.h (FLT128_MAX_10_EXP_LOG): New macro.
* stdlib/stdlib.h: Include bits/floatn.h for _Float128 support.
(strfromf128): New declaration.
* stdlib/strfrom-skeleton.c (STRFROM): Set member info.is_binary128
to one.
* sysdeps/ieee754/float128/Makefile: Add strfromf128.
* sysdeps/ieee754/float128/Versions: Likewise.
* sysdeps/ieee754/float128/strfromf128.c: New file.
diff --git a/NEWS b/NEWS
index b4ecd62..8cb17cc 100644
--- a/NEWS
+++ b/NEWS
@@ -66,6 +66,9 @@ Version 2.26
* The port to Native Client running on ARMv7-A (--host=arm-nacl) has been
removed.
+* The function strfromf128, from ISO/IEC TS 18661-3:2015, is added to libc.
+ It converts a _Float128 value into string.
+
Security related changes:
* The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes,
diff --git a/include/gmp.h b/include/gmp.h
index 95d6c16..e6f635e 100644
--- a/include/gmp.h
+++ b/include/gmp.h
@@ -6,6 +6,8 @@
#include <stdlib/gmp.h>
+#include <bits/floatn.h>
+
/* Now define the internal interfaces. */
extern mp_size_t __mpn_extract_double (mp_ptr res_ptr, mp_size_t size,
int *expt, int *is_neg,
diff --git a/stdio-common/printf-parsemb.c b/stdio-common/printf-parsemb.c
index edb066e..a42336c 100644
--- a/stdio-common/printf-parsemb.c
+++ b/stdio-common/printf-parsemb.c
@@ -79,6 +79,7 @@ __parse_one_specmb (const UCHAR_T *format, size_t posn,
spec->info.extra = 0;
spec->info.pad = ' ';
spec->info.wide = sizeof (UCHAR_T) > 1;
+ spec->info.is_binary128 = 0;
/* Test for positional argument. */
if (ISDIGIT (*format))
diff --git a/stdio-common/printf.h b/stdio-common/printf.h
index 5d82e8d..6b207d2 100644
--- a/stdio-common/printf.h
+++ b/stdio-common/printf.h
@@ -47,7 +47,9 @@ struct printf_info
unsigned int is_char:1; /* hh flag. */
unsigned int wide:1; /* Nonzero for wide character streams. */
unsigned int i18n:1; /* I flag. */
- unsigned int __pad:4; /* Unused so far. */
+ unsigned int is_binary128:1; /* Floating-point argument is ABI-compatible
+ with IEC 60559 binary128. */
+ unsigned int __pad:3; /* Unused so far. */
unsigned short int user; /* Bits for user-installed modifiers. */
wchar_t pad; /* Padding character. */
};
diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c
index 7845d96..42fe7d2 100644
--- a/stdio-common/printf_fp.c
+++ b/stdio-common/printf_fp.c
@@ -218,6 +218,9 @@ __printf_fp_l (FILE *fp, locale_t loc,
{
double dbl;
__long_double_t ldbl;
+#if __HAVE_DISTINCT_FLOAT128
+ _Float128 f128;
+#endif
}
fpnum;
@@ -234,9 +237,17 @@ __printf_fp_l (FILE *fp, locale_t loc,
const char *special = NULL;
const wchar_t *wspecial = NULL;
+ /* When _Float128 is enabled in the library and ABI-distinct from long
+ double, we need mp_limbs enough for any of them. */
+#if __HAVE_DISTINCT_FLOAT128
+# define GREATER_MANT_DIG FLT128_MANT_DIG
+#else
+# define GREATER_MANT_DIG LDBL_MANT_DIG
+#endif
/* We need just a few limbs for the input before shifting to the right
position. */
- mp_limb_t fp_input[(LDBL_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB];
+ mp_limb_t fp_input[(GREATER_MANT_DIG + BITS_PER_MP_LIMB - 1)
+ / BITS_PER_MP_LIMB];
/* We need to shift the contents of fp_input by this amount of bits. */
int to_shift = 0;
@@ -328,6 +339,52 @@ __printf_fp_l (FILE *fp, locale_t loc,
grouping = NULL;
/* Fetch the argument value. */
+#if __HAVE_DISTINCT_FLOAT128
+ if (info->is_binary128)
+ {
+ fpnum.f128 = *(const _Float128 *) args[0];
+
+ /* Check for special values: not a number or infinity. */
+ if (isnan (fpnum.f128))
+ {
+ is_neg = signbit (fpnum.f128);
+ if (isupper (info->spec))
+ {
+ special = "NAN";
+ wspecial = L"NAN";
+ }
+ else
+ {
+ special = "nan";
+ wspecial = L"nan";
+ }
+ }
+ else if (isinf (fpnum.f128))
+ {
+ is_neg = signbit (fpnum.f128);
+ if (isupper (info->spec))
+ {
+ special = "INF";
+ wspecial = L"INF";
+ }
+ else
+ {
+ special = "inf";
+ wspecial = L"inf";
+ }
+ }
+ else
+ {
+ p.fracsize = __mpn_extract_float128 (fp_input,
+ (sizeof (fp_input) /
+ sizeof (fp_input[0])),
+ &p.exponent, &is_neg,
+ fpnum.f128);
+ to_shift = 1 + p.fracsize * BITS_PER_MP_LIMB - FLT128_MANT_DIG;
+ }
+ }
+ else
+#endif /* __HAVE_DISTINCT_FLOAT128 */
#ifndef __NO_LONG_DOUBLE_MATH
if (info->is_long_double && sizeof (long double) > sizeof (double))
{
@@ -450,7 +507,8 @@ __printf_fp_l (FILE *fp, locale_t loc,
{
mp_size_t bignum_size = ((abs (p.exponent) + BITS_PER_MP_LIMB - 1)
/ BITS_PER_MP_LIMB
- + (LDBL_MANT_DIG / BITS_PER_MP_LIMB > 2 ? 8 : 4))
+ + (GREATER_MANT_DIG / BITS_PER_MP_LIMB > 2
+ ? 8 : 4))
* sizeof (mp_limb_t);
p.frac = (mp_limb_t *) alloca (bignum_size);
p.tmp = (mp_limb_t *) alloca (bignum_size);
@@ -465,7 +523,15 @@ __printf_fp_l (FILE *fp, locale_t loc,
{
/* |FP| >= 8.0. */
int scaleexpo = 0;
- int explog = LDBL_MAX_10_EXP_LOG;
+ int explog;
+#if __HAVE_DISTINCT_FLOAT128
+ if (info->is_binary128)
+ explog = FLT_MAX_10_EXP_LOG;
+ else
+ explog = LDBL_MAX_10_EXP_LOG;
+#else
+ explog = LDBL_MAX_10_EXP_LOG;
+#endif
int exp10 = 0;
const struct mp_power *powers = &_fpioconst_pow10[explog + 1];
int cnt_h, cnt_l, i;
@@ -499,6 +565,27 @@ __printf_fp_l (FILE *fp, locale_t loc,
{
if (p.scalesize == 0)
{
+#if __HAVE_DISTINCT_FLOAT128
+ if ((FLT128_MANT_DIG
+ > _FPIO_CONST_OFFSET * BITS_PER_MP_LIMB)
+ && info->is_binary128)
+ {
+#define _FLT128_FPIO_CONST_SHIFT \
+ (((FLT128_MANT_DIG + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB) \
+ - _FPIO_CONST_OFFSET)
+ /* 64bit const offset is not enough for
+ IEEE 854 quad long double (_Float128). */
+ p.tmpsize = powers->arraysize + _FLT128_FPIO_CONST_SHIFT;
+ memcpy (p.tmp + _FLT128_FPIO_CONST_SHIFT,
+ &__tens[powers->arrayoff],
+ p.tmpsize * sizeof (mp_limb_t));
+ MPN_ZERO (p.tmp, _FLT128_FPIO_CONST_SHIFT);
+ /* Adjust p.exponent, as scaleexpo will be this much
+ bigger too. */
+ p.exponent += _FLT128_FPIO_CONST_SHIFT * BITS_PER_MP_LIMB;
+ }
+ else
+#endif /* __HAVE_DISTINCT_FLOAT128 */
#ifndef __NO_LONG_DOUBLE_MATH
if (LDBL_MANT_DIG > _FPIO_CONST_OFFSET * BITS_PER_MP_LIMB
&& info->is_long_double)
@@ -639,7 +726,15 @@ __printf_fp_l (FILE *fp, locale_t loc,
{
/* |FP| < 1.0. */
int exp10 = 0;
- int explog = LDBL_MAX_10_EXP_LOG;
+ int explog;
+#if __HAVE_DISTINCT_FLOAT128
+ if (info->is_binary128)
+ explog = FLT_MAX_10_EXP_LOG;
+ else
+ explog = LDBL_MAX_10_EXP_LOG;
+#else
+ explog = LDBL_MAX_10_EXP_LOG;
+#endif
const struct mp_power *powers = &_fpioconst_pow10[explog + 1];
/* Now shift the input value to its right place. */
diff --git a/stdio-common/printf_fphex.c b/stdio-common/printf_fphex.c
index b207e00..d5573b1 100644
--- a/stdio-common/printf_fphex.c
+++ b/stdio-common/printf_fphex.c
@@ -31,6 +31,10 @@
#include <stdbool.h>
#include <rounding-mode.h>
+#if __HAVE_DISTINCT_FLOAT128
+# include "ieee754_float128.h"
+#endif
+
/* #define NDEBUG 1*/ /* Undefine this for debugging assertions. */
#include <assert.h>
@@ -94,6 +98,9 @@ __printf_fphex (FILE *fp,
{
union ieee754_double dbl;
long double ldbl;
+#if __HAVE_DISTINCT_FLOAT128
+ _Float128 flt128;
+#endif
}
fpnum;
@@ -159,6 +166,45 @@ __printf_fphex (FILE *fp,
/* Fetch the argument value. */
+#if __HAVE_DISTINCT_FLOAT128
+ if (info->is_binary128)
+ {
+ fpnum.flt128 = *(const _Float128 *) args[0];
+
+ /* Check for special values: not a number or infinity. */
+ if (isnan (fpnum.flt128))
+ {
+ if (isupper (info->spec))
+ {
+ special = "NAN";
+ wspecial = L"NAN";
+ }
+ else
+ {
+ special = "nan";
+ wspecial = L"nan";
+ }
+ }
+ else
+ {
+ if (isinf (fpnum.flt128))
+ {
+ if (isupper (info->spec))
+ {
+ special = "INF";
+ wspecial = L"INF";
+ }
+ else
+ {
+ special = "inf";
+ wspecial = L"inf";
+ }
+ }
+ }
+ negative = signbit (fpnum.flt128);
+ }
+ else
+#endif /* __HAVE_DISTINCT_FLOAT128 */
#ifndef __NO_LONG_DOUBLE_MATH
if (info->is_long_double && sizeof (long double) > sizeof (double))
{
@@ -260,6 +306,94 @@ __printf_fphex (FILE *fp,
return done;
}
+#if __HAVE_DISTINCT_FLOAT128
+ /* This block is copied from sysdeps/ieee754/ldbl-128/printf_fphex.c. */
+ if (info->is_binary128)
+ {
+ /* We have 112 bits of mantissa plus one implicit digit. Since
+ 112 bits are representable without rest using hexadecimal
+ digits we use only the implicit digits for the number before
+ the decimal point. */
+ unsigned long long int num0, num1;
+ union ieee854_float128 u;
+ u.d = fpnum.flt128;
+
+ num0 = (((unsigned long long int) u.ieee.mantissa0) << 32
+ | u.ieee.mantissa1);
+ num1 = (((unsigned long long int) u.ieee.mantissa2) << 32
+ | u.ieee.mantissa3);
+
+ zero_mantissa = (num0|num1) == 0;
+
+ if (sizeof (unsigned long int) > 6)
+ {
+ numstr = _itoa_word (num1, numbuf + sizeof numbuf, 16,
+ info->spec == 'A');
+ wnumstr = _itowa_word (num1,
+ wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t),
+ 16, info->spec == 'A');
+ }
+ else
+ {
+ numstr = _itoa (num1, numbuf + sizeof numbuf, 16,
+ info->spec == 'A');
+ wnumstr = _itowa (num1,
+ wnumbuf + sizeof (wnumbuf) / sizeof (wchar_t),
+ 16, info->spec == 'A');
+ }
+
+ while (numstr > numbuf + (sizeof numbuf - 64 / 4))
+ {
+ *--numstr = '0';
+ *--wnumstr = L'0';
+ }
+
+ if (sizeof (unsigned long int) > 6)
+ {
+ numstr = _itoa_word (num0, numstr, 16, info->spec == 'A');
+ wnumstr = _itowa_word (num0, wnumstr, 16, info->spec == 'A');
+ }
+ else
+ {
+ numstr = _itoa (num0, numstr, 16, info->spec == 'A');
+ wnumstr = _itowa (num0, wnumstr, 16, info->spec == 'A');
+ }
+
+ /* Fill with zeroes. */
+ while (numstr > numbuf + (sizeof numbuf - 112 / 4))
+ {
+ *--numstr = '0';
+ *--wnumstr = L'0';
+ }
+
+ leading = u.ieee.exponent == 0 ? '0' : '1';
+
+ exponent = u.ieee.exponent;
+
+ if (exponent == 0)
+ {
+ if (zero_mantissa)
+ expnegative = 0;
+ else
+ {
+ /* This is a denormalized number. */
+ expnegative = 1;
+ exponent = IEEE854_FLOAT128_BIAS - 1;
+ }
+ }
+ else if (exponent >= IEEE854_FLOAT128_BIAS)
+ {
+ expnegative = 0;
+ exponent -= IEEE854_FLOAT128_BIAS;
+ }
+ else
+ {
+ expnegative = 1;
+ exponent = -(exponent - IEEE854_FLOAT128_BIAS);
+ }
+ }
+ else
+#endif /* __HAVE_DISTINCT_FLOAT128 */
if (info->is_long_double == 0 || sizeof (double) == sizeof (long double))
{
/* We have 52 bits of mantissa plus one implicit digit. Since
diff --git a/stdio-common/printf_size.c b/stdio-common/printf_size.c
index 9403aea..3449d17 100644
--- a/stdio-common/printf_size.c
+++ b/stdio-common/printf_size.c
@@ -104,6 +104,9 @@ __printf_size (FILE *fp, const struct printf_info *info,
{
union ieee754_double dbl;
long double ldbl;
+#if __HAVE_DISTINCT_FLOAT128
+ _Float128 f128;
+#endif
}
fpnum;
const void *ptr = &fpnum;
@@ -119,6 +122,32 @@ __printf_size (FILE *fp, const struct printf_info *info,
int wide = info->wide;
/* Fetch the argument value. */
+#if __HAVE_DISTINCT_FLOAT128
+ if (info->is_binary128)
+ {
+ fpnum.f128 = *(const _Float128 *) args[0];
+
+ /* Check for special values: not a number or infinity. */
+ if (isnan (fpnum.f128))
+ {
+ special = "nan";
+ wspecial = L"nan";
+ }
+ else if (isinf (fpnum.f128))
+ {
+ is_neg = signbit (fpnum.f128);
+ special = "inf";
+ wspecial = L"inf";
+ }
+ else
+ while (fpnum.f128 >= divisor && tag[1] != '\0')
+ {
+ fpnum.f128 /= divisor;
+ ++tag;
+ }
+ }
+ else
+#endif /* __HAVE_DISTINCT_FLOAT128 */
#ifndef __NO_LONG_DOUBLE_MATH
if (info->is_long_double && sizeof (long double) > sizeof (double))
{
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 2cf7c8a..b8c87a5 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -770,7 +770,8 @@ static const uint8_t jump_table[] =
.pad = pad, \
.extra = 0, \
.i18n = use_outdigits, \
- .wide = sizeof (CHAR_T) != 1 }; \
+ .wide = sizeof (CHAR_T) != 1, \
+ .is_binary128 = 0}; \
\
if (is_long_double) \
the_arg.pa_long_double = va_arg (ap, long double); \
@@ -788,6 +789,8 @@ static const uint8_t jump_table[] =
fspec->data_arg_type = PA_DOUBLE; \
fspec->info.is_long_double = 0; \
} \
+ /* Not supported by *printf functions. */ \
+ fspec->info.is_binary128 = 0; \
\
function_done = __printf_fp (s, &fspec->info, &ptr); \
} \
@@ -827,7 +830,8 @@ static const uint8_t jump_table[] =
.group = group, \
.pad = pad, \
.extra = 0, \
- .wide = sizeof (CHAR_T) != 1 }; \
+ .wide = sizeof (CHAR_T) != 1, \
+ .is_binary128 = 0}; \
\
if (is_long_double) \
the_arg.pa_long_double = va_arg (ap, long double); \
@@ -842,6 +846,8 @@ static const uint8_t jump_table[] =
ptr = (const void *) &args_value[fspec->data_arg]; \
if (__ldbl_is_dbl) \
fspec->info.is_long_double = 0; \
+ /* Not supported by *printf functions. */ \
+ fspec->info.is_binary128 = 0; \
\
function_done = __printf_fphex (s, &fspec->info, &ptr); \
} \
diff --git a/stdlib/fpioconst.h b/stdlib/fpioconst.h
index 7e19b0d..aab46d6 100644
--- a/stdlib/fpioconst.h
+++ b/stdlib/fpioconst.h
@@ -44,6 +44,10 @@
IBM extended precision). */
#include <bits/floatn.h>
+#if __HAVE_DISTINCT_FLOAT128
+# define FLT128_MAX_10_EXP_LOG 12 /* = floor(log_2(FLT128_MAX_10_EXP)) */
+#endif
+
/* For strtold, we need powers of 10 up to floor (log_2 (LDBL_MANT_DIG
- LDBL_MIN_EXP + 2)). When _Float128 is enabled in libm and it is
ABI-distinct from long double (e.g. on powerpc64le), we also need powers
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 99125f2..1313aa5 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -51,6 +51,9 @@ __BEGIN_DECLS
# endif
#endif /* X/Open or XPG7 and <sys/wait.h> not included. */
+/* _FloatN API tests for enablement. */
+#include <bits/floatn.h>
+
/* Returned by `div'. */
typedef struct
{
@@ -173,6 +176,11 @@ extern int strfromf (char *__dest, size_t __size, const char *__format,
extern int strfroml (char *__dest, size_t __size, const char *__format,
long double __f)
__THROW __nonnull ((3));
+# if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
+extern int strfromf128 (char *__dest, size_t __size, const char * __format,
+ _Float128 __f)
+ __THROW __nonnull ((3));
+# endif
#endif
diff --git a/stdlib/strfrom-skeleton.c b/stdlib/strfrom-skeleton.c
index 811a29c..5841919 100644
--- a/stdlib/strfrom-skeleton.c
+++ b/stdlib/strfrom-skeleton.c
@@ -132,6 +132,12 @@ STRFROM (char *dest, size_t size, const char *format, FLOAT f)
which type of floating-point number is being passed. */
info.is_long_double = __builtin_types_compatible_p (FLOAT, long double);
+ /* Similarly, the function strfromf128 passes a floating-point number in
+ _Float128 format to printf_fp. */
+#if __HAVE_DISTINCT_FLOAT128
+ info.is_binary128 = __builtin_types_compatible_p (FLOAT, _Float128);
+#endif
+
/* Set info according to the format string. */
info.prec = precision;
info.spec = specifier;
diff --git a/sysdeps/ieee754/float128/Makefile b/sysdeps/ieee754/float128/Makefile
index 6a7b0e0..c07586c 100644
--- a/sysdeps/ieee754/float128/Makefile
+++ b/sysdeps/ieee754/float128/Makefile
@@ -1,3 +1,3 @@
ifeq ($(subdir),stdlib)
-routines += float1282mpn
+routines += float1282mpn strfromf128
endif
diff --git a/sysdeps/ieee754/float128/Versions b/sysdeps/ieee754/float128/Versions
index 9f431d9..caf2064 100644
--- a/sysdeps/ieee754/float128/Versions
+++ b/sysdeps/ieee754/float128/Versions
@@ -2,6 +2,11 @@
%ifndef FLOAT128_VERSION
% error "float128-abi.h must define FLOAT128_VERSION"
%endif
+libc {
+ FLOAT128_VERSION {
+ strfromf128;
+ }
+}
libm {
FLOAT128_VERSION {
__acosf128_finite;
diff --git a/sysdeps/ieee754/float128/strfromf128.c b/sysdeps/ieee754/float128/strfromf128.c
new file mode 100644
index 0000000..597c7e6
--- /dev/null
+++ b/sysdeps/ieee754/float128/strfromf128.c
@@ -0,0 +1,25 @@
+/* Definitions for strfromf128. Implementation in stdlib/strfrom-skeleton.c.
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ 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/>. */
+
+#define FLOAT _Float128
+#define STRFROM strfromf128
+
+#include <bits/floatn.h>
+#include <float128_private.h>
+
+#include <stdlib/strfrom-skeleton.c>
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=fb91e22c252dbefd1b141fdf151903cf5aea7727
commit fb91e22c252dbefd1b141fdf151903cf5aea7727
Author: Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
Date: Thu Nov 3 12:26:52 2016 -0200
float128: Add conversion from float128 to mpn
Reuse the code for __mpn_extract_long_double to implement
__mpn_extract_float128.
2017-05-15 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
* include/gmp.h (__mpn_extract_float128): Declare when
__HAVE_DISTINCT_FLOAT128 is 1.
* misc/sys/param.h (MIN, MAX): Only define if not yet defined.
* sysdeps/ieee754/float128/Makefile: New file.
* sysdeps/ieee754/float128/float1282mpn.c: New file.
* sysdeps/ieee754/ldbl-128/ldbl2mpn.c (__mpn_extract_float128): New
function, which is built when __FLOAT128_OVERRIDE is defined.
diff --git a/include/gmp.h b/include/gmp.h
index b741670..95d6c16 100644
--- a/include/gmp.h
+++ b/include/gmp.h
@@ -15,6 +15,12 @@ extern mp_size_t __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
int *expt, int *is_neg,
long double value);
+#if __HAVE_DISTINCT_FLOAT128
+extern mp_size_t __mpn_extract_float128 (mp_ptr res_ptr, mp_size_t size,
+ int *expt, int *is_neg,
+ _Float128 value);
+#endif
+
extern float __mpn_construct_float (mp_srcptr frac_ptr, int expt, int sign);
extern double __mpn_construct_double (mp_srcptr frac_ptr, int expt,
diff --git a/misc/sys/param.h b/misc/sys/param.h
index 9721613..02d6b1c 100644
--- a/misc/sys/param.h
+++ b/misc/sys/param.h
@@ -99,8 +99,12 @@
#define powerof2(x) ((((x) - 1) & (x)) == 0)
/* Macros for min/max. */
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#define MAX(a,b) (((a)>(b))?(a):(b))
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+#ifndef MAX
+# define MAX(a,b) (((a)>(b))?(a):(b))
+#endif
#endif /* sys/param.h */
diff --git a/sysdeps/ieee754/float128/Makefile b/sysdeps/ieee754/float128/Makefile
new file mode 100644
index 0000000..6a7b0e0
--- /dev/null
+++ b/sysdeps/ieee754/float128/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),stdlib)
+routines += float1282mpn
+endif
diff --git a/sysdeps/ieee754/float128/float1282mpn.c b/sysdeps/ieee754/float128/float1282mpn.c
new file mode 100644
index 0000000..b0dd2e9
--- /dev/null
+++ b/sysdeps/ieee754/float128/float1282mpn.c
@@ -0,0 +1,20 @@
+/* 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/>. */
+
+#define __FLOAT128_OVERRIDE
+
+#include "../ldbl-128/ldbl2mpn.c"
diff --git a/sysdeps/ieee754/ldbl-128/ldbl2mpn.c b/sysdeps/ieee754/ldbl-128/ldbl2mpn.c
index 71a6f04..e23cb76 100644
--- a/sysdeps/ieee754/ldbl-128/ldbl2mpn.c
+++ b/sysdeps/ieee754/ldbl-128/ldbl2mpn.c
@@ -18,10 +18,14 @@
#include "gmp.h"
#include "gmp-impl.h"
#include "longlong.h"
-#include <ieee754.h>
-#include <float.h>
-#include <math.h>
-#include <stdlib.h>
+
+#ifdef __FLOAT128_OVERRIDE
+# include <float128_private.h>
+#else
+# include <ieee754.h>
+# include <float.h>
+# include <math.h>
+#endif
/* Convert a `long double' in IEEE854 quad-precision format to a
multi-precision integer representing the significand scaled up by its
@@ -29,9 +33,15 @@
(MPN frexpl). */
mp_size_t
+#ifdef __FLOAT128_OVERRIDE
+__mpn_extract_float128 (mp_ptr res_ptr, mp_size_t size,
+ int *expt, int *is_neg,
+ _Float128 value)
+#else
__mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
int *expt, int *is_neg,
long double value)
+#endif
{
union ieee854_long_double u;
u.d = value;
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=ec9052ea0cb8baceee57ab26ca526b30f365dff9
commit ec9052ea0cb8baceee57ab26ca526b30f365dff9
Author: Paul E. Murphy <murphyp@linux.vnet.ibm.com>
Date: Fri Nov 4 09:57:27 2016 -0200
float128: Extend the power of ten tables
Update the power of ten tables used by the common implementation when long
double is not the most expressive real type.
2016-11-04 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
* stdlib/fpioconst.c (HAVE_EXTENDED_RANGE): New macro
for testing how big the power of ten table should be.
[TENS_P11_IDX]: Include if above is true.
[TENS_P12_IDX]: Include if above is true.
[TENS_P13_IDX]: Include if above is true.
[TENS_P14_IDX]: Include if above is true.
* stdlib/fpioconst.h (FPIOCONST_POW10_ARRAY_SIZE):
Use larger table if _Float128 is supported.
diff --git a/stdlib/fpioconst.c b/stdlib/fpioconst.c
index 7db7fa4..ba91108 100644
--- a/stdlib/fpioconst.c
+++ b/stdlib/fpioconst.c
@@ -27,6 +27,9 @@
with gen-fpioconst.c.
*/
+#define HAVE_EXTENDED_RANGE ((!defined __NO_LONG_DOUBLE_MATH \
+ && __LDBL_MAX_EXP__ > 1024) || __HAVE_DISTINCT_FLOAT128)
+
#if BITS_PER_MP_LIMB == 32
/* Table with constants of 10^(2^i), i=0..12 for 32-bit limbs. */
@@ -112,7 +115,7 @@ const mp_limb_t __tens[] =
0xd2db49ef, 0x926c3f5b, 0xae6209d4, 0x2d433949, 0x34f4a3c6, 0xd4305d94,
0xd9d61a05, 0x00000325,
-#if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024
+#if HAVE_EXTENDED_RANGE
# define TENS_P11_IDX (TENS_P10_IDX + TENS_P10_SIZE)
# define TENS_P11_SIZE 215
[TENS_P11_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@@ -659,7 +662,7 @@ const mp_limb_t __tens[] =
0x6d6c0267, 0x06f9c25b, 0xbd6078e0, 0xb5fcdc81, 0xd742fa41, 0xcccc2399,
0xc691adc0, 0x215ad82c, 0xea73b0c3, 0xa511e5b0, 0xf499e0a6, 0x53e27ab0,
0xd94440a2, 0x47752521, 0x9a6e3644, 0xab113708, 0x8f8b301d, 0x058a42a3,
-#endif /* !__NO_LONG_DOUBLE_MATH */
+#endif /* HAVE_EXTENDED_RANGE */
};
#elif BITS_PER_MP_LIMB == 64
@@ -748,7 +751,7 @@ const mp_limb_t __tens[] =
0xd2db49ef47187094ull, 0xae6209d4926c3f5bull, 0x34f4a3c62d433949ull,
0xd9d61a05d4305d94ull, 0x0000000000000325ull,
-#if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024
+#if HAVE_EXTENDED_RANGE
# define TENS_P11_IDX (TENS_P10_IDX + TENS_P10_SIZE)
# define TENS_P11_SIZE 108
[TENS_P11_IDX] = 0x0000000000000000ull, 0x0000000000000000ull,
@@ -1320,7 +1323,7 @@ const struct mp_power _fpioconst_pow10[FPIOCONST_POW10_ARRAY_SIZE] =
{ TENS_P8_IDX, TENS_P8_SIZE, 851, 848 },
{ TENS_P9_IDX, TENS_P9_SIZE, 1701, 1698 },
{ TENS_P10_IDX, TENS_P10_SIZE, 3402, 3399 },
-#if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024
+#if HAVE_EXTENDED_RANGE
{ TENS_P11_IDX, TENS_P11_SIZE, 6804, 6800 },
{ TENS_P12_IDX, TENS_P12_SIZE, 13607, 13604 },
{ TENS_P13_IDX, TENS_P13_SIZE, 27214, 27210 },
diff --git a/stdlib/fpioconst.h b/stdlib/fpioconst.h
index 6fc476b..7e19b0d 100644
--- a/stdlib/fpioconst.h
+++ b/stdlib/fpioconst.h
@@ -40,9 +40,16 @@
#define DBL_MAX_10_EXP_LOG 8 /* = floor(log_2(DBL_MAX_10_EXP)) */
#define FLT_MAX_10_EXP_LOG 5 /* = floor(log_2(FLT_MAX_10_EXP)) */
+/* On some machines, _Float128 may be ABI-distinct from long double (e.g
+ IBM extended precision). */
+#include <bits/floatn.h>
+
/* For strtold, we need powers of 10 up to floor (log_2 (LDBL_MANT_DIG
- - LDBL_MIN_EXP + 2)). */
-#if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024
+ - LDBL_MIN_EXP + 2)). When _Float128 is enabled in libm and it is
+ ABI-distinct from long double (e.g. on powerpc64le), we also need powers
+ of 10 up to floor (log_2 (FLT128_MANT_DIG - FLT128_MIN_EXP + 2)). */
+#if (!defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024) \
+ || __HAVE_DISTINCT_FLOAT128
# define FPIOCONST_POW10_ARRAY_SIZE 15
#else
# define FPIOCONST_POW10_ARRAY_SIZE 11
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources