Add float128 support for x86_64, x86.

This patch enables float128 support for x86_64 and x86.  All GCC
versions that can build glibc provide the required support, but since
GCC 6 and before don't provide __builtin_nanq / __builtin_nansq, sNaN
tests and some tests of NaN payloads need to be disabled with such
compilers (this does not affect the generated glibc binaries at all,
just the tests).  bits/floatn.h declares float128 support to be
available for GCC versions that provide the required libgcc support
(4.3 for x86_64, 4.4 for i386 GNU/Linux, 4.5 for i386 GNU/Hurd);
compilation-only support was present some time before then, but not
really useful without the libgcc functions.

fenv_private.h needed updating to avoid trying to put _Float128 values
in registers.  I make no assertion of optimality of the
math_opt_barrier / math_force_eval definitions for this case; they are
simply intended to be sufficient to work correctly.

Tested for x86_64 and x86, with GCC 7 and GCC 6.  (Testing for x32 was
compilation tests only with build-many-glibcs.py to verify the ABI
baseline updates.  I have not done any testing for Hurd, although the
float128 support is enabled there as for GNU/Linux.)

	* sysdeps/i386/Implies: Add ieee754/float128.
	* sysdeps/x86_64/Implies: Likewise.
	* sysdeps/x86/bits/floatn.h: New file.
	* sysdeps/x86/float128-abi.h: Likewise.
	* manual/math.texi (Mathematics): Document support for _Float128
	on x86_64 and x86.
	* sysdeps/i386/fpu/fenv_private.h: Include <bits/floatn.h>.
	(math_opt_barrier): Do not put _Float128 values in floating-point
	registers.
	(math_force_eval): Likewise.
	[__x86_64__] (SET_RESTORE_ROUNDF128): New macro.
	* sysdeps/x86/fpu/Makefile [$(subdir) = math] (CPPFLAGS): Append
	to Makefile variable.
	* sysdeps/x86/fpu/e_sqrtf128.c: New file.
	* sysdeps/x86/fpu/sfp-machine.h: Likewise.  Based on libgcc.
	* sysdeps/x86/math-tests.h: New file.
	* math/libm-test-support.h (XFAIL_FLOAT128_PAYLOAD): New macro.
	* math/libm-test-getpayload.inc (getpayload_test_data): Use
	XFAIL_FLOAT128_PAYLOAD.
	* math/libm-test-setpayload.inc (setpayload_test_data): Likewise.
	* math/libm-test-totalorder.inc (totalorder_test_data): Likewise.
	* math/libm-test-totalordermag.inc (totalordermag_test_data):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/libc.abilist: Update.
	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
	* sysdeps/i386/fpu/libm-test-ulps: Likewise.
	* sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Likewise.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
This commit is contained in:
Joseph Myers 2017-06-26 22:01:27 +00:00
parent 3f823e87cc
commit c86ed71d63
26 changed files with 2663 additions and 95 deletions

View File

@ -1,3 +1,38 @@
2017-06-26 Joseph Myers <joseph@codesourcery.com>
* sysdeps/i386/Implies: Add ieee754/float128.
* sysdeps/x86_64/Implies: Likewise.
* sysdeps/x86/bits/floatn.h: New file.
* sysdeps/x86/float128-abi.h: Likewise.
* manual/math.texi (Mathematics): Document support for _Float128
on x86_64 and x86.
* sysdeps/i386/fpu/fenv_private.h: Include <bits/floatn.h>.
(math_opt_barrier): Do not put _Float128 values in floating-point
registers.
(math_force_eval): Likewise.
[__x86_64__] (SET_RESTORE_ROUNDF128): New macro.
* sysdeps/x86/fpu/Makefile [$(subdir) = math] (CPPFLAGS): Append
to Makefile variable.
* sysdeps/x86/fpu/e_sqrtf128.c: New file.
* sysdeps/x86/fpu/sfp-machine.h: Likewise. Based on libgcc.
* sysdeps/x86/math-tests.h: New file.
* math/libm-test-support.h (XFAIL_FLOAT128_PAYLOAD): New macro.
* math/libm-test-getpayload.inc (getpayload_test_data): Use
XFAIL_FLOAT128_PAYLOAD.
* math/libm-test-setpayload.inc (setpayload_test_data): Likewise.
* math/libm-test-totalorder.inc (totalorder_test_data): Likewise.
* math/libm-test-totalordermag.inc (totalordermag_test_data):
Likewise.
* sysdeps/unix/sysv/linux/i386/libc.abilist: Update.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
* sysdeps/i386/fpu/libm-test-ulps: Likewise.
* sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Likewise.
* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
2017-06-26 Adhemerval Zanella <adhemerval.zanella@linaro.org>
[BZ #21512]

14
NEWS
View File

@ -121,13 +121,13 @@ 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.
* Support is added, on powerpc64le, x86_64 and x86, 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:

View File

@ -67,7 +67,7 @@ these functions are described along with the @code{double},
Currently, support for @code{_Float@var{N}} or @code{_Float@var{N}x}
types is only provided for @code{_Float128} on powerpc64le (PowerPC
64-bits little-endian).
64-bits little-endian), x86_64 and x86.
@menu
* Mathematical Constants:: Precise numeric values for often-used

View File

@ -38,35 +38,35 @@ static const struct test_f_f_data getpayload_test_data[] =
TEST_fp_f (getpayload, qnan_value_pl ("0x0"), plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x0"), plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
TEST_fp_f (getpayload, qnan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x1"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, qnan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x2"), 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, qnan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x3fffff"), 0x3fffff, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#if PAYLOAD_DIG >= 51
TEST_fp_f (getpayload, qnan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x7ffffffffffff"), 0x7ffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#endif
#if PAYLOAD_DIG >= 62
TEST_fp_f (getpayload, qnan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x3fffffffffffffff"), 0x3fffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#endif
#if PAYLOAD_DIG >= 111
TEST_fp_f (getpayload, qnan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -qnan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, snan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, -snan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_fp_f (getpayload, qnan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -qnan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, snan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_fp_f (getpayload, -snan_value_pl ("0x7fffffffffffffffffffffffffff"), 0x7fffffffffffffffffffffffffffp0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#endif
};

View File

@ -25,21 +25,21 @@ static const struct test_Ff_b1_data setpayload_test_data[] =
#else
TEST_Ff_b1 (setpayload, plus_zero, 0, qnan_value_pl ("0x0"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
#endif
TEST_Ff_b1 (setpayload, 0x1p0, 0, qnan_value_pl ("0x1"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x2p0, 0, qnan_value_pl ("0x2"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x3fffffp0, 0, qnan_value_pl ("0x3fffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x1p0, 0, qnan_value_pl ("0x1"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x2p0, 0, qnan_value_pl ("0x2"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x3fffffp0, 0, qnan_value_pl ("0x3fffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#if PAYLOAD_DIG >= 51
TEST_Ff_b1 (setpayload, 0x7ffffffffffffp0, 0, qnan_value_pl ("0x7ffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x7ffffffffffffp0, 0, qnan_value_pl ("0x7ffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x7ffffffffffffp0, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 62
TEST_Ff_b1 (setpayload, 0x3fffffffffffffffp0, 0, qnan_value_pl ("0x3fffffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x3fffffffffffffffp0, 0, qnan_value_pl ("0x3fffffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x3fffffffffffffffp0, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 111
TEST_Ff_b1 (setpayload, 0x7fffffffffffffffffffffffffffp0, 0, qnan_value_pl ("0x7fffffffffffffffffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x7fffffffffffffffffffffffffffp0, 0, qnan_value_pl ("0x7fffffffffffffffffffffffffff"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x7fffffffffffffffffffffffffffp0, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
@ -74,17 +74,17 @@ static const struct test_Ff_b1_data setpayload_test_data[] =
TEST_Ff_b1 (setpayload, 0x1ffffffffffffffffffffffffffffp-1, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 23
TEST_Ff_b1 (setpayload, 0x1p22, 0, qnan_value_pl ("0x400000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x1p22, 0, qnan_value_pl ("0x400000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x1p22, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 52
TEST_Ff_b1 (setpayload, 0x1p51, 0, qnan_value_pl ("0x8000000000000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x1p51, 0, qnan_value_pl ("0x8000000000000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x1p51, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 63
TEST_Ff_b1 (setpayload, 0x1p62, 0, qnan_value_pl ("0x4000000000000000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD),
TEST_Ff_b1 (setpayload, 0x1p62, 0, qnan_value_pl ("0x4000000000000000"), NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|TEST_NAN_SIGN|TEST_NAN_PAYLOAD|XFAIL_FLOAT128_PAYLOAD),
#else
TEST_Ff_b1 (setpayload, 0x1p62, 1, plus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif

View File

@ -115,6 +115,15 @@ extern const char doc[];
appropriately for each rounding mode. */
#define XFAIL_IBM128_LIBGCC (TEST_COND_ibm128_libgcc ? XFAIL_TEST : 0)
/* On some architectures, glibc can be built with compilers that do
not have suitable built-in functions for setting the payload of a
_Float128 NaN. */
#if (defined __x86_64__ || defined __i386__) && !__GNUC_PREREQ (7, 0)
# define XFAIL_FLOAT128_PAYLOAD (TEST_COND_binary128 ? XFAIL_TEST : 0)
#else
# define XFAIL_FLOAT128_PAYLOAD 0
#endif
/* Number of bits in NaN payload. */
#if TEST_COND_ibm128
# define PAYLOAD_DIG (DBL_MANT_DIG - 2)

View File

@ -212,22 +212,22 @@ static const struct test_ff_i_data totalorder_test_data[] =
TEST_ff_b (totalorder, -snan_value_pl ("0x200000000"), -snan_value_pl ("0x100000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 66
TEST_ff_b (totalorder, qnan_value_pl ("0xffffffffffffffff"), qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -qnan_value_pl ("0xffffffffffffffff"), -qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0xffffffffffffffff"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, snan_value_pl ("0xffffffffffffffff"), snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -snan_value_pl ("0xffffffffffffffff"), -snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0xffffffffffffffff"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0x20000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, qnan_value_pl ("0x20000000000000000"), qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -qnan_value_pl ("0x20000000000000000"), -qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0x20000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, snan_value_pl ("0x20000000000000000"), snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, -snan_value_pl ("0x20000000000000000"), -snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, qnan_value_pl ("0xffffffffffffffff"), qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -qnan_value_pl ("0xffffffffffffffff"), -qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0xffffffffffffffff"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, snan_value_pl ("0xffffffffffffffff"), snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -snan_value_pl ("0xffffffffffffffff"), -snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0xffffffffffffffff"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0x20000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, qnan_value_pl ("0x20000000000000000"), qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -qnan_value_pl ("0x20000000000000000"), -qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0x20000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, snan_value_pl ("0x20000000000000000"), snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalorder, -snan_value_pl ("0x20000000000000000"), -snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#endif
TEST_ff_b (totalorder, 1, 0x1.000002p0, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalorder, 0x1.000002p0, 1, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),

View File

@ -212,22 +212,22 @@ static const struct test_ff_i_data totalordermag_test_data[] =
TEST_ff_b (totalordermag, -snan_value_pl ("0x200000000"), -snan_value_pl ("0x100000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
#endif
#if PAYLOAD_DIG >= 66
TEST_ff_b (totalordermag, qnan_value_pl ("0xffffffffffffffff"), qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -qnan_value_pl ("0xffffffffffffffff"), -qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, snan_value_pl ("0xffffffffffffffff"), snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -snan_value_pl ("0xffffffffffffffff"), -snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, qnan_value_pl ("0x20000000000000000"), qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x20000000000000000"), -qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, snan_value_pl ("0x20000000000000000"), snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, -snan_value_pl ("0x20000000000000000"), -snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, qnan_value_pl ("0xffffffffffffffff"), qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -qnan_value_pl ("0xffffffffffffffff"), -qnan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, snan_value_pl ("0xffffffffffffffff"), snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -snan_value_pl ("0xffffffffffffffff"), -snan_value_pl ("0x10000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0xffffffffffffffff"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, qnan_value_pl ("0x10000000000000000"), qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x10000000000000000"), -qnan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, qnan_value_pl ("0x20000000000000000"), qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -qnan_value_pl ("0x20000000000000000"), -qnan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, snan_value_pl ("0x10000000000000000"), snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -snan_value_pl ("0x10000000000000000"), -snan_value_pl ("0x20000000000000000"), 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, snan_value_pl ("0x20000000000000000"), snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
TEST_ff_b (totalordermag, -snan_value_pl ("0x20000000000000000"), -snan_value_pl ("0x10000000000000000"), 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED|XFAIL_FLOAT128_PAYLOAD),
#endif
TEST_ff_b (totalordermag, 1, 0x1.000002p0, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_ff_b (totalordermag, 0x1.000002p0, 1, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),

View File

@ -1,5 +1,6 @@
x86
wordsize-32
ieee754/float128
ieee754/ldbl-96
ieee754/dbl-64
ieee754/flt-32

View File

@ -1,36 +1,46 @@
#ifndef FENV_PRIVATE_H
#define FENV_PRIVATE_H 1
#include <bits/floatn.h>
#include <fenv.h>
#include <fpu_control.h>
#ifdef __SSE2_MATH__
# define math_opt_barrier(x) \
({ __typeof(x) __x; \
if (sizeof (x) <= sizeof (double)) \
__asm ("" : "=x" (__x) : "0" (x)); \
else \
__asm ("" : "=t" (__x) : "0" (x)); \
# define math_opt_barrier(x) \
({ __typeof(x) __x; \
if (sizeof (x) <= sizeof (double) \
|| __builtin_types_compatible_p (__typeof (x), _Float128)) \
__asm ("" : "=x" (__x) : "0" (x)); \
else \
__asm ("" : "=t" (__x) : "0" (x)); \
__x; })
# define math_force_eval(x) \
do { \
if (sizeof (x) <= sizeof (double)) \
__asm __volatile ("" : : "x" (x)); \
else \
__asm __volatile ("" : : "f" (x)); \
# define math_force_eval(x) \
do { \
if (sizeof (x) <= sizeof (double) \
|| __builtin_types_compatible_p (__typeof (x), _Float128)) \
__asm __volatile ("" : : "x" (x)); \
else \
__asm __volatile ("" : : "f" (x)); \
} while (0)
#else
# define math_opt_barrier(x) \
({ __typeof (x) __x; \
__asm ("" : "=t" (__x) : "0" (x)); \
# define math_opt_barrier(x) \
({ __typeof (x) __x; \
if (__builtin_types_compatible_p (__typeof (x), _Float128)) \
{ \
__x = (x); \
__asm ("" : "+m" (__x)); \
} \
else \
__asm ("" : "=t" (__x) : "0" (x)); \
__x; })
# define math_force_eval(x) \
do { \
__typeof (x) __x = (x); \
if (sizeof (x) <= sizeof (double)) \
__asm __volatile ("" : : "m" (__x)); \
else \
__asm __volatile ("" : : "f" (__x)); \
# define math_force_eval(x) \
do { \
__typeof (x) __x = (x); \
if (sizeof (x) <= sizeof (double) \
|| __builtin_types_compatible_p (__typeof (x), _Float128)) \
__asm __volatile ("" : : "m" (__x)); \
else \
__asm __volatile ("" : : "f" (__x)); \
} while (0)
#endif
@ -322,6 +332,13 @@ libc_feresetround_387 (fenv_t *e)
# define libc_feholdsetround_53bit libc_feholdsetround_387_53bit
#endif
#ifdef __x86_64__
/* The SSE rounding mode is used by soft-fp (libgcc and glibc) on
x86_64, so that must be set for float128 computations. */
# define SET_RESTORE_ROUNDF128(RM) \
SET_RESTORE_ROUND_GENERIC (RM, libc_feholdsetround_sse, libc_feresetround_sse)
#endif
/* We have support for rounding mode context. */
#define HAVE_RM_CTX 1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2021,11 +2021,18 @@ 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
GLIBC_2.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F

View File

@ -473,4 +473,142 @@ 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
GLIBC_2.4 GLIBC_2.4 A

View File

@ -1862,11 +1862,18 @@ 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
GLIBC_2.3 GLIBC_2.3 A
GLIBC_2.3 __ctype_b_loc F
GLIBC_2.3 __ctype_tolower_loc F

View File

@ -462,4 +462,142 @@ 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
GLIBC_2.4 GLIBC_2.4 A

View File

@ -2105,8 +2105,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

View File

@ -461,3 +461,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

96
sysdeps/x86/bits/floatn.h Normal file
View File

@ -0,0 +1,96 @@
/* Macros to control TS 18661-3 glibc features on x86.
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. The required
libgcc support was added some time after the basic compiler
support, for x86_64 and x86. */
#if (defined __x86_64__ \
? __GNUC_PREREQ (4, 3) \
: (defined __GNU__ ? __GNUC_PREREQ (4, 5) : __GNUC_PREREQ (4, 4)))
# 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 exists 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__ (__TC__)));
# 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 exists only since GCC 7.0. */
# if !__GNUC_PREREQ (7, 0) || defined __cplusplus
typedef __float128 _Float128;
# endif
/* __builtin_huge_valf128 doesn't exist before GCC 7.0. */
# if !__GNUC_PREREQ (7, 0)
# define __builtin_huge_valf128() ((_Float128) __builtin_huge_val ())
# endif
/* Older GCC has only a subset of built-in functions for _Float128 on
x86, and __builtin_infq is not usable in static initializers.
Converting a narrower sNaN to _Float128 produces a quiet NaN, so
attempts to use _Float128 sNaNs will not work properly with older
compilers. */
# if !__GNUC_PREREQ (7, 0)
# define __builtin_copysignf128 __builtin_copysignq
# define __builtin_fabsf128 __builtin_fabsq
# define __builtin_inff128() ((_Float128) __builtin_inf ())
# define __builtin_nanf128(x) ((_Float128) __builtin_nan (x))
# define __builtin_nansf128(x) ((_Float128) __builtin_nans (x))
# endif
#endif
#endif /* _BITS_FLOATN_H */

View File

@ -0,0 +1,2 @@
/* ABI version for _Float128 ABI introduction. */
#define FLOAT128_VERSION GLIBC_2.26

View File

@ -1,4 +1,7 @@
ifeq ($(subdir),math)
# sqrtf128 requires soft-fp.
CPPFLAGS += -I../soft-fp
libm-support += powl_helper
tests += test-fenv-sse test-fenv-clear-sse test-fenv-x87 test-fenv-sse-2 \
test-flt-eval-method-387 test-flt-eval-method-sse

View File

@ -0,0 +1,47 @@
/* 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/>. */
#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)

View File

@ -0,0 +1,209 @@
/* Configure soft-fp for building sqrtf128. Based on sfp-machine.h in
libgcc, with soft-float and other irrelevant parts removed. */
/* 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
#ifdef __x86_64__
# 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))
# 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_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
# define _FP_NANFRAC_S _FP_QNANBIT_S
# define _FP_NANFRAC_D _FP_QNANBIT_D
# define _FP_NANFRAC_E _FP_QNANBIT_E, 0
# define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0
# define FP_EX_SHIFT 7
# define _FP_DECL_EX \
unsigned int _fcw __attribute__ ((unused)) = FP_RND_NEAREST;
# define FP_RND_NEAREST 0
# define FP_RND_ZERO 0x6000
# define FP_RND_PINF 0x4000
# define FP_RND_MINF 0x2000
# define FP_RND_MASK 0x6000
# define FP_INIT_ROUNDMODE \
do { \
__asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (_fcw)); \
} while (0)
#else
# define _FP_W_TYPE_SIZE 32
# define _FP_W_TYPE unsigned int
# define _FP_WS_TYPE signed int
# define _FP_I_TYPE int
# define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
__asm__ ("add{l} {%11,%3|%3,%11}\n\t" \
"adc{l} {%9,%2|%2,%9}\n\t" \
"adc{l} {%7,%1|%1,%7}\n\t" \
"adc{l} {%5,%0|%0,%5}" \
: "=r" ((USItype) (r3)), \
"=&r" ((USItype) (r2)), \
"=&r" ((USItype) (r1)), \
"=&r" ((USItype) (r0)) \
: "%0" ((USItype) (x3)), \
"g" ((USItype) (y3)), \
"%1" ((USItype) (x2)), \
"g" ((USItype) (y2)), \
"%2" ((USItype) (x1)), \
"g" ((USItype) (y1)), \
"%3" ((USItype) (x0)), \
"g" ((USItype) (y0)))
# define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
__asm__ ("add{l} {%8,%2|%2,%8}\n\t" \
"adc{l} {%6,%1|%1,%6}\n\t" \
"adc{l} {%4,%0|%0,%4}" \
: "=r" ((USItype) (r2)), \
"=&r" ((USItype) (r1)), \
"=&r" ((USItype) (r0)) \
: "%0" ((USItype) (x2)), \
"g" ((USItype) (y2)), \
"%1" ((USItype) (x1)), \
"g" ((USItype) (y1)), \
"%2" ((USItype) (x0)), \
"g" ((USItype) (y0)))
# define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
__asm__ ("sub{l} {%11,%3|%3,%11}\n\t" \
"sbb{l} {%9,%2|%2,%9}\n\t" \
"sbb{l} {%7,%1|%1,%7}\n\t" \
"sbb{l} {%5,%0|%0,%5}" \
: "=r" ((USItype) (r3)), \
"=&r" ((USItype) (r2)), \
"=&r" ((USItype) (r1)), \
"=&r" ((USItype) (r0)) \
: "0" ((USItype) (x3)), \
"g" ((USItype) (y3)), \
"1" ((USItype) (x2)), \
"g" ((USItype) (y2)), \
"2" ((USItype) (x1)), \
"g" ((USItype) (y1)), \
"3" ((USItype) (x0)), \
"g" ((USItype) (y0)))
# define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \
__asm__ ("sub{l} {%8,%2|%2,%8}\n\t" \
"sbb{l} {%6,%1|%1,%6}\n\t" \
"sbb{l} {%4,%0|%0,%4}" \
: "=r" ((USItype) (r2)), \
"=&r" ((USItype) (r1)), \
"=&r" ((USItype) (r0)) \
: "0" ((USItype) (x2)), \
"g" ((USItype) (y2)), \
"1" ((USItype) (x1)), \
"g" ((USItype) (y1)), \
"2" ((USItype) (x0)), \
"g" ((USItype) (y0)))
# define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \
__asm__ ("add{l} {%4,%3|%3,%4}\n\t" \
"adc{l} {$0,%2|%2,0}\n\t" \
"adc{l} {$0,%1|%1,0}\n\t" \
"adc{l} {$0,%0|%0,0}" \
: "+r" ((USItype) (x3)), \
"+&r" ((USItype) (x2)), \
"+&r" ((USItype) (x1)), \
"+&r" ((USItype) (x0)) \
: "g" ((USItype) (i)))
# 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_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)
# 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_2_udiv(D,R,X,Y)
# define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
# define _FP_NANFRAC_S _FP_QNANBIT_S
# define _FP_NANFRAC_D _FP_QNANBIT_D, 0
/* Even if XFmode is 12byte, we have to pad it to
16byte since soft-fp emulation is done in 16byte. */
# define _FP_NANFRAC_E _FP_QNANBIT_E, 0, 0, 0
# define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0
# define FP_EX_SHIFT 0
# define _FP_DECL_EX \
unsigned short _fcw __attribute__ ((unused)) = FP_RND_NEAREST;
# define FP_RND_NEAREST 0
# define FP_RND_ZERO 0xc00
# define FP_RND_PINF 0x800
# define FP_RND_MINF 0x400
# define FP_RND_MASK 0xc00
# define FP_INIT_ROUNDMODE \
do { \
__asm__ __volatile__ ("fnstcw\t%0" : "=m" (_fcw)); \
} while (0)
#endif
#define _FP_KEEPNANFRACP 1
#define _FP_QNANNEGATEDP 0
#define _FP_NANSIGN_S 1
#define _FP_NANSIGN_D 1
#define _FP_NANSIGN_E 1
#define _FP_NANSIGN_Q 1
/* Here is something Intel misdesigned: the specs don't define
the case where we have two NaNs with same mantissas, but
different sign. Different operations pick up different NaNs. */
#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
do { \
if (_FP_FRAC_GT_##wc(X, Y) \
|| (_FP_FRAC_EQ_##wc(X,Y) && (OP == '+' || OP == '*'))) \
{ \
R##_s = X##_s; \
_FP_FRAC_COPY_##wc(R,X); \
} \
else \
{ \
R##_s = Y##_s; \
_FP_FRAC_COPY_##wc(R,Y); \
} \
R##_c = FP_CLS_NAN; \
} while (0)
#define FP_EX_INVALID 0x01
#define FP_EX_DENORM 0x02
#define FP_EX_DIVZERO 0x04
#define FP_EX_OVERFLOW 0x08
#define FP_EX_UNDERFLOW 0x10
#define FP_EX_INEXACT 0x20
#define FP_EX_ALL \
(FP_EX_INVALID | FP_EX_DENORM | FP_EX_DIVZERO | FP_EX_OVERFLOW \
| FP_EX_UNDERFLOW | FP_EX_INEXACT)
void __sfp_handle_exceptions (int);
#define FP_HANDLE_EXCEPTIONS \
do { \
if (__builtin_expect (_fex, 0)) \
__sfp_handle_exceptions (_fex); \
} while (0);
#define FP_TRAPPING_EXCEPTIONS ((~_fcw >> FP_EX_SHIFT) & FP_EX_ALL)
#define FP_ROUNDMODE (_fcw & FP_RND_MASK)
#define _FP_TININESS_AFTER_ROUNDING 1

25
sysdeps/x86/math-tests.h Normal file
View File

@ -0,0 +1,25 @@
/* Configuration for math tests. x86 version.
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/>. */
/* Before GCC 7, there is no built-in function to provide a __float128
sNaN, so most sNaN tests for this type cannot work. */
#if !__GNUC_PREREQ (7, 0)
# define SNAN_TESTS_float128 0
#endif
#include_next <math-tests.h>

View File

@ -1,4 +1,5 @@
x86
ieee754/float128
ieee754/ldbl-96
ieee754/dbl-64/wordsize-64
ieee754/dbl-64

File diff suppressed because it is too large Load Diff