about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>2016-08-09 16:48:54 -0500
committerGabriel F. T. Gomes <gftg@linux.vnet.ibm.com>2017-05-25 16:14:47 -0300
commit0ded00553f47d1e19bad2df60b4d6ee54eaff1ad (patch)
tree5625f7b30e20f2e893ef210379e79aed180f1dd8
parent6675666a8233b38c726df28d4c61d6e806585215 (diff)
downloadglibc-tuliom/float128.tar.gz
glibc-tuliom/float128.tar.xz
glibc-tuliom/float128.zip
powerpc64le: Enable float128 tuliom/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.
-rw-r--r--sysdeps/powerpc/bits/floatn.h88
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps578
-rw-r--r--sysdeps/powerpc/fpu/math_private.h11
-rw-r--r--sysdeps/powerpc/powerpc64le/Implies-before1
-rw-r--r--sysdeps/powerpc/powerpc64le/Makefile48
-rw-r--r--sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c57
-rw-r--r--sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h158
-rw-r--r--sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c36
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist137
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h2
11 files changed, 1123 insertions, 0 deletions
diff --git a/sysdeps/powerpc/bits/floatn.h b/sysdeps/powerpc/bits/floatn.h
new file mode 100644
index 0000000000..d5a8b74efc
--- /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 72eb2b1e5a..65715383f1 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 3c71275392..35b0d8e9be 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 0000000000..48065141a9
--- /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 0000000000..0e3c449b2d
--- /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 0000000000..1ed58e5732
--- /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 0000000000..b5448d891b
--- /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 0000000000..769d3f8922
--- /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 c761221ffe..c36bed2e32 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 9658ded223..68fab09be0 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 0000000000..c47621c9c9
--- /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