From patchwork Wed Jun 14 22:05:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriel F T Gomes X-Patchwork-Id: 21032 X-Patchwork-Delegate: joseph@codesourcery.com Received: (qmail 83108 invoked by alias); 14 Jun 2017 22:06:11 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 82718 invoked by uid 89); 14 Jun 2017 22:06:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, KHOP_DYNAMIC, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=_2 X-HELO: mx0a-001b2d01.pphosted.com From: "Gabriel F. T. Gomes" To: libc-alpha@sourceware.org Subject: [PATCH 4/4] powerpc64le: Enable float128 Date: Wed, 14 Jun 2017 19:05:34 -0300 In-Reply-To: <1497477934-26163-1-git-send-email-gftg@linux.vnet.ibm.com> References: <1497477934-26163-1-git-send-email-gftg@linux.vnet.ibm.com> X-TM-AS-MML: disable x-cbid: 17061422-0032-0000-0000-0000056A646E X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17061422-0033-0000-0000-000011F088E1 Message-Id: <1497477934-26163-5-git-send-email-gftg@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-06-14_06:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=4 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706140365 From: "Paul E. Murphy" This patch adds ULPs for the float128 type, updates the abilist for libc and libm, and adds the files bits/floatn.h and float128-abi.h, in order to enable the new type for powerpc64le. This patch also adds the implementation of sqrtf128 for powerpc64le, since it is not implemented in libgcc. The sfp-machine.h header is taken from libgcc. Tested for powerpc64, powerpc64le and s390x. * NEWS: Mention the addition of float128 features for powerpc64le. * manual/math.texi (Mathematics): Mention the enabling of float128 for powerpc64le. * manual/libm-err-tab.pl (@all_floats, %suffices, parse_ulps): Enable generation of float128 entries on the error table. * math/test-float128.h: Define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include bits/libc-header-start.h before including bits/floatn.h. * sysdeps/ieee754/float128/strfromf128.c: Likewise. * sysdeps/ieee754/float128/strtof128_l.c: Likewise. * sysdeps/ieee754/float128/wcstof128.c: Likewise. * sysdeps/ieee754/float128/wcstof128_l.c: Likewise. * sysdeps/powerpc/bits/floatn.h: New file. * sysdeps/powerpc/fpu/libm-test-ulps: Regenerated. * sysdeps/powerpc/fpu/math_private.h: (__ieee754_sqrtf128): New inline override. * sysdeps/powerpc/powerpc64le/Implies-before: New file. * sysdeps/powerpc/powerpc64le/Makefile: New file. * sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c: New file. * sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h: New file. * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c: New file. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Updated. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h: New file. --- NEWS | 78 +++ manual/libm-err-tab.pl | 7 +- manual/math.texi | 3 +- math/test-float128.h | 2 + sysdeps/ieee754/float128/strfromf128.c | 2 + sysdeps/ieee754/float128/strtof128_l.c | 2 + sysdeps/ieee754/float128/wcstof128.c | 2 + sysdeps/ieee754/float128/wcstof128_l.c | 2 + sysdeps/powerpc/bits/floatn.h | 90 ++++ sysdeps/powerpc/fpu/libm-test-ulps | 578 +++++++++++++++++++++ sysdeps/powerpc/fpu/math_private.h | 10 + sysdeps/powerpc/powerpc64le/Implies-before | 1 + sysdeps/powerpc/powerpc64le/Makefile | 48 ++ sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c | 51 ++ sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h | 158 ++++++ .../powerpc/powerpc64le/power9/fpu/e_sqrtf128.c | 36 ++ .../sysv/linux/powerpc/powerpc64/libc-le.abilist | 7 + .../sysv/linux/powerpc/powerpc64/libm-le.abilist | 138 +++++ .../sysv/linux/powerpc/powerpc64le/float128-abi.h | 2 + 19 files changed, 1213 insertions(+), 4 deletions(-) create mode 100644 sysdeps/powerpc/bits/floatn.h create mode 100644 sysdeps/powerpc/powerpc64le/Implies-before create mode 100644 sysdeps/powerpc/powerpc64le/Makefile create mode 100644 sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c create mode 100644 sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h create mode 100644 sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c create mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h diff --git a/NEWS b/NEWS index 8d35bd6..66b8b1b 100644 --- a/NEWS +++ b/NEWS @@ -95,6 +95,84 @@ Version 2.26 as atomic variables to try to implement Dekker's mutual exclusion algorithm). +* Support for ISO/IEC TS 18661-3:2015 is added. It is currently only + enabled for powerpc64le. + + New functions from ISO/IEC TS 18661-3: + + - String Conversion Functions: strfromf128 and strtof128. + + New functions from ISO/IEC TS 18661-3: + + - Signaling NaN macro: SNANF128. + + - Trigonometric Functions: acosf128, asinf128, atanf128, atan2f128, + cosf128, sinf128, tanf128. + + - Hyperbolic Functions: acoshf128, asinhf128, atanhf128, coshf128, + sinhf128, tanhf128. + + - Exponential and Logarithmic Functions: expf128, exp2f128, expm1f128, + frexpf128, ilogbf128, ldexpf128, llogbf128, logf128, log10f128, + log1pf128, log2f128, logbf128, modff128, scalbnf128, scalblnf128. + + - Power and Absolute Functions: cbrtf128, fabsf128, hypotf128, powf128, + sqrtf128. + + - Error and Gamma Functions: erff128, erfcf128, lgammaf128, tgammaf128. + + - Nearest Integer Functions: ceilf128, floorf128, nearbyintf128, + rintf128, lrintf128, llrintf128, roundf128, lroundf128, llroundf128, + roundevenf128, truncf128, fromfpf128, ufromfpf128, fromfpxf128, + ufromfpxf128. + + - Remainder Functions: fmodf128, remainderf128, remquof128. + + - Manipulation Functions: copysignf128, nanf128, nextafterf128, + nextupf128, nextdownf128, canonicalizef128. + + - Minimum, Maximum, and Positive Difference Functions: fdimf128, + fmaxf128, fminf128, fmaxmagf128, fminmagf128. + + - Floating Multiply-Add Function: fmaf128. + + - Total Order Functions: totalorderf128, totalordermagf128. + + - Payload Functions: getpayloadf128, setpayloadf128, setpayloadsigf128. + + New functions from ISO/IEC TS 18661-3: + + - Trigonometric Functions: cacosf128, casinf128, catanf128, ccosf128, + csinf128, ctanf128. + + - Hyperbolic Functions: cacoshf128, casinhf128, catanhf128, ccoshf128, + csinhf128, ctanhf128. + + - Exponential and Logarithmic Functions: cexpf128, clogf128. + + - Power and Absolute Functions: cabsf128, cpowf128, csqrtf128. + + - Manipulation Functions: cargf128, cimagf128, CMPLXF128, conjf128, + cprojf128, crealf128. + + The following function is added to glibc as a GNU extension: + + - Wide String Conversion Function: wsctof128. + + The following functions are added as GNU extensions: + + - Trigonometric Functions: sincosf128. + + - Exponential and Logarithmic Functions: exp10f128. + + - Error and Gamma Functions: lgammaf128_r. + + - Bessel Functions: j0f128, j1f128, jnf128, y0f128, y1f128, ynf128. + + The following function is added as GNU extensions: + + - Exponential and Logarithmic Functions: clog10f128. + Security related changes: * The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes, diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl index 75f5e5b..e0bc3b7 100755 --- a/manual/libm-err-tab.pl +++ b/manual/libm-err-tab.pl @@ -40,11 +40,12 @@ use vars qw (%results @all_floats %suffices %all_functions); # all_floats is in output order and contains all recognised float types that # we're going to output -@all_floats = ('float', 'double', 'ldouble'); +@all_floats = ('float', 'double', 'ldouble', 'float128'); %suffices = ( 'float' => 'f', 'double' => '', - 'ldouble' => 'l' + 'ldouble' => 'l', + 'float128' => 'f128' ); # Pretty description of platform @@ -113,7 +114,7 @@ sub parse_ulps { $ignore_fn = 0; $all_functions{$test} = 1; } - if (/^i?(float|double|ldouble):/) { + if (/^i?(float|double|ldouble|float128):/) { ($float, $eps) = split /\s*:\s*/,$_,2; if ($ignore_fn) { next; diff --git a/manual/math.texi b/manual/math.texi index 50bf8aa..7aeacca 100644 --- a/manual/math.texi +++ b/manual/math.texi @@ -62,7 +62,8 @@ functions provided for @code{double}, @code{float}, and @code{long double} are also provided for the supported type. Currently, support for @code{_Float@var{N}} or @code{_Float@var{N}x} -types is not provided for any machine. +types is only provided for @code{_Float128} on powerpc64le (PowerPC +64-bits little-endian). @menu * Mathematical Constants:: Precise numeric values for often-used diff --git a/math/test-float128.h b/math/test-float128.h index 17c5928..f9a7e16 100644 --- a/math/test-float128.h +++ b/math/test-float128.h @@ -20,6 +20,8 @@ #include "test-math-floatn.h" /* Fixup builtins and constants for older compilers. */ +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include #include #include diff --git a/sysdeps/ieee754/float128/strfromf128.c b/sysdeps/ieee754/float128/strfromf128.c index 597c7e6..b61ae69 100644 --- a/sysdeps/ieee754/float128/strfromf128.c +++ b/sysdeps/ieee754/float128/strfromf128.c @@ -19,6 +19,8 @@ #define FLOAT _Float128 #define STRFROM strfromf128 +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include #include #include diff --git a/sysdeps/ieee754/float128/strtof128_l.c b/sysdeps/ieee754/float128/strtof128_l.c index 0f768a3..a102168 100644 --- a/sysdeps/ieee754/float128/strtof128_l.c +++ b/sysdeps/ieee754/float128/strtof128_l.c @@ -19,6 +19,8 @@ #include /* Bring in potential typedef for _Float128 early for declaration below. */ +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include #include extern _Float128 ____strtof128_l_internal (const char *, char **, diff --git a/sysdeps/ieee754/float128/wcstof128.c b/sysdeps/ieee754/float128/wcstof128.c index c5a17ba..77bbaab 100644 --- a/sysdeps/ieee754/float128/wcstof128.c +++ b/sysdeps/ieee754/float128/wcstof128.c @@ -22,6 +22,8 @@ #define USE_WIDE_CHAR 1 /* Bring in _Float128 typedef if needed. */ +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include #include extern _Float128 ____wcstof128_l_internal (const wchar_t *, wchar_t **, int, diff --git a/sysdeps/ieee754/float128/wcstof128_l.c b/sysdeps/ieee754/float128/wcstof128_l.c index 670b6af..978c6bb 100644 --- a/sysdeps/ieee754/float128/wcstof128_l.c +++ b/sysdeps/ieee754/float128/wcstof128_l.c @@ -22,6 +22,8 @@ #define USE_WIDE_CHAR 1 +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include #include extern _Float128 ____wcstof128_l_internal (const wchar_t *, wchar_t **, int, diff --git a/sysdeps/powerpc/bits/floatn.h b/sysdeps/powerpc/bits/floatn.h new file mode 100644 index 0000000..3ad9749 --- /dev/null +++ b/sysdeps/powerpc/bits/floatn.h @@ -0,0 +1,90 @@ +/* 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 + . */ + +#ifndef _BITS_FLOATN_H +#define _BITS_FLOATN_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__ && !defined __cplusplus +# 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 + +#endif /* _BITS_FLOATN_H */ diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 72eb2b1..7fb6744 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -3,1583 +3,1985 @@ # Maximal error of functions: Function: "acos": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "acos_downward": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "acos_towardzero": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "acos_upward": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "acosh": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "acosh_downward": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: "acosh_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: "acosh_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 4 Function: "asin": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "asin_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "asin_towardzero": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "asin_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "asinh": double: 1 float: 1 +float128: 3 idouble: 1 ifloat: 1 +ifloat128: 3 ildouble: 2 ldouble: 2 Function: "asinh_downward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 5 ldouble: 5 Function: "asinh_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: "asinh_upward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 7 ldouble: 7 Function: "atan": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "atan2": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "atan2_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: "atan2_towardzero": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "atan2_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "atan_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "atan_towardzero": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "atan_upward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "atanh": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 2 ldouble: 2 Function: "atanh_downward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 3 ldouble: 3 Function: "atanh_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "atanh_upward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 4 ldouble: 4 Function: "cabs": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "cabs_downward": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "cabs_towardzero": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "cabs_upward": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "cacos": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Imaginary part of "cacos": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: Real part of "cacos_downward": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: Imaginary part of "cacos_downward": double: 5 float: 3 +float128: 6 idouble: 5 ifloat: 3 +ifloat128: 6 ildouble: 8 ldouble: 8 Function: Real part of "cacos_towardzero": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: Imaginary part of "cacos_towardzero": double: 5 float: 3 +float128: 5 idouble: 5 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: Real part of "cacos_upward": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: Imaginary part of "cacos_upward": double: 5 float: 5 +float128: 7 idouble: 5 ifloat: 5 +ifloat128: 7 ildouble: 13 ldouble: 13 Function: Real part of "cacosh": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: Imaginary part of "cacosh": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Real part of "cacosh_downward": double: 5 float: 3 +float128: 5 idouble: 5 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: Imaginary part of "cacosh_downward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 6 ldouble: 6 Function: Real part of "cacosh_towardzero": double: 5 float: 3 +float128: 5 idouble: 5 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: Imaginary part of "cacosh_towardzero": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: Real part of "cacosh_upward": double: 4 float: 4 +float128: 6 idouble: 4 ifloat: 4 +ifloat128: 6 ildouble: 12 ldouble: 12 Function: Imaginary part of "cacosh_upward": double: 3 float: 2 +float128: 4 idouble: 3 ifloat: 2 +ifloat128: 4 ildouble: 8 ldouble: 8 Function: "carg": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "carg_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: "carg_towardzero": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "carg_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Real part of "casin": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Imaginary part of "casin": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: Real part of "casin_downward": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: Imaginary part of "casin_downward": double: 5 float: 3 +float128: 6 idouble: 5 ifloat: 3 +ifloat128: 6 ildouble: 8 ldouble: 8 Function: Real part of "casin_towardzero": double: 3 float: 1 +float128: 3 idouble: 3 ifloat: 1 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: Imaginary part of "casin_towardzero": double: 5 float: 3 +float128: 5 idouble: 5 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: Real part of "casin_upward": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: Imaginary part of "casin_upward": double: 5 float: 5 +float128: 7 idouble: 5 ifloat: 5 +ifloat128: 7 ildouble: 13 ldouble: 13 Function: Real part of "casinh": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: Imaginary part of "casinh": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Real part of "casinh_downward": double: 5 float: 3 +float128: 6 idouble: 5 ifloat: 3 +ifloat128: 6 ildouble: 8 ldouble: 8 Function: Imaginary part of "casinh_downward": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: Real part of "casinh_towardzero": double: 5 float: 3 +float128: 5 idouble: 5 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: Imaginary part of "casinh_towardzero": double: 3 float: 1 +float128: 3 idouble: 3 ifloat: 1 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: Real part of "casinh_upward": double: 5 float: 5 +float128: 7 idouble: 5 ifloat: 5 +ifloat128: 7 ildouble: 13 ldouble: 13 Function: Imaginary part of "casinh_upward": double: 3 float: 2 +float128: 3 idouble: 3 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: Real part of "catan": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: Imaginary part of "catan": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "catan_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "catan_downward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 7 ldouble: 7 Function: Real part of "catan_towardzero": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 7 ldouble: 7 Function: Imaginary part of "catan_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Real part of "catan_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "catan_upward": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 8 ldouble: 8 Function: Real part of "catanh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Imaginary part of "catanh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: Real part of "catanh_downward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: Imaginary part of "catanh_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "catanh_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Imaginary part of "catanh_towardzero": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 7 ldouble: 7 Function: Real part of "catanh_upward": double: 4 float: 4 +float128: 4 idouble: 4 ifloat: 4 +ifloat128: 4 ildouble: 8 ldouble: 8 Function: Imaginary part of "catanh_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: "cbrt": double: 3 float: 1 +float128: 1 idouble: 3 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "cbrt_downward": double: 4 float: 1 +float128: 1 idouble: 4 ifloat: 1 +ifloat128: 1 ildouble: 5 ldouble: 5 Function: "cbrt_towardzero": double: 3 float: 1 +float128: 1 idouble: 3 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "cbrt_upward": double: 5 float: 1 +float128: 1 idouble: 5 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "ccos": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: Imaginary part of "ccos": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "ccos_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "ccos_downward": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "ccos_towardzero": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "ccos_towardzero": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "ccos_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "ccos_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: Real part of "ccosh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: Imaginary part of "ccosh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "ccosh_downward": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "ccosh_downward": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "ccosh_towardzero": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "ccosh_towardzero": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "ccosh_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "ccosh_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: Real part of "cexp": double: 2 float: 1 +float128: 1 idouble: 2 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Imaginary part of "cexp": double: 1 float: 2 +float128: 1 idouble: 1 ifloat: 2 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "cexp_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 11 ldouble: 11 Function: Imaginary part of "cexp_downward": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 11 ldouble: 11 Function: Real part of "cexp_towardzero": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 11 ldouble: 11 Function: Imaginary part of "cexp_towardzero": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 11 ldouble: 11 Function: Real part of "cexp_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "cexp_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Real part of "clog": double: 3 float: 3 +float128: 2 idouble: 3 ifloat: 3 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: Imaginary part of "clog": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "clog10": double: 3 float: 4 +float128: 2 idouble: 3 ifloat: 4 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Imaginary part of "clog10": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: Real part of "clog10_downward": double: 6 float: 6 +float128: 3 idouble: 6 ifloat: 6 +ifloat128: 3 ildouble: 10 ldouble: 10 Function: Imaginary part of "clog10_downward": double: 2 float: 4 +float128: 3 idouble: 2 ifloat: 4 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: Real part of "clog10_towardzero": double: 5 float: 5 +float128: 4 idouble: 5 ifloat: 5 +ifloat128: 4 ildouble: 9 ldouble: 9 Function: Imaginary part of "clog10_towardzero": double: 2 float: 4 +float128: 3 idouble: 2 ifloat: 4 +ifloat128: 3 ildouble: 8 ldouble: 8 Function: Real part of "clog10_upward": double: 8 float: 5 +float128: 4 idouble: 8 ifloat: 5 +ifloat128: 4 ildouble: 10 ldouble: 10 Function: Imaginary part of "clog10_upward": double: 2 float: 4 +float128: 3 idouble: 2 ifloat: 4 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: Real part of "clog_downward": double: 7 float: 5 +float128: 3 idouble: 7 ifloat: 5 +ifloat128: 3 ildouble: 11 ldouble: 11 Function: Imaginary part of "clog_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: Real part of "clog_towardzero": double: 7 float: 5 +float128: 3 idouble: 7 ifloat: 5 +ifloat128: 3 ildouble: 10 ldouble: 10 Function: Imaginary part of "clog_towardzero": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 7 ldouble: 7 Function: Real part of "clog_upward": double: 8 float: 5 +float128: 4 idouble: 8 ifloat: 5 +ifloat128: 4 ildouble: 10 ldouble: 10 Function: Imaginary part of "clog_upward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: "cos": float: 3 +float128: 1 ifloat: 3 +ifloat128: 1 ildouble: 4 ldouble: 4 Function: "cos_downward": double: 1 float: 4 +float128: 3 idouble: 1 ifloat: 4 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: "cos_towardzero": double: 1 float: 3 +float128: 1 idouble: 1 ifloat: 3 +ifloat128: 1 ildouble: 4 ldouble: 4 Function: "cos_upward": double: 1 float: 3 +float128: 2 idouble: 1 ifloat: 3 +ifloat128: 2 ildouble: 5 ldouble: 5 Function: "cosh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "cosh_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "cosh_towardzero": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "cosh_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "cpow": double: 2 float: 5 +float128: 4 idouble: 2 ifloat: 5 +ifloat128: 4 ildouble: 4 ldouble: 4 Function: Imaginary part of "cpow": float: 2 +float128: 9 ifloat: 2 +ifloat128: 9 ildouble: 2 ldouble: 2 Function: Real part of "cpow_downward": double: 4 float: 8 +float128: 6 idouble: 4 ifloat: 8 +ifloat128: 6 ildouble: 7 ldouble: 7 Function: Imaginary part of "cpow_downward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: Real part of "cpow_towardzero": double: 4 float: 8 +float128: 6 idouble: 4 ifloat: 8 +ifloat128: 6 ildouble: 8 ldouble: 8 Function: Imaginary part of "cpow_towardzero": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: Real part of "cpow_upward": double: 4 float: 1 +float128: 3 idouble: 4 ifloat: 1 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "cpow_upward": double: 1 float: 2 +float128: 2 idouble: 1 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Real part of "csin": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Imaginary part of "csin": +float128: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: Real part of "csin_downward": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "csin_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "csin_towardzero": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "csin_towardzero": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "csin_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Imaginary part of "csin_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Real part of "csinh": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: Imaginary part of "csinh": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: Real part of "csinh_downward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "csinh_downward": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "csinh_towardzero": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Imaginary part of "csinh_towardzero": double: 2 float: 3 +float128: 2 idouble: 2 ifloat: 3 +ifloat128: 2 ildouble: 6 ldouble: 6 Function: Real part of "csinh_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "csinh_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: Real part of "csqrt": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Imaginary part of "csqrt": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: Real part of "csqrt_downward": double: 5 float: 4 +float128: 4 idouble: 5 ifloat: 4 +ifloat128: 4 ildouble: 4 ldouble: 4 Function: Imaginary part of "csqrt_downward": double: 4 float: 3 +float128: 3 idouble: 4 ifloat: 3 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: Real part of "csqrt_towardzero": double: 4 float: 3 +float128: 3 idouble: 4 ifloat: 3 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: Imaginary part of "csqrt_towardzero": double: 4 float: 3 +float128: 3 idouble: 4 ifloat: 3 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: Real part of "csqrt_upward": double: 5 float: 4 +float128: 4 idouble: 5 ifloat: 4 +ifloat128: 4 ildouble: 12 ldouble: 12 Function: Imaginary part of "csqrt_upward": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 8 ldouble: 8 Function: Real part of "ctan": double: 1 float: 1 +float128: 3 idouble: 1 ifloat: 1 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "ctan": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 2 ldouble: 2 Function: Real part of "ctan_downward": double: 6 float: 5 +float128: 4 idouble: 6 ifloat: 5 +ifloat128: 4 ildouble: 6 ldouble: 6 Function: Imaginary part of "ctan_downward": double: 2 float: 1 +float128: 5 idouble: 2 ifloat: 1 +ifloat128: 5 ildouble: 9 ldouble: 9 Function: Real part of "ctan_towardzero": double: 5 float: 3 +float128: 4 idouble: 5 ifloat: 3 +ifloat128: 4 ildouble: 6 ldouble: 6 Function: Imaginary part of "ctan_towardzero": double: 2 float: 2 +float128: 5 idouble: 2 ifloat: 2 +ifloat128: 5 ildouble: 13 ldouble: 13 Function: Real part of "ctan_upward": double: 2 float: 3 +float128: 5 idouble: 2 ifloat: 3 +ifloat128: 5 ildouble: 7 ldouble: 7 Function: Imaginary part of "ctan_upward": double: 2 float: 3 +float128: 5 idouble: 2 ifloat: 3 +ifloat128: 5 ildouble: 10 ldouble: 10 Function: Real part of "ctanh": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Imaginary part of "ctanh": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: Real part of "ctanh_downward": double: 4 float: 1 +float128: 5 idouble: 4 ifloat: 1 +ifloat128: 5 ildouble: 9 ldouble: 9 Function: Imaginary part of "ctanh_downward": double: 6 float: 5 +float128: 4 idouble: 6 ifloat: 5 +ifloat128: 4 ildouble: 6 ldouble: 6 Function: Real part of "ctanh_towardzero": double: 2 float: 2 +float128: 5 idouble: 2 ifloat: 2 +ifloat128: 5 ildouble: 13 ldouble: 13 Function: Imaginary part of "ctanh_towardzero": double: 5 float: 2 +float128: 3 idouble: 5 ifloat: 2 +ifloat128: 3 ildouble: 10 ldouble: 10 Function: Real part of "ctanh_upward": double: 2 float: 3 +float128: 5 idouble: 2 ifloat: 3 +ifloat128: 5 ildouble: 10 ldouble: 10 Function: Imaginary part of "ctanh_upward": double: 2 float: 3 +float128: 5 idouble: 2 ifloat: 3 +ifloat128: 5 ildouble: 10 ldouble: 10 Function: "erf": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "erf_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "erf_towardzero": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "erf_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "erfc": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "erfc_downward": double: 3 float: 4 +float128: 5 idouble: 3 ifloat: 4 +ifloat128: 5 ildouble: 10 ldouble: 10 Function: "erfc_towardzero": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 9 ldouble: 9 Function: "erfc_upward": double: 3 float: 4 +float128: 5 idouble: 3 ifloat: 4 +ifloat128: 5 ildouble: 7 ldouble: 7 Function: "exp": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "exp10": double: 2 +float128: 2 idouble: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "exp10_downward": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 9 ldouble: 9 Function: "exp10_towardzero": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 9 ldouble: 9 Function: "exp10_upward": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: "exp2": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "exp2_downward": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "exp2_towardzero": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "exp2_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 @@ -1606,32 +2008,40 @@ ldouble: 1 Function: "expm1": double: 1 float: 1 +float128: 1 idouble: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "expm1_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "expm1_towardzero": double: 1 float: 2 +float128: 4 idouble: 1 ifloat: 2 +ifloat128: 4 ildouble: 5 ldouble: 5 Function: "expm1_upward": double: 1 float: 1 +float128: 3 idouble: 1 ifloat: 1 +ifloat128: 3 ildouble: 6 ldouble: 6 @@ -1670,306 +2080,386 @@ ldouble: 1 Function: "gamma": double: 3 float: 4 +float128: 9 idouble: 3 ifloat: 4 +ifloat128: 9 ildouble: 3 ldouble: 3 Function: "gamma_downward": double: 4 float: 4 +float128: 9 idouble: 4 ifloat: 4 +ifloat128: 9 ildouble: 15 ldouble: 15 Function: "gamma_towardzero": double: 4 float: 3 +float128: 9 idouble: 4 ifloat: 3 +ifloat128: 9 ildouble: 16 ldouble: 16 Function: "gamma_upward": double: 4 float: 5 +float128: 9 idouble: 4 ifloat: 5 +ifloat128: 9 ildouble: 11 ldouble: 11 Function: "hypot": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "hypot_downward": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "hypot_towardzero": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "hypot_upward": double: 1 +float128: 1 idouble: 1 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "j0": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "j0_downward": double: 2 float: 3 +float128: 4 idouble: 2 ifloat: 3 +ifloat128: 4 ildouble: 11 ldouble: 11 Function: "j0_towardzero": double: 2 float: 1 +float128: 2 idouble: 2 ifloat: 1 +ifloat128: 2 ildouble: 8 ldouble: 8 Function: "j0_upward": double: 3 float: 2 +float128: 5 idouble: 3 ifloat: 2 +ifloat128: 5 ildouble: 6 ldouble: 6 Function: "j1": double: 1 float: 2 +float128: 4 idouble: 1 ifloat: 2 +ifloat128: 4 ildouble: 2 ldouble: 2 Function: "j1_downward": double: 3 float: 2 +float128: 4 idouble: 3 ifloat: 2 +ifloat128: 4 ildouble: 7 ldouble: 7 Function: "j1_towardzero": double: 3 float: 2 +float128: 4 idouble: 3 ifloat: 2 +ifloat128: 4 ildouble: 7 ldouble: 7 Function: "j1_upward": double: 3 float: 4 +float128: 3 idouble: 3 ifloat: 4 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "jn": double: 4 float: 4 +float128: 7 idouble: 4 ifloat: 4 +ifloat128: 7 ildouble: 4 ldouble: 4 Function: "jn_downward": double: 4 float: 5 +float128: 8 idouble: 4 ifloat: 5 +ifloat128: 8 ildouble: 7 ldouble: 7 Function: "jn_towardzero": double: 4 float: 5 +float128: 8 idouble: 4 ifloat: 5 +ifloat128: 8 ildouble: 7 ldouble: 7 Function: "jn_upward": double: 5 float: 4 +float128: 7 idouble: 5 ifloat: 4 +ifloat128: 7 ildouble: 5 ldouble: 5 Function: "lgamma": double: 3 float: 4 +float128: 9 idouble: 3 ifloat: 4 +ifloat128: 9 ildouble: 3 ldouble: 3 Function: "lgamma_downward": double: 4 float: 4 +float128: 9 idouble: 4 ifloat: 4 +ifloat128: 9 ildouble: 15 ldouble: 15 Function: "lgamma_towardzero": double: 4 float: 3 +float128: 9 idouble: 4 ifloat: 3 +ifloat128: 9 ildouble: 16 ldouble: 16 Function: "lgamma_upward": double: 4 float: 5 +float128: 9 idouble: 4 ifloat: 5 +ifloat128: 9 ildouble: 11 ldouble: 11 Function: "log": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "log10": double: 2 float: 2 +float128: 1 idouble: 2 ifloat: 2 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "log10_downward": double: 2 float: 3 +float128: 1 idouble: 2 ifloat: 3 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "log10_towardzero": double: 2 float: 2 +float128: 1 idouble: 2 ifloat: 2 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "log10_upward": double: 2 float: 2 +float128: 1 idouble: 2 ifloat: 2 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "log1p": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "log1p_downward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 2 ldouble: 2 Function: "log1p_towardzero": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 3 ldouble: 3 Function: "log1p_upward": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "log2": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "log2_downward": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 2 ldouble: 2 Function: "log2_towardzero": double: 2 float: 2 +float128: 1 idouble: 2 ifloat: 2 +ifloat128: 1 ildouble: 4 ldouble: 4 Function: "log2_upward": double: 3 float: 3 +float128: 1 idouble: 3 ifloat: 3 +ifloat128: 1 ildouble: 4 ldouble: 4 Function: "log_downward": float: 2 +float128: 1 ifloat: 2 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "log_towardzero": float: 2 +float128: 2 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "log_upward": double: 1 float: 2 +float128: 1 idouble: 1 ifloat: 2 +ifloat128: 1 ildouble: 1 ldouble: 1 @@ -1983,153 +2473,193 @@ ldouble: 1 Function: "pow": float: 1 +float128: 2 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "pow10": double: 2 +float128: 2 idouble: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "pow10_downward": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 9 ldouble: 9 Function: "pow10_towardzero": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 9 ldouble: 9 Function: "pow10_upward": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: "pow_downward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "pow_towardzero": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "pow_upward": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "sin": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "sin_downward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: "sin_towardzero": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 4 ldouble: 4 Function: "sin_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 5 ldouble: 5 Function: "sincos": float: 1 +float128: 1 ifloat: 1 +ifloat128: 1 ildouble: 1 ldouble: 1 Function: "sincos_downward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: "sincos_towardzero": double: 1 float: 1 +float128: 2 idouble: 1 ifloat: 1 +ifloat128: 2 ildouble: 7 ldouble: 7 Function: "sincos_upward": double: 1 float: 2 +float128: 3 idouble: 1 ifloat: 2 +ifloat128: 3 ildouble: 7 ldouble: 7 Function: "sinh": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 3 ldouble: 3 Function: "sinh_downward": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "sinh_towardzero": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "sinh_upward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 6 ldouble: 6 @@ -2151,191 +2681,239 @@ ldouble: 1 Function: "tan": float: 3 +float128: 1 ifloat: 3 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "tan_downward": double: 1 float: 3 +float128: 1 idouble: 1 ifloat: 3 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "tan_towardzero": double: 1 float: 3 +float128: 1 idouble: 1 ifloat: 3 +ifloat128: 1 ildouble: 2 ldouble: 2 Function: "tan_upward": double: 1 float: 3 +float128: 1 idouble: 1 ifloat: 3 +ifloat128: 1 ildouble: 3 ldouble: 3 Function: "tanh": double: 2 float: 2 +float128: 2 idouble: 2 ifloat: 2 +ifloat128: 2 ildouble: 1 ldouble: 1 Function: "tanh_downward": double: 3 float: 3 +float128: 4 idouble: 3 ifloat: 3 +ifloat128: 4 ildouble: 4 ldouble: 4 Function: "tanh_towardzero": double: 2 float: 2 +float128: 3 idouble: 2 ifloat: 2 +ifloat128: 3 ildouble: 4 ldouble: 4 Function: "tanh_upward": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 6 ldouble: 6 Function: "tgamma": double: 5 float: 4 +float128: 4 idouble: 5 ifloat: 4 +ifloat128: 4 ildouble: 5 ldouble: 5 Function: "tgamma_downward": double: 5 float: 5 +float128: 5 idouble: 5 ifloat: 5 +ifloat128: 5 ildouble: 6 ldouble: 6 Function: "tgamma_towardzero": double: 5 float: 4 +float128: 5 idouble: 5 ifloat: 4 +ifloat128: 5 ildouble: 5 ldouble: 5 Function: "tgamma_upward": double: 4 float: 4 +float128: 4 idouble: 4 ifloat: 4 +ifloat128: 4 ildouble: 5 ldouble: 5 Function: "y0": double: 2 float: 1 +float128: 3 idouble: 2 ifloat: 1 +ifloat128: 3 ildouble: 1 ldouble: 1 Function: "y0_downward": double: 3 float: 2 +float128: 4 idouble: 3 ifloat: 2 +ifloat128: 4 ildouble: 10 ldouble: 10 Function: "y0_towardzero": double: 3 float: 3 +float128: 3 idouble: 3 ifloat: 3 +ifloat128: 3 ildouble: 8 ldouble: 8 Function: "y0_upward": double: 2 float: 3 +float128: 3 idouble: 2 ifloat: 3 +ifloat128: 3 ildouble: 9 ldouble: 9 Function: "y1": double: 3 float: 2 +float128: 2 idouble: 3 ifloat: 2 +ifloat128: 2 ildouble: 2 ldouble: 2 Function: "y1_downward": double: 3 float: 2 +float128: 4 idouble: 3 ifloat: 2 +ifloat128: 4 ildouble: 7 ldouble: 7 Function: "y1_towardzero": double: 3 float: 2 +float128: 2 idouble: 3 ifloat: 2 +ifloat128: 2 ildouble: 9 ldouble: 9 Function: "y1_upward": double: 5 float: 2 +float128: 5 idouble: 5 ifloat: 2 +ifloat128: 5 ildouble: 9 ldouble: 9 Function: "yn": double: 3 float: 2 +float128: 5 idouble: 3 ifloat: 2 +ifloat128: 5 ildouble: 2 ldouble: 2 Function: "yn_downward": double: 3 float: 2 +float128: 5 idouble: 3 ifloat: 2 +ifloat128: 5 ildouble: 10 ldouble: 10 Function: "yn_towardzero": double: 3 float: 3 +float128: 5 idouble: 3 ifloat: 3 +ifloat128: 5 ildouble: 8 ldouble: 8 Function: "yn_upward": double: 4 float: 3 +float128: 5 idouble: 4 ifloat: 3 +ifloat128: 5 ildouble: 9 ldouble: 9 diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h index 3c71275..d8fd492 100644 --- a/sysdeps/powerpc/fpu/math_private.h +++ b/sysdeps/powerpc/fpu/math_private.h @@ -25,6 +25,16 @@ #include #include_next +#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..a282b3e --- /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 before POWER9. +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-$(. */ + +/* Unavoidable hacks since TFmode is assumed to be binary128. */ +#define TFtype KFtype +#define TF KF + +#include +#include + +__float128 +__ieee754_sqrtf128 (__float128 a) +{ + 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; +} +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 + . */ + +__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 443d89f..51a8d19 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist @@ -2186,8 +2186,15 @@ GLIBC_2.25 strfromd F GLIBC_2.25 strfromf F GLIBC_2.25 strfroml F GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 __strtof128_internal F +GLIBC_2.26 __wcstof128_internal F GLIBC_2.26 preadv2 F GLIBC_2.26 preadv64v2 F GLIBC_2.26 pwritev2 F GLIBC_2.26 pwritev64v2 F GLIBC_2.26 reallocarray F +GLIBC_2.26 strfromf128 F +GLIBC_2.26 strtof128 F +GLIBC_2.26 strtof128_l F +GLIBC_2.26 wcstof128 F +GLIBC_2.26 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..d79cb99 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist @@ -467,3 +467,141 @@ GLIBC_2.25 ufromfpl F GLIBC_2.25 ufromfpx F GLIBC_2.25 ufromfpxf F GLIBC_2.25 ufromfpxl F +GLIBC_2.26 GLIBC_2.26 A +GLIBC_2.26 __acosf128_finite F +GLIBC_2.26 __acoshf128_finite F +GLIBC_2.26 __asinf128_finite F +GLIBC_2.26 __atan2f128_finite F +GLIBC_2.26 __atanhf128_finite F +GLIBC_2.26 __coshf128_finite F +GLIBC_2.26 __exp10f128_finite F +GLIBC_2.26 __exp2f128_finite F +GLIBC_2.26 __expf128_finite F +GLIBC_2.26 __finitef128 F +GLIBC_2.26 __fmodf128_finite F +GLIBC_2.26 __fpclassifyf128 F +GLIBC_2.26 __gammaf128_r_finite F +GLIBC_2.26 __hypotf128_finite F +GLIBC_2.26 __iseqsigf128 F +GLIBC_2.26 __isinff128 F +GLIBC_2.26 __isnanf128 F +GLIBC_2.26 __issignalingf128 F +GLIBC_2.26 __j0f128_finite F +GLIBC_2.26 __j1f128_finite F +GLIBC_2.26 __jnf128_finite F +GLIBC_2.26 __lgammaf128_r_finite F +GLIBC_2.26 __log10f128_finite F +GLIBC_2.26 __log2f128_finite F +GLIBC_2.26 __logf128_finite F +GLIBC_2.26 __powf128_finite F +GLIBC_2.26 __remainderf128_finite F +GLIBC_2.26 __signbitf128 F +GLIBC_2.26 __sinhf128_finite F +GLIBC_2.26 __sqrtf128_finite F +GLIBC_2.26 __y0f128_finite F +GLIBC_2.26 __y1f128_finite F +GLIBC_2.26 __ynf128_finite F +GLIBC_2.26 acosf128 F +GLIBC_2.26 acoshf128 F +GLIBC_2.26 asinf128 F +GLIBC_2.26 asinhf128 F +GLIBC_2.26 atan2f128 F +GLIBC_2.26 atanf128 F +GLIBC_2.26 atanhf128 F +GLIBC_2.26 cabsf128 F +GLIBC_2.26 cacosf128 F +GLIBC_2.26 cacoshf128 F +GLIBC_2.26 canonicalizef128 F +GLIBC_2.26 cargf128 F +GLIBC_2.26 casinf128 F +GLIBC_2.26 casinhf128 F +GLIBC_2.26 catanf128 F +GLIBC_2.26 catanhf128 F +GLIBC_2.26 cbrtf128 F +GLIBC_2.26 ccosf128 F +GLIBC_2.26 ccoshf128 F +GLIBC_2.26 ceilf128 F +GLIBC_2.26 cexpf128 F +GLIBC_2.26 cimagf128 F +GLIBC_2.26 clog10f128 F +GLIBC_2.26 clogf128 F +GLIBC_2.26 conjf128 F +GLIBC_2.26 copysignf128 F +GLIBC_2.26 cosf128 F +GLIBC_2.26 coshf128 F +GLIBC_2.26 cpowf128 F +GLIBC_2.26 cprojf128 F +GLIBC_2.26 crealf128 F +GLIBC_2.26 csinf128 F +GLIBC_2.26 csinhf128 F +GLIBC_2.26 csqrtf128 F +GLIBC_2.26 ctanf128 F +GLIBC_2.26 ctanhf128 F +GLIBC_2.26 erfcf128 F +GLIBC_2.26 erff128 F +GLIBC_2.26 exp10f128 F +GLIBC_2.26 exp2f128 F +GLIBC_2.26 expf128 F +GLIBC_2.26 expm1f128 F +GLIBC_2.26 fabsf128 F +GLIBC_2.26 fdimf128 F +GLIBC_2.26 floorf128 F +GLIBC_2.26 fmaf128 F +GLIBC_2.26 fmaxf128 F +GLIBC_2.26 fmaxmagf128 F +GLIBC_2.26 fminf128 F +GLIBC_2.26 fminmagf128 F +GLIBC_2.26 fmodf128 F +GLIBC_2.26 frexpf128 F +GLIBC_2.26 fromfpf128 F +GLIBC_2.26 fromfpxf128 F +GLIBC_2.26 getpayloadf128 F +GLIBC_2.26 hypotf128 F +GLIBC_2.26 ilogbf128 F +GLIBC_2.26 j0f128 F +GLIBC_2.26 j1f128 F +GLIBC_2.26 jnf128 F +GLIBC_2.26 ldexpf128 F +GLIBC_2.26 lgammaf128 F +GLIBC_2.26 lgammaf128_r F +GLIBC_2.26 llogbf128 F +GLIBC_2.26 llrintf128 F +GLIBC_2.26 llroundf128 F +GLIBC_2.26 log10f128 F +GLIBC_2.26 log1pf128 F +GLIBC_2.26 log2f128 F +GLIBC_2.26 logbf128 F +GLIBC_2.26 logf128 F +GLIBC_2.26 lrintf128 F +GLIBC_2.26 lroundf128 F +GLIBC_2.26 modff128 F +GLIBC_2.26 nanf128 F +GLIBC_2.26 nearbyintf128 F +GLIBC_2.26 nextafterf128 F +GLIBC_2.26 nextdownf128 F +GLIBC_2.26 nextupf128 F +GLIBC_2.26 powf128 F +GLIBC_2.26 remainderf128 F +GLIBC_2.26 remquof128 F +GLIBC_2.26 rintf128 F +GLIBC_2.26 roundevenf128 F +GLIBC_2.26 roundf128 F +GLIBC_2.26 scalblnf128 F +GLIBC_2.26 scalbnf128 F +GLIBC_2.26 setpayloadf128 F +GLIBC_2.26 setpayloadsigf128 F +GLIBC_2.26 sincosf128 F +GLIBC_2.26 sinf128 F +GLIBC_2.26 sinhf128 F +GLIBC_2.26 sqrtf128 F +GLIBC_2.26 tanf128 F +GLIBC_2.26 tanhf128 F +GLIBC_2.26 tgammaf128 F +GLIBC_2.26 totalorderf128 F +GLIBC_2.26 totalordermagf128 F +GLIBC_2.26 truncf128 F +GLIBC_2.26 ufromfpf128 F +GLIBC_2.26 ufromfpxf128 F +GLIBC_2.26 y0f128 F +GLIBC_2.26 y1f128 F +GLIBC_2.26 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..6b954cc --- /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.26