2013-03-19 09:16:49 +00:00
|
|
|
/* Configuration for math tests. Generic version.
|
2018-01-01 00:32:25 +00:00
|
|
|
Copyright (C) 2013-2018 Free Software Foundation, Inc.
|
2013-03-19 09:16:49 +00:00
|
|
|
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/>. */
|
|
|
|
|
2017-06-22 23:03:38 +00:00
|
|
|
#include <bits/floatn.h>
|
|
|
|
|
|
|
|
/* Expand the appropriate macro for whether to enable tests for a
|
|
|
|
given type. */
|
|
|
|
#if __HAVE_DISTINCT_FLOAT128
|
|
|
|
# define MATH_TESTS_TG(PREFIX, ARGS, TYPE) \
|
|
|
|
(sizeof (TYPE) == sizeof (float) ? PREFIX ## float ARGS \
|
|
|
|
: sizeof (TYPE) == sizeof (double) ? PREFIX ## double ARGS \
|
|
|
|
: __builtin_types_compatible_p (TYPE, _Float128) ? PREFIX ## float128 ARGS \
|
|
|
|
: PREFIX ## long_double ARGS)
|
|
|
|
# else
|
|
|
|
# define MATH_TESTS_TG(PREFIX, ARGS, TYPE) \
|
|
|
|
(sizeof (TYPE) == sizeof (float) ? PREFIX ## float ARGS \
|
|
|
|
: sizeof (TYPE) == sizeof (double) ? PREFIX ## double ARGS \
|
|
|
|
: PREFIX ## long_double ARGS)
|
|
|
|
#endif
|
|
|
|
|
2013-03-19 09:16:49 +00:00
|
|
|
/* Indicate whether to run tests involving sNaN values for the float, double,
|
|
|
|
and long double C data types, respectively. All are run unless
|
|
|
|
overridden. */
|
|
|
|
#ifndef SNAN_TESTS_float
|
|
|
|
# define SNAN_TESTS_float 1
|
|
|
|
#endif
|
|
|
|
#ifndef SNAN_TESTS_double
|
|
|
|
# define SNAN_TESTS_double 1
|
|
|
|
#endif
|
|
|
|
#ifndef SNAN_TESTS_long_double
|
|
|
|
# define SNAN_TESTS_long_double 1
|
|
|
|
#endif
|
2017-06-22 23:03:38 +00:00
|
|
|
#ifndef SNAN_TESTS_float128
|
|
|
|
# define SNAN_TESTS_float128 1
|
|
|
|
#endif
|
2013-03-19 09:16:49 +00:00
|
|
|
|
|
|
|
/* Return nonzero value if to run tests involving sNaN values for X. */
|
2017-06-22 23:03:38 +00:00
|
|
|
#define SNAN_TESTS(x) MATH_TESTS_TG (SNAN_TESTS_, , x)
|
2013-04-02 11:51:02 +00:00
|
|
|
|
|
|
|
/* Indicate whether to run tests involving type casts of sNaN values. These
|
|
|
|
are run unless overridden. */
|
|
|
|
#ifndef SNAN_TESTS_TYPE_CAST
|
|
|
|
# define SNAN_TESTS_TYPE_CAST 1
|
|
|
|
#endif
|
2013-06-10 12:34:49 +00:00
|
|
|
|
Add canonicalize, canonicalizef, canonicalizel.
TS 18661-1 defines canonicalize functions to produce a canonical
version of a floating-point representation. This patch implements
these functions for glibc.
As with the iscanonical macro, these functions are oriented to the
decimal floating-point case, where some values have both canonical and
noncanonical representations. However, the functions have a return
value that says whether they succeeded in storing a canonical result;
thus, they can fail for the case of an invalid representation (while
still not making any particular choice from among multiple equally
canonical valid representations of the same value). Since no
floating-point formats in glibc actually have noncanonical valid
representations, a type-generic implementation of these functions can
be used that expects iscanonical to return 0 only for invalid
representations. Now that iscanonical is used within libm.so,
libm_hidden_proto / libm_hidden_def are added for __iscanonicall.
The definition of these functions is intended to correspond to a
convertFormat operation to the same floating-point format. Thus, they
convert signaling NaNs to quiet NaNs, raising the "invalid" exception.
Such a conversion "should" produce "the canonical version of that
signaling NaN made quiet".
libm-test.inc is made to check NaN payloads for the output of these
functions, a new feature (at some point manipulation functions such as
fabs and copysign should have tests added that verify payload
preservation for them). As however some architectures may not follow
the recommended practice of preserving NaN payloads when converting a
signaling NaN to quiet, a new math-tests.h macro
SNAN_TESTS_PRESERVE_PAYLOAD is added, and defined to 0 for non-NAN2008
MIPS; any other architectures seeing test failures for lack of payload
preservation in this case should also define this macro to 0. (If any
cases arise where the sign isn't preserved either, those should have a
similar macro added.)
The ldbl-96 and ldbl-128ibm tests of iscanonical are renamed and
adapted to test canonicalizel as well on the same representations.
Tested for x86_64, x86, mips64 and powerpc.
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
(canonicalize): New declaration.
* math/Versions (canonicalize): New libm symbol at version
GLIBC_2.25.
(canonicalizef): Likewise.
(canonicalizel): Likewise.
* math/Makefile (gen-libm-calls): Add s_canonicalizeF.
* math/s_canonicalize_template.c: New file.
* math/libm-test.inc: Update comment on functions tested and
testing of NaN payloads.
(TEST_NAN_PAYLOAD): New macro.
(NO_TEST_INLINE): Update value.
(XFAIL_TEST): Likewise.
(ERRNO_UNCHANGED): Likewise.
(ERRNO_EDOM): Likewise.
(ERRNO_ERANGE): Likewise.
(IGNORE_RESULT): Likewise.
(NON_FINITE): Likewise.
(TEST_SNAN): Likewise.
(NO_TEST_MATHVEC): Likewise.
(TEST_NAN_PAYLOAD_CANONICALIZE): New macro.
(check_float_internal): Check NaN payloads if TEST_NAN_PAYLOAD.
(struct test_Ffp_b1_data): New type.
(RUN_TEST_Ffp_b1): New macro.
(RUN_TEST_LOOP_Ffp_b1): Likewise.
(canonicalize_test_data): New array.
(canonicalize_test): New function.
(main): Call canonicalize_test.
* manual/arith.texi (FP Bit Twiddling): Document canonicalize,
canonicalizef and canonicalizel.
* manual/libm-err-tab.pl: Update comment on interfaces without
ulps tabulated.
* sysdeps/ieee754/ldbl-opt/nldbl-canonicalize.c: New file.
* sysdeps/ieee754/ldbl-opt/s_canonicalizel.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (libnldbl-calls): Add
canonicalize.
(CFLAGS-nldbl-canonicalize.c): New variable.
* sysdeps/ieee754/ldbl-128ibm/test-iscanonical-ldbl-128ibm.c: Move
to ...
* sysdeps/ieee754/ldbl-128ibm/test-canonical-ldbl-128ibm.c:
... here.
(do_test): Also test canonicalizel.
* sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Change
test-iscanonical-ldbl-128ibm to test-canonical-ldbl-128ibm.
* sysdeps/ieee754/ldbl-128ibm/include/bits/iscanonical.h: New
file.
* sysdeps/ieee754/ldbl-128ibm/s_iscanonicall.c (__iscanonicall):
Use libm_hidden_def.
* sysdeps/ieee754/ldbl-96/test-iscanonical-ldbl-96.c: Move to ...
* sysdeps/ieee754/ldbl-96/test-canonical-ldbl-96.c: ... here.
(do_test): Also test canonicalizel.
* sysdeps/ieee754/ldbl-96/Makefile (tests): Change
test-iscanonical-ldbl-96 to test-canonical-ldbl-96.
* sysdeps/ieee754/ldbl-96/include/bits/iscanonical.h: New file.
* sysdeps/ieee754/ldbl-96/s_iscanonicall.c (__iscanonicall): Use
libm_hidden_def.
* sysdeps/generic/math-tests.h (SNAN_TESTS_PRESERVE_PAYLOAD): New
macro.
* sysdeps/mips/math-tests.h [__mips_hard_float && !__mips_nan2008]
(SNAN_TESTS_PRESERVE_PAYLOAD): Likewise.
* sysdeps/nacl/libm.abilist: Update.
* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2016-10-26 23:14:31 +00:00
|
|
|
/* Indicate whether operations on signaling NaNs preserve the payload
|
|
|
|
(if possible; it is not possible with a zero payload if the high
|
|
|
|
bit is set for signaling NaNs) when generating a quiet NaN, and
|
|
|
|
this should be tested. */
|
|
|
|
#ifndef SNAN_TESTS_PRESERVE_PAYLOAD
|
|
|
|
# define SNAN_TESTS_PRESERVE_PAYLOAD 1
|
|
|
|
#endif
|
|
|
|
|
2013-06-10 12:34:49 +00:00
|
|
|
/* Indicate whether to run tests involving a given rounding mode for a
|
|
|
|
given floating-point type, given that fesetround succeeds for that
|
|
|
|
mode. All are run if fesetround succeeds unless overridden. */
|
|
|
|
#ifndef ROUNDING_TESTS_float
|
|
|
|
# define ROUNDING_TESTS_float(MODE) 1
|
|
|
|
#endif
|
|
|
|
#ifndef ROUNDING_TESTS_double
|
|
|
|
# define ROUNDING_TESTS_double(MODE) 1
|
|
|
|
#endif
|
|
|
|
#ifndef ROUNDING_TESTS_long_double
|
|
|
|
# define ROUNDING_TESTS_long_double(MODE) 1
|
|
|
|
#endif
|
2017-06-22 23:03:38 +00:00
|
|
|
#ifndef ROUNDING_TESTS_float128
|
|
|
|
# define ROUNDING_TESTS_float128(MODE) 1
|
|
|
|
#endif
|
2013-06-10 12:34:49 +00:00
|
|
|
|
2017-06-22 23:03:38 +00:00
|
|
|
#define ROUNDING_TESTS(TYPE, MODE) \
|
|
|
|
MATH_TESTS_TG (ROUNDING_TESTS_, (MODE), TYPE)
|
2013-06-11 15:44:31 +00:00
|
|
|
|
|
|
|
/* Indicate whether to run tests of floating-point exceptions for a
|
|
|
|
given floating-point type, given that the exception macros are
|
|
|
|
defined. All are run unless overridden. */
|
|
|
|
#ifndef EXCEPTION_TESTS_float
|
|
|
|
# define EXCEPTION_TESTS_float 1
|
|
|
|
#endif
|
|
|
|
#ifndef EXCEPTION_TESTS_double
|
|
|
|
# define EXCEPTION_TESTS_double 1
|
|
|
|
#endif
|
|
|
|
#ifndef EXCEPTION_TESTS_long_double
|
|
|
|
# define EXCEPTION_TESTS_long_double 1
|
|
|
|
#endif
|
2017-06-22 23:03:38 +00:00
|
|
|
#ifndef EXCEPTION_TESTS_float128
|
|
|
|
# define EXCEPTION_TESTS_float128 1
|
|
|
|
#endif
|
2013-06-11 15:44:31 +00:00
|
|
|
|
2017-06-22 23:03:38 +00:00
|
|
|
#define EXCEPTION_TESTS(TYPE) MATH_TESTS_TG (EXCEPTION_TESTS_, , TYPE)
|
2014-04-17 08:39:27 +00:00
|
|
|
|
|
|
|
/* Indicate whether the given exception trap(s) can be enabled
|
|
|
|
in feenableexcept. If non-zero, the traps are always supported.
|
|
|
|
If zero, traps may or may not be supported depending on the
|
|
|
|
target (this can be determined by checking the return value
|
|
|
|
of feenableexcept). This enables skipping of tests which use
|
|
|
|
traps. By default traps are supported unless overridden. */
|
|
|
|
#ifndef EXCEPTION_ENABLE_SUPPORTED
|
|
|
|
# define EXCEPTION_ENABLE_SUPPORTED(EXCEPT) \
|
|
|
|
(EXCEPTION_TESTS_float || EXCEPTION_TESTS_double)
|
|
|
|
#endif
|
2016-08-10 21:01:08 +00:00
|
|
|
|
|
|
|
/* Indicate whether exception traps, if enabled, occur whenever an
|
|
|
|
exception flag is set explicitly, so it is not possible to set flag
|
|
|
|
bits with traps enabled without causing traps to be taken. If
|
|
|
|
traps cannot be enabled, the value of this macro does not
|
|
|
|
matter. */
|
|
|
|
#ifndef EXCEPTION_SET_FORCES_TRAP
|
|
|
|
# define EXCEPTION_SET_FORCES_TRAP 0
|
|
|
|
#endif
|