mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 03:33:33 +08:00
powerpc64le: Enable float128
This patch adds ULPs for the float128 type, updates the abilist for libc and libm, and adds the files bits/floatn.h and float128-abi.h, in order to enable the new type for powerpc64le. This patch also adds the implementation of sqrtf128 for powerpc64le, since it is not implemented in libgcc. The sfp-machine.h header is taken from libgcc. Tested for powerpc64le (GCC 6.2 and GCC 7.1), powerpc64 and s390x. * manual/math.texi (Mathematics): Mention the enabling of float128 for powerpc64le. * sysdeps/powerpc/bits/floatn.h: New file. * sysdeps/powerpc/fpu/libm-test-ulps: Regenerated. * sysdeps/powerpc/fpu/math_private.h: (__ieee754_sqrtf128): New inline override. * sysdeps/powerpc/powerpc64le/Implies-before: New file. * sysdeps/powerpc/powerpc64le/Makefile: New file. * sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c: New file. * sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h: New file. * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c: New file. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Updated. * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h: New file.
This commit is contained in:
parent
a27d2c1935
commit
f819dbea0a
21
ChangeLog
21
ChangeLog
@ -1,3 +1,24 @@
|
||||
2017-06-26 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
|
||||
Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* manual/math.texi (Mathematics): Mention the enabling of float128
|
||||
for powerpc64le.
|
||||
* sysdeps/powerpc/bits/floatn.h: New file.
|
||||
* sysdeps/powerpc/fpu/libm-test-ulps: Regenerated.
|
||||
* sysdeps/powerpc/fpu/math_private.h:
|
||||
(__ieee754_sqrtf128): New inline override.
|
||||
* sysdeps/powerpc/powerpc64le/Implies-before: New file.
|
||||
* sysdeps/powerpc/powerpc64le/Makefile: New file.
|
||||
* sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c: New file.
|
||||
* sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h: New file.
|
||||
* sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c: New file.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist:
|
||||
Updated.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64le/float128-abi.h:
|
||||
New file.
|
||||
|
||||
2017-06-26 Gabriel F. T. Gomes <gftg@linux.vnet.ibm.com>
|
||||
|
||||
* sysdeps/powerpc/powerpc64le/configure.ac: Check for POWER8.
|
||||
|
94
NEWS
94
NEWS
@ -121,6 +121,100 @@ Version 2.26
|
||||
C Library is GCC 4.9. Older GCC versions, and non-GNU compilers, can
|
||||
still be used to compile programs using the GNU C Library.
|
||||
|
||||
* Support is added, on powerpc64le, for interfaces supporting the _Float128
|
||||
type from ISO/IEC TS 18661-3:2015. Most of the interfaces are taken from
|
||||
TS 18661-3. The type-generic macros in <math.h> support this type, but
|
||||
those in <tgmath.h> do not. The GNU C Library now requires GCC 6.2 or
|
||||
later to build for powerpc64le. When used with GCC versions before GCC
|
||||
7, these interfaces may be used with the type under the non-standard name
|
||||
__float128.
|
||||
|
||||
New <stdlib.h> functions from ISO/IEC TS 18661-3:
|
||||
|
||||
- String Conversion Functions: strfromf128 and strtof128.
|
||||
|
||||
New <math.h> features from ISO/IEC TS 18661-3:
|
||||
|
||||
- Very Large Number macro: HUGE_VAL_F128.
|
||||
|
||||
- Signaling NaN macro: SNANF128.
|
||||
|
||||
- Trigonometric Functions: acosf128, asinf128, atanf128, atan2f128,
|
||||
cosf128, sinf128, tanf128.
|
||||
|
||||
- Hyperbolic Functions: acoshf128, asinhf128, atanhf128, coshf128,
|
||||
sinhf128, tanhf128.
|
||||
|
||||
- Exponential and Logarithmic Functions: expf128, exp2f128, expm1f128,
|
||||
frexpf128, ilogbf128, ldexpf128, llogbf128, logf128, log10f128,
|
||||
log1pf128, log2f128, logbf128, modff128, scalbnf128, scalblnf128.
|
||||
|
||||
- Power and Absolute Functions: cbrtf128, fabsf128, hypotf128, powf128,
|
||||
sqrtf128.
|
||||
|
||||
- Error and Gamma Functions: erff128, erfcf128, lgammaf128, tgammaf128.
|
||||
|
||||
- Nearest Integer Functions: ceilf128, floorf128, nearbyintf128,
|
||||
rintf128, lrintf128, llrintf128, roundf128, lroundf128, llroundf128,
|
||||
roundevenf128, truncf128, fromfpf128, ufromfpf128, fromfpxf128,
|
||||
ufromfpxf128.
|
||||
|
||||
- Remainder Functions: fmodf128, remainderf128, remquof128.
|
||||
|
||||
- Manipulation Functions: copysignf128, nanf128, nextafterf128,
|
||||
nextupf128, nextdownf128, canonicalizef128.
|
||||
|
||||
- Minimum, Maximum, and Positive Difference Functions: fdimf128,
|
||||
fmaxf128, fminf128, fmaxmagf128, fminmagf128.
|
||||
|
||||
- Floating Multiply-Add Function: fmaf128.
|
||||
|
||||
- Total Order Functions: totalorderf128, totalordermagf128.
|
||||
|
||||
- Payload Functions: getpayloadf128, setpayloadf128, setpayloadsigf128.
|
||||
|
||||
New <complex.h> functions from ISO/IEC TS 18661-3:
|
||||
|
||||
- Trigonometric Functions: cacosf128, casinf128, catanf128, ccosf128,
|
||||
csinf128, ctanf128.
|
||||
|
||||
- Hyperbolic Functions: cacoshf128, casinhf128, catanhf128, ccoshf128,
|
||||
csinhf128, ctanhf128.
|
||||
|
||||
- Exponential and Logarithmic Functions: cexpf128, clogf128.
|
||||
|
||||
- Power and Absolute Functions: cabsf128, cpowf128, csqrtf128.
|
||||
|
||||
- Manipulation Functions: cargf128, cimagf128, CMPLXF128, conjf128,
|
||||
cprojf128, crealf128.
|
||||
|
||||
The following <wchar.h> functions are added as GNU extensions:
|
||||
|
||||
- Wide String Conversion Functions: wsctof128, wcstof128_l.
|
||||
|
||||
The following <stdlib.h> function is added as a GNU extension:
|
||||
|
||||
- String Conversion Function: strtof128_l.
|
||||
|
||||
The following <math.h> features are added as GNU extensions:
|
||||
|
||||
- Predefined Mathematical Constants: M_Ef128, M_LOG2Ef128,
|
||||
M_LOG10Ef128, M_LN2f128, M_LN10f128, M_PIf128, M_PI_2f128,
|
||||
M_PI_4f128, M_1_PIf128, M_2_PIf128, M_2_SQRTPIf128, M_SQRT2f128,
|
||||
M_SQRT1_2f128.
|
||||
|
||||
- Trigonometric Function: sincosf128.
|
||||
|
||||
- Exponential and Logarithmic Function: exp10f128.
|
||||
|
||||
- Error and Gamma Function: lgammaf128_r.
|
||||
|
||||
- Bessel Functions: j0f128, j1f128, jnf128, y0f128, y1f128, ynf128.
|
||||
|
||||
The following <complex.h> function is added as a GNU extension:
|
||||
|
||||
- Exponential and Logarithmic Function: clog10f128.
|
||||
|
||||
Security related changes:
|
||||
|
||||
* The DNS stub resolver limits the advertised UDP buffer size to 1200 bytes,
|
||||
|
@ -66,7 +66,8 @@ these functions are described along with the @code{double},
|
||||
@w{ISO/IEC TS 18661-3}, unless explicitly stated otherwise.
|
||||
|
||||
Currently, support for @code{_Float@var{N}} or @code{_Float@var{N}x}
|
||||
types is not provided for any machine.
|
||||
types is only provided for @code{_Float128} on powerpc64le (PowerPC
|
||||
64-bits little-endian).
|
||||
|
||||
@menu
|
||||
* Mathematical Constants:: Precise numeric values for often-used
|
||||
|
92
sysdeps/powerpc/bits/floatn.h
Normal file
92
sysdeps/powerpc/bits/floatn.h
Normal file
@ -0,0 +1,92 @@
|
||||
/* Macros to control TS 18661-3 glibc features on powerpc.
|
||||
Copyright (C) 2017 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _BITS_FLOATN_H
|
||||
#define _BITS_FLOATN_H
|
||||
|
||||
#include <features.h>
|
||||
|
||||
/* Defined to 1 if the current compiler invocation provides a
|
||||
floating-point type with the IEEE 754 binary128 format, and this glibc
|
||||
includes corresponding *f128 interfaces for it. */
|
||||
#if defined _ARCH_PWR8 && defined __LITTLE_ENDIAN__ && (_CALL_ELF == 2) \
|
||||
&& defined __FLOAT128__
|
||||
# define __HAVE_FLOAT128 1
|
||||
#else
|
||||
# define __HAVE_FLOAT128 0
|
||||
#endif
|
||||
|
||||
/* Defined to 1 if __HAVE_FLOAT128 is 1 and the type is ABI-distinct
|
||||
from the default float, double and long double types in this glibc. */
|
||||
#if __HAVE_FLOAT128
|
||||
# define __HAVE_DISTINCT_FLOAT128 1
|
||||
#else
|
||||
# define __HAVE_DISTINCT_FLOAT128 0
|
||||
#endif
|
||||
|
||||
/* Defined to concatenate the literal suffix to be used with _Float128
|
||||
types, if __HAVE_FLOAT128 is 1. */
|
||||
#if __HAVE_FLOAT128
|
||||
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
||||
/* The literal suffix (f128) exist for powerpc only since GCC 7.0. */
|
||||
# define __f128(x) x##q
|
||||
# else
|
||||
# define __f128(x) x##f128
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Defined to a complex binary128 type if __HAVE_FLOAT128 is 1. */
|
||||
#if __HAVE_FLOAT128
|
||||
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
||||
/* Add a typedef for older GCC compilers which don't natively support
|
||||
_Complex _Float128. */
|
||||
typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__KC__)));
|
||||
# define __CFLOAT128 __cfloat128
|
||||
# else
|
||||
# define __CFLOAT128 _Complex _Float128
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The remaining of this file provides support for older compilers. */
|
||||
#if __HAVE_FLOAT128
|
||||
|
||||
/* The type _Float128 exist for powerpc only since GCC 7.0. */
|
||||
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
|
||||
typedef __float128 _Float128;
|
||||
# endif
|
||||
|
||||
/* Builtin __builtin_huge_valf128 doesn't exist before GCC 7.0. */
|
||||
# if !__GNUC_PREREQ (7, 0)
|
||||
# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
|
||||
# endif
|
||||
|
||||
/* The following builtins (suffixed with 'q') are available in GCC >= 6.2,
|
||||
which is the minimum version required for float128 support on powerpc64le.
|
||||
Since GCC 7.0 the builtins suffixed with f128 are also available, then
|
||||
there is no need to redefined them. */
|
||||
# if !__GNUC_PREREQ (7, 0)
|
||||
# define __builtin_copysignf128 __builtin_copysignq
|
||||
# define __builtin_fabsf128 __builtin_fabsq
|
||||
# define __builtin_inff128 __builtin_infq
|
||||
# define __builtin_nanf128 __builtin_nanq
|
||||
# define __builtin_nansf128 __builtin_nansq
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _BITS_FLOATN_H */
|
File diff suppressed because it is too large
Load Diff
@ -25,6 +25,16 @@
|
||||
#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)
|
||||
|
1
sysdeps/powerpc/powerpc64le/Implies-before
Normal file
1
sysdeps/powerpc/powerpc64le/Implies-before
Normal file
@ -0,0 +1 @@
|
||||
ieee754/float128
|
45
sysdeps/powerpc/powerpc64le/Makefile
Normal file
45
sysdeps/powerpc/powerpc64le/Makefile
Normal file
@ -0,0 +1,45 @@
|
||||
# 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.
|
||||
$(foreach suf,$(all-object-suffixes),%f128$(suf)): CFLAGS += -mfloat128
|
||||
$(foreach suf,$(all-object-suffixes),%f128_r$(suf)): 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
|
||||
|
||||
# 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
|
51
sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c
Normal file
51
sysdeps/powerpc/powerpc64le/fpu/e_sqrtf128.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* 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)
|
||||
{
|
||||
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)
|
115
sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h
Normal file
115
sysdeps/powerpc/powerpc64le/fpu/sfp-machine.h
Normal file
@ -0,0 +1,115 @@
|
||||
#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
|
||||
|
||||
typedef int TItype __attribute__ ((mode (TI)));
|
||||
typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
||||
|
||||
#define TI_BITS (__CHAR_BIT__ * (int)sizeof(TItype))
|
||||
|
||||
/* 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)
|
||||
|
||||
#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)
|
||||
|
||||
#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y)
|
||||
|
||||
#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)
|
||||
|
||||
#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
|
||||
|
||||
#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1)
|
||||
#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1
|
||||
|
||||
#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
|
||||
#define __BYTE_ORDER __LITTLE_ENDIAN
|
||||
|
||||
/* 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__ */
|
36
sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c
Normal file
36
sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c
Normal file
@ -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)
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -0,0 +1,2 @@
|
||||
/* ABI version for _Float128 ABI introduction. */
|
||||
#define FLOAT128_VERSION GLIBC_2.26
|
Loading…
Reference in New Issue
Block a user