Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
/* Support code for testing libm functions (driver).
|
2021-01-03 03:32:25 +08:00
|
|
|
Copyright (C) 1997-2021 Free Software Foundation, Inc.
|
2017-02-07 02:12:16 +08: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
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 13:40:42 +08:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2017-02-07 02:12:16 +08:00
|
|
|
|
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
#include "libm-test-support.h"
|
2017-02-07 02:12:16 +08:00
|
|
|
|
2017-02-14 08:15:48 +08:00
|
|
|
#include <math-tests-arch.h>
|
|
|
|
|
Refactor some code in libm-test-driver.c.
Splitting libm tests by function will mean about a thousand such tests
built separately instead of the present nine (plus vector variants).
When this is done, it's desirable to avoid needing to build all the
test infrastructure so many times. Also, simply including
libm-test-driver.c as-is into per-function tests doesn't actually
work, because the various check_* functions are not used by all tests
and so generate errors for unused static functions.
Although some pieces of infrastructure depend on the type being tested
while others don't, building once per type seems the simplest
approach. This patch makes changes to libm-test-driver.c in
preparation for that. Various cases where functions directly use
macros such as TEST_ERRNO (that may vary depending on things other
than the type under test) are changed to use variables initialized
using those macros, while most of the code in main is moved out to
functions libm_test_init and libm_test_fini.
The idea is that all the functions in libm-test-driver.c will be moved
out in a subsequent patch to be built once per type (and be no longer
static when they are used from per-function tests), while
libm-test-driver.c remains containing definitions of various variables
(no longer static, of course, because they'll be used in the per-type
code) and the main function. Declarations / macros relevant to both
the once-per-type code and the per-function tests will go in a shared
header.
Tested for x86_64.
* math/libm-test-driver.c (flag_test_errno): New variable.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(ulp_idx): Likewise.
(qtype_str): Likewise.
(ULP_IDX): Remove macro.
(QTYPE_STR): Likewise.
(find_ulps): Use ulp_idx not ULP_IDX.
(print_function_ulps): Use qtype_str, printed with %s, not
QTYPE_STR, printed with concatentation to format string.
(print_complex_function_ulps): Likewise.
(test_exceptions): Use flag_test_exceptions not TEST_EXCEPTIONS.
(test_errno): Use flag_test_errno not TEST_ERRNO.
(enable_test): Use flag_test_inline, flag_test_finite and
flag_test_mathvec instead of TEST_INLINE, TEST_FINITE and
TEST_MATHVEC.
(libm_test_init): New function. Factored out of main.
(libm_test_finish): Likewise.
(main): Call libm_test_init and libm_test_finish and move most
code to those functions.
2017-02-07 07:23:54 +08:00
|
|
|
/* Flags set by the including file. */
|
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
const int flag_test_errno = TEST_ERRNO;
|
|
|
|
const int flag_test_exceptions = TEST_EXCEPTIONS;
|
|
|
|
const int flag_test_mathvec = TEST_MATHVEC;
|
Refactor some code in libm-test-driver.c.
Splitting libm tests by function will mean about a thousand such tests
built separately instead of the present nine (plus vector variants).
When this is done, it's desirable to avoid needing to build all the
test infrastructure so many times. Also, simply including
libm-test-driver.c as-is into per-function tests doesn't actually
work, because the various check_* functions are not used by all tests
and so generate errors for unused static functions.
Although some pieces of infrastructure depend on the type being tested
while others don't, building once per type seems the simplest
approach. This patch makes changes to libm-test-driver.c in
preparation for that. Various cases where functions directly use
macros such as TEST_ERRNO (that may vary depending on things other
than the type under test) are changed to use variables initialized
using those macros, while most of the code in main is moved out to
functions libm_test_init and libm_test_fini.
The idea is that all the functions in libm-test-driver.c will be moved
out in a subsequent patch to be built once per type (and be no longer
static when they are used from per-function tests), while
libm-test-driver.c remains containing definitions of various variables
(no longer static, of course, because they'll be used in the per-type
code) and the main function. Declarations / macros relevant to both
the once-per-type code and the per-function tests will go in a shared
header.
Tested for x86_64.
* math/libm-test-driver.c (flag_test_errno): New variable.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(ulp_idx): Likewise.
(qtype_str): Likewise.
(ULP_IDX): Remove macro.
(QTYPE_STR): Likewise.
(find_ulps): Use ulp_idx not ULP_IDX.
(print_function_ulps): Use qtype_str, printed with %s, not
QTYPE_STR, printed with concatentation to format string.
(print_complex_function_ulps): Likewise.
(test_exceptions): Use flag_test_exceptions not TEST_EXCEPTIONS.
(test_errno): Use flag_test_errno not TEST_ERRNO.
(enable_test): Use flag_test_inline, flag_test_finite and
flag_test_mathvec instead of TEST_INLINE, TEST_FINITE and
TEST_MATHVEC.
(libm_test_init): New function. Factored out of main.
(libm_test_finish): Likewise.
(main): Call libm_test_init and libm_test_finish and move most
code to those functions.
2017-02-07 07:23:54 +08:00
|
|
|
|
2018-02-10 06:56:35 +08:00
|
|
|
#if TEST_NARROW
|
|
|
|
const int snan_tests_arg = SNAN_TESTS (ARG_FLOAT);
|
|
|
|
#else
|
|
|
|
const int snan_tests_arg = SNAN_TESTS (FLOAT);
|
|
|
|
#endif
|
|
|
|
|
2017-02-07 07:07:22 +08:00
|
|
|
#define STRX(x) #x
|
|
|
|
#define STR(x) STRX (x)
|
|
|
|
#define STR_FLOAT STR (FLOAT)
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#define STR_ARG_FLOAT STR (ARG_FLOAT)
|
2017-02-07 07:07:22 +08:00
|
|
|
#define STR_VEC_LEN STR (VEC_LEN)
|
|
|
|
|
|
|
|
/* Informal description of the functions being tested. */
|
|
|
|
#if TEST_MATHVEC
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (vector length " STR_VEC_LEN ")\n"
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#elif TEST_NARROW
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (argument " STR_ARG_FLOAT ")\n"
|
2017-02-07 07:07:22 +08:00
|
|
|
#else
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (without inline functions)\n"
|
|
|
|
#endif
|
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
const char test_msg[] = TEST_MSG;
|
2017-02-07 07:07:22 +08:00
|
|
|
|
2017-02-07 02:12:16 +08:00
|
|
|
/* Allow platforms without all rounding modes to test properly,
|
|
|
|
assuming they provide an __FE_UNDEFINED in <bits/fenv.h> which
|
|
|
|
causes fesetround() to return failure. */
|
|
|
|
#ifndef FE_TONEAREST
|
|
|
|
# define FE_TONEAREST __FE_UNDEFINED
|
|
|
|
#endif
|
|
|
|
#ifndef FE_TOWARDZERO
|
|
|
|
# define FE_TOWARDZERO __FE_UNDEFINED
|
|
|
|
#endif
|
|
|
|
#ifndef FE_UPWARD
|
|
|
|
# define FE_UPWARD __FE_UNDEFINED
|
|
|
|
#endif
|
|
|
|
#ifndef FE_DOWNWARD
|
|
|
|
# define FE_DOWNWARD __FE_UNDEFINED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define TEST_NAN_PAYLOAD_CANONICALIZE (SNAN_TESTS_PRESERVE_PAYLOAD \
|
|
|
|
? TEST_NAN_PAYLOAD \
|
|
|
|
: 0)
|
|
|
|
|
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
const char qtype_str[] = TYPE_STR;
|
2017-02-07 02:12:16 +08:00
|
|
|
|
|
|
|
/* Various constants derived from pi. We must supply them precalculated for
|
|
|
|
accuracy. They are written as a series of postfix operations to keep
|
|
|
|
them concise yet somewhat readable. */
|
|
|
|
|
|
|
|
/* (pi * 3) / 4 */
|
|
|
|
#define lit_pi_3_m_4_d LIT (2.356194490192344928846982537459627163)
|
|
|
|
/* pi * 3 / (4 * ln(10)) */
|
|
|
|
#define lit_pi_3_m_4_ln10_m_d LIT (1.023282265381381010614337719073516828)
|
|
|
|
/* pi / (2 * ln(10)) */
|
|
|
|
#define lit_pi_2_ln10_m_d LIT (0.682188176920920673742891812715677885)
|
|
|
|
/* pi / (4 * ln(10)) */
|
|
|
|
#define lit_pi_4_ln10_m_d LIT (0.341094088460460336871445906357838943)
|
|
|
|
/* pi / ln(10) */
|
|
|
|
#define lit_pi_ln10_d LIT (1.364376353841841347485783625431355770)
|
|
|
|
/* pi / 2 */
|
|
|
|
#define lit_pi_2_d LITM (M_PI_2)
|
|
|
|
/* pi / 4 */
|
|
|
|
#define lit_pi_4_d LITM (M_PI_4)
|
|
|
|
/* pi */
|
|
|
|
#define lit_pi LITM (M_PI)
|
|
|
|
|
|
|
|
/* Other useful constants. */
|
|
|
|
|
|
|
|
/* e */
|
|
|
|
#define lit_e LITM (M_E)
|
|
|
|
|
|
|
|
#define plus_zero LIT (0.0)
|
|
|
|
#define minus_zero LIT (-0.0)
|
|
|
|
#define plus_infty FUNC (__builtin_inf) ()
|
|
|
|
#define minus_infty -(FUNC (__builtin_inf) ())
|
|
|
|
#define qnan_value_pl(S) FUNC (__builtin_nan) (S)
|
|
|
|
#define qnan_value qnan_value_pl ("")
|
|
|
|
#define snan_value_pl(S) FUNC (__builtin_nans) (S)
|
|
|
|
#define snan_value snan_value_pl ("")
|
|
|
|
#define max_value TYPE_MAX
|
|
|
|
#define min_value TYPE_MIN
|
|
|
|
#define min_subnorm_value TYPE_TRUE_MIN
|
|
|
|
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#define arg_plus_zero ARG_LIT (0.0)
|
|
|
|
#define arg_minus_zero ARG_LIT (-0.0)
|
|
|
|
#define arg_plus_infty ARG_FUNC (__builtin_inf) ()
|
|
|
|
#define arg_minus_infty -(ARG_FUNC (__builtin_inf) ())
|
|
|
|
#define arg_qnan_value_pl(S) ARG_FUNC (__builtin_nan) (S)
|
|
|
|
#define arg_qnan_value arg_qnan_value_pl ("")
|
|
|
|
#define arg_snan_value_pl(S) ARG_FUNC (__builtin_nans) (S)
|
|
|
|
#define arg_snan_value arg_snan_value_pl ("")
|
|
|
|
#define arg_max_value ARG_TYPE_MAX
|
|
|
|
#define arg_min_value ARG_TYPE_MIN
|
|
|
|
#define arg_min_subnorm_value ARG_TYPE_TRUE_MIN
|
|
|
|
|
2017-02-07 02:12:16 +08:00
|
|
|
/* For nexttoward tests. */
|
|
|
|
#define snan_value_ld __builtin_nansl ("")
|
|
|
|
|
2020-12-24 10:44:20 +08:00
|
|
|
/* For pseudo-normal number tests. */
|
2021-01-04 20:10:04 +08:00
|
|
|
#if TEST_COND_intel96
|
2020-12-24 10:44:20 +08:00
|
|
|
# include <math_ldbl.h>
|
|
|
|
#define pseudo_inf { .parts = { 0x00000000, 0x00000000, 0x7fff }}
|
|
|
|
#define pseudo_zero { .parts = { 0x00000000, 0x00000000, 0x0100 }}
|
|
|
|
#define pseudo_qnan { .parts = { 0x00000001, 0x00000000, 0x7fff }}
|
|
|
|
#define pseudo_snan { .parts = { 0x00000001, 0x40000000, 0x7fff }}
|
|
|
|
#define pseudo_unnormal { .parts = { 0x00000001, 0x40000000, 0x0100 }}
|
|
|
|
#endif
|
|
|
|
|
2017-02-07 02:12:16 +08:00
|
|
|
/* Structures for each kind of test. */
|
|
|
|
/* Used for both RUN_TEST_LOOP_f_f and RUN_TEST_LOOP_fp_f. */
|
|
|
|
struct test_f_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_ff_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1, arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
Replace gen-libm-test.pl with gen-libm-test.py.
Following the recent discussion of using Python instead of Perl and
Awk for glibc build / test, this patch replaces gen-libm-test.pl with
a new gen-libm-test.py script. This script should work with all
Python versions supported by glibc (tested by hand with Python 2.7,
tested in the build system with Python 3.5; configure prefers Python 3
if available).
This script is designed to give identical output to gen-libm-test.pl
for ease of verification of the change, except for generated comments
referring to .py instead of .pl. (That is, identical for actual
inputs passed to the script, not necessarily for all possible input;
for example, this version more precisely follows the C standard syntax
for floating-point constants when deciding when to add LIT macro
calls.) In one place a comment notes that the generation of
NON_FINITE flags is replicating a bug in the Perl script to assist in
such comparisons (with the expectation that this bug can then be
separately fixed in the Python script later).
Tested for x86_64, including comparison of generated files (and hand
testing of the case of generating a sorted libm-test-ulps file, which
isn't covered by normal "make check").
I'd expect to follow this up by extending the new script to produce
the ulps tables for the manual as well (replacing
manual/libm-err-tab.pl, so that then we just have one ulps file
parser) - at which point the manual build would depend on both Perl
and Python (eliminating the Perl dependency would require someone to
rewrite summary.pl in Python, and that would only eliminate the
*direct* Perl dependency; current makeinfo is written in Perl so there
would still be an indirect dependency).
I think install.texi is more or less equally out-of-date regarding
Perl and Python uses before and after this patch, so I don't think
this patch depends on my patch
<https://sourceware.org/ml/libc-alpha/2018-08/msg00133.html> to update
install.texi regarding such uses (pending review).
* math/gen-libm-test.py: New file.
* math/gen-libm-test.pl: Remove.
* math/Makefile [$(PERL) != no]: Change condition to [PYTHON].
($(objpfx)libm-test-ulps.h): Use gen-libm-test.py instead of
gen-libm-test.pl.
($(libm-test-c-noauto-obj)): Likewise.
($(libm-test-c-auto-obj)): Likewise.
($(libm-test-c-narrow-obj)): Likewise.
(regen-ulps): Likewise.
* math/README.libm-test: Update references to gen-libm-test.pl.
* math/libm-test-driver.c (struct test_fj_f_data): Update comment
referencing gen-libm-test.pl.
* math/libm-test-nexttoward.inc (nexttoward_test_data): Likewise.
* math/libm-test-support.c: Likewise.
* math/libm-test-support.h: Likewise.
* sysdeps/generic/libm-test-ulps: Likewise.
2018-08-09 23:34:12 +08:00
|
|
|
/* Strictly speaking, a j type argument is one gen-libm-test.py will not
|
2017-02-07 02:12:16 +08:00
|
|
|
attempt to muck with. For now, it is only used to prevent it from
|
|
|
|
mucking up an explicitly long double argument. */
|
|
|
|
struct test_fj_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1;
|
|
|
|
long double arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#ifdef ARG_FLOAT
|
Add narrowing square root functions
This patch adds the narrowing square root functions from TS 18661-1 /
TS 18661-3 / C2X to glibc's libm: fsqrt, fsqrtl, dsqrtl, f32sqrtf64,
f32sqrtf32x, f32xsqrtf64 for all configurations; f32sqrtf64x,
f32sqrtf128, f64sqrtf64x, f64sqrtf128, f32xsqrtf64x, f32xsqrtf128,
f64xsqrtf128 for configurations with _Float64x and _Float128;
__f32sqrtieee128 and __f64sqrtieee128 aliases in the powerpc64le case
(for calls to fsqrtl and dsqrtl when long double is IEEE binary128).
Corresponding tgmath.h macro support is also added.
The changes are mostly similar to those for the other narrowing
functions previously added, so the description of those generally
applies to this patch as well. However, the not-actually-narrowing
cases (where the two types involved in the function have the same
floating-point format) are aliased to sqrt, sqrtl or sqrtf128 rather
than needing a separately built not-actually-narrowing function such
as was needed for add / sub / mul / div. Thus, there is no
__nldbl_dsqrtl name for ldbl-opt because no such name was needed
(whereas the other functions needed such a name since the only other
name for that entry point was e.g. f32xaddf64, not reserved by TS
18661-1); the headers are made to arrange for sqrt to be called in
that case instead.
The DIAG_* calls in sysdeps/ieee754/soft-fp/s_dsqrtl.c are because
they were observed to be needed in GCC 7 testing of
riscv32-linux-gnu-rv32imac-ilp32. The other sysdeps/ieee754/soft-fp/
files added didn't need such DIAG_* in any configuration I tested with
build-many-glibcs.py, but if they do turn out to be needed in more
files with some other configuration / GCC version, they can always be
added there.
I reused the same test inputs in auto-libm-test-in as for
non-narrowing sqrt rather than adding extra or separate inputs for
narrowing sqrt. The tests in libm-test-narrow-sqrt.inc also follow
those for non-narrowing sqrt.
Tested as followed: natively with the full glibc testsuite for x86_64
(GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
hard float, mips64 (all three ABIs, both hard and soft float). The
different GCC versions are to cover the different cases in tgmath.h
and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
__builtin_tgmath).
2021-09-11 04:56:22 +08:00
|
|
|
struct test_a_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
ARG_FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
struct test_aa_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
ARG_FLOAT arg1, arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
#endif
|
2017-02-07 02:12:16 +08:00
|
|
|
struct test_fi_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1;
|
|
|
|
int arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fl_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1;
|
|
|
|
long int arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_if_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
int arg1;
|
|
|
|
FLOAT arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fff_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1, arg2, arg3;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fiu_M_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1;
|
|
|
|
int arg2;
|
|
|
|
unsigned int arg3;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
intmax_t expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fiu_U_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1;
|
|
|
|
int arg2;
|
|
|
|
unsigned int arg3;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uintmax_t expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_c_f_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT argr, argc;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
/* Used for both RUN_TEST_LOOP_f_f1 and RUN_TEST_LOOP_fI_f1. */
|
|
|
|
struct test_f_f1_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
int extra_test;
|
|
|
|
int extra_expected;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fF_f1_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
int extra_test;
|
|
|
|
FLOAT extra_expected;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_ffI_f1_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1, arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expected;
|
|
|
|
int exceptions;
|
|
|
|
int extra_test;
|
|
|
|
int extra_expected;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_c_c_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT argr, argc;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expr, expc;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_cc_c_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1r, arg1c, arg2r, arg2c;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
FLOAT expr, expc;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
/* Used for all of RUN_TEST_LOOP_f_i, RUN_TEST_LOOP_f_i_tg,
|
|
|
|
RUN_TEST_LOOP_f_b and RUN_TEST_LOOP_f_b_tg. */
|
|
|
|
struct test_f_i_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
2020-12-24 10:44:20 +08:00
|
|
|
/* Used for RUN_TEST_LOOP_f_i_tg_u and RUN_TEST_LOOP_f_b_tg_u. */
|
2021-01-04 20:10:04 +08:00
|
|
|
#if TEST_COND_intel96
|
2021-01-13 11:38:07 +08:00
|
|
|
struct test_j_i_data_u
|
2020-12-24 10:44:20 +08:00
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
ieee_long_double_shape_type arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
#endif
|
Make totalorder and totalordermag functions take pointer arguments.
The resolution of C floating-point Clarification Request 25
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2397.htm#dr_25> is
that the totalorder and totalordermag functions should take pointer
arguments, and this has been adopted in C2X (with const added; note
that the integration of this change into C2X is present in the C
standard git repository but postdates the most recent public PDF
draft).
This patch updates glibc accordingly. As a defect resolution, the API
is changed unconditionally rather than supporting any sort of TS
18661-1 mode for compilation with the old version of the API. There
are compat symbols for existing binaries that pass floating-point
arguments directly. As a consequence of changing to pointer
arguments, there are no longer type-generic macros in tgmath.h for
these functions.
Because of the fairly complicated logic for creating libm function
aliases and determining the set of aliases to create in a given glibc
configuration, rather than duplicating all that in individual source
files to create the versioned and compat symbols, the source files for
the various versions of totalorder functions are set up to redefine
weak_alias before using libm_alias_* macros to create the symbols
required. In turn, this requires creating a separate alias for each
symbol version pointing to the same implementation (see binutils bug
<https://sourceware.org/bugzilla/show_bug.cgi?id=23840>), which is
done automatically using __COUNTER__. (As I noted in
<https://sourceware.org/ml/libc-alpha/2018-10/msg00631.html>, it might
well make sense for glibc's symbol versioning macros to do that alias
creation with __COUNTER__ themselves, which would somewhat simplify
the logic in the totalorder source files.)
It is of course desirable to test the compat symbols. I did this with
the generic libm-test machinery, but didn't wish to duplicate the
actual tables of test inputs and outputs, and thought it risky to
attempt to have a single object file refer to both default and compat
versions of the same function in order to test them together. Thus, I
created libm-test-compat_totalorder.inc and
libm-test-compat_totalordermag.inc which include the generated .c
files (with the processed version of those tables of inputs) from the
non-compat tests, and added appropriate dependencies. I think this
provides sufficient test coverage for the compat symbols without also
needing to make the special ldbl-96 and ldbl-128ibm tests (of
peculiarities relating to the representations of those formats that
can't be covered in the generic tests) run for the compat symbols.
Tests of compat symbols need to be internal tests, meaning _ISOMAC is
not defined. Making some libm-test tests into internal tests showed
up two other issues. GCC diagnoses duplicate macro definitions of
__STDC_* macros, including __STDC_WANT_IEC_60559_TYPES_EXT__; I added
an appropriate conditional and filed
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91451> for this issue.
On ia64, include/setjmp.h ends up getting included indirectly from
libm-symbols.h, resulting in conflicting definitions of the STR macro
(also defined in libm-test-driver.c); I renamed the macros in
include/setjmp.h. (It's arguable that we should have common internal
headers used everywhere for stringizing and concatenation macros.)
Tested for x86_64 and x86, and with build-many-glibcs.py.
* math/bits/mathcalls.h
[__GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN]
(totalorder): Take pointer arguments.
[__GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN]
(totalordermag): Likewise.
* manual/arith.texi (totalorder): Likewise.
(totalorderf): Likewise.
(totalorderl): Likewise.
(totalorderfN): Likewise.
(totalorderfNx): Likewise.
(totalordermag): Likewise.
(totalordermagf): Likewise.
(totalordermagl): Likewise.
(totalordermagfN): Likewise.
(totalordermagfNx): Likewise.
* math/tgmath.h (__TGMATH_BINARY_REAL_RET_ONLY): Remove macro.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (totalorder): Likewise.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (totalordermag): Likewise.
* math/Versions (GLIBC_2.31): Add totalorder, totalorderf,
totalorderl, totalordermag, totalordermagf, totalordermagl,
totalorderf32, totalorderf64, totalorderf32x, totalordermagf32,
totalordermagf64, totalordermagf32x, totalorderf64x,
totalordermagf64x, totalorderf128 and totalordermagf128.
* math/Makefile (libm-test-funcs-noauto): Add compat_totalorder
and compat_totalordermag.
(libm-test-funcs-compat): New variable.
(libm-tests-compat): Likewise.
(tests): Do not include compat tests.
(tests-internal): Add compat tests.
($(foreach t,$(libm-tests-base),
$(objpfx)$(t)-compat_totalorder.o)): Depend
on $(objpfx)libm-test-totalorder.c.
($(foreach t,$(libm-tests-base),
$(objpfx)$(t)-compat_totalordermag.o): Depend on
$(objpfx)libm-test-totalordermag.c.
(tgmath3-macros): Remove totalorder and totalordermag.
* math/libm-test-compat_totalorder.inc: New file.
* math/libm-test-compat_totalordermag.inc: Likewise.
* math/libm-test-driver.c (struct test_ff_i_data): Update comment.
(RUN_TEST_fpfp_b): New macro.
(RUN_TEST_LOOP_fpfp_b): Likewise.
* math/libm-test-totalorder.inc (totalorder_test_data): Use
TEST_fpfp_b.
(totalorder_test): Condition on [!COMPAT_TEST].
(do_test): Likewise.
* math/libm-test-totalordermag.inc (totalordermag_test_data): Use
TEST_fpfp_b.
(totalordermag_test): Condition on [!COMPAT_TEST].
(do_test): Likewise.
* math/gen-tgmath-tests.py (Tests.add_all_tests): Remove
totalorder and totalordermag.
* math/test-tgmath.c (NCALLS): Change to 132.
(F(compile_test)): Do not call totalorder or totalordermag.
(F(totalorder)): Remove.
(F(totalordermag)): Likewise.
* include/float.h (__STDC_WANT_IEC_60559_TYPES_EXT__): Do not
define if [__STDC_WANT_IEC_60559_TYPES_EXT__].
* include/setjmp.h [!_ISOMAC] (STR_HELPER): Rename to
SJSTR_HELPER.
[!_ISOMAC] (STR): Rename to SJSTR. Update call to STR_HELPER.
[!_ISOMAC] (TEST_SIZE): Update call to STR.
[!_ISOMAC] (TEST_ALIGN): Likewise.
[!_ISOMAC] (TEST_OFFSET): Likewise.
* sysdeps/ieee754/dbl-64/s_totalorder.c: Include <shlib-compat.h>
and <first-versions.h>.
(__totalorder): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/dbl-64/s_totalordermag.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermag): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorder): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermag): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/float128/float128_private.h
(__totalorder_compatl): New macro.
(__totalordermag_compatl): Likewise.
* sysdeps/ieee754/flt-32/s_totalorderf.c: Include <shlib-compat.h>
and <first-versions.h>.
(__totalorderf): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/flt-32/s_totalordermagf.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagf): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-128/s_totalorderl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-128/s_totalordermagl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c: Include
<shlib-compat.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c: Include
<shlib-compat.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-96/s_totalorderl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-96/s_totalordermagl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-opt/nldbl-totalorder.c (totalorderl): Take
pointer arguments.
* sysdeps/ieee754/ldbl-opt/nldbl-totalordermag.c (totalordermagl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/test-totalorderl-ldbl-128ibm.c
(do_test): Update calls to totalorderl and totalordermagl.
* sysdeps/ieee754/ldbl-96/test-totalorderl-ldbl-96.c (do_test):
Update calls to totalorderl and totalordermagl.
* sysdeps/mach/hurd/i386/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/csky/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/be/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/riscv/rv64/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/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2019-08-15 23:18:34 +08:00
|
|
|
/* Used for RUN_TEST_LOOP_ff_b, RUN_TEST_LOOP_fpfp_b and
|
|
|
|
RUN_TEST_LOOP_ff_i_tg. */
|
2017-02-07 02:12:16 +08:00
|
|
|
struct test_ff_i_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg1, arg2;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_f_l_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
long int expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_f_L_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
long long int expected;
|
|
|
|
int exceptions;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
struct test_fFF_11_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int exceptions;
|
|
|
|
int extra1_test;
|
|
|
|
FLOAT extra1_expected;
|
|
|
|
int extra2_test;
|
|
|
|
FLOAT extra2_expected;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
/* Used for both RUN_TEST_LOOP_Ff_b1 and RUN_TEST_LOOP_Ffp_b1. */
|
|
|
|
struct test_Ff_b1_data
|
|
|
|
{
|
|
|
|
const char *arg_str;
|
|
|
|
FLOAT arg;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
int expected;
|
|
|
|
int exceptions;
|
|
|
|
int extra_test;
|
|
|
|
FLOAT extra_expected;
|
|
|
|
} rd, rn, rz, ru;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Set the rounding mode, or restore the saved value. */
|
|
|
|
#define IF_ROUND_INIT_ /* Empty. */
|
|
|
|
#define IF_ROUND_INIT_FE_DOWNWARD \
|
|
|
|
int save_round_mode = fegetround (); \
|
|
|
|
if (ROUNDING_TESTS (FLOAT, FE_DOWNWARD) \
|
2018-08-22 23:22:06 +08:00
|
|
|
&& !TEST_MATHVEC \
|
2017-02-07 02:12:16 +08:00
|
|
|
&& fesetround (FE_DOWNWARD) == 0)
|
|
|
|
#define IF_ROUND_INIT_FE_TONEAREST \
|
|
|
|
int save_round_mode = fegetround (); \
|
|
|
|
if (ROUNDING_TESTS (FLOAT, FE_TONEAREST) \
|
|
|
|
&& fesetround (FE_TONEAREST) == 0)
|
|
|
|
#define IF_ROUND_INIT_FE_TOWARDZERO \
|
|
|
|
int save_round_mode = fegetround (); \
|
|
|
|
if (ROUNDING_TESTS (FLOAT, FE_TOWARDZERO) \
|
2018-08-22 23:22:06 +08:00
|
|
|
&& !TEST_MATHVEC \
|
2017-02-07 02:12:16 +08:00
|
|
|
&& fesetround (FE_TOWARDZERO) == 0)
|
|
|
|
#define IF_ROUND_INIT_FE_UPWARD \
|
|
|
|
int save_round_mode = fegetround (); \
|
|
|
|
if (ROUNDING_TESTS (FLOAT, FE_UPWARD) \
|
2018-08-22 23:22:06 +08:00
|
|
|
&& !TEST_MATHVEC \
|
2017-02-07 02:12:16 +08:00
|
|
|
&& fesetround (FE_UPWARD) == 0)
|
|
|
|
#define ROUND_RESTORE_ /* Empty. */
|
|
|
|
#define ROUND_RESTORE_FE_DOWNWARD \
|
|
|
|
fesetround (save_round_mode)
|
|
|
|
#define ROUND_RESTORE_FE_TONEAREST \
|
|
|
|
fesetround (save_round_mode)
|
|
|
|
#define ROUND_RESTORE_FE_TOWARDZERO \
|
|
|
|
fesetround (save_round_mode)
|
|
|
|
#define ROUND_RESTORE_FE_UPWARD \
|
|
|
|
fesetround (save_round_mode)
|
|
|
|
|
|
|
|
/* Field name to use for a given rounding mode. */
|
|
|
|
#define RM_ rn
|
|
|
|
#define RM_FE_DOWNWARD rd
|
|
|
|
#define RM_FE_TONEAREST rn
|
|
|
|
#define RM_FE_TOWARDZERO rz
|
|
|
|
#define RM_FE_UPWARD ru
|
|
|
|
|
|
|
|
/* Common setup for an individual test. */
|
|
|
|
#define COMMON_TEST_SETUP(ARG_STR) \
|
|
|
|
char *test_name; \
|
|
|
|
if (asprintf (&test_name, "%s (%s)", this_func, (ARG_STR)) == -1) \
|
|
|
|
abort ()
|
|
|
|
|
|
|
|
/* Setup for a test with an extra output. */
|
|
|
|
#define EXTRA_OUTPUT_TEST_SETUP(ARG_STR, N) \
|
|
|
|
char *extra##N##_name; \
|
|
|
|
if (asprintf (&extra##N##_name, "%s (%s) extra output " #N, \
|
|
|
|
this_func, (ARG_STR)) == -1) \
|
|
|
|
abort ()
|
|
|
|
|
|
|
|
/* Common cleanup after an individual test. */
|
|
|
|
#define COMMON_TEST_CLEANUP \
|
|
|
|
free (test_name)
|
|
|
|
|
|
|
|
/* Cleanup for a test with an extra output. */
|
|
|
|
#define EXTRA_OUTPUT_TEST_CLEANUP(N) \
|
|
|
|
free (extra##N##_name)
|
|
|
|
|
|
|
|
/* Run an individual test, including any required setup and checking
|
|
|
|
of results, or loop over all tests in an array. */
|
Add narrowing square root functions
This patch adds the narrowing square root functions from TS 18661-1 /
TS 18661-3 / C2X to glibc's libm: fsqrt, fsqrtl, dsqrtl, f32sqrtf64,
f32sqrtf32x, f32xsqrtf64 for all configurations; f32sqrtf64x,
f32sqrtf128, f64sqrtf64x, f64sqrtf128, f32xsqrtf64x, f32xsqrtf128,
f64xsqrtf128 for configurations with _Float64x and _Float128;
__f32sqrtieee128 and __f64sqrtieee128 aliases in the powerpc64le case
(for calls to fsqrtl and dsqrtl when long double is IEEE binary128).
Corresponding tgmath.h macro support is also added.
The changes are mostly similar to those for the other narrowing
functions previously added, so the description of those generally
applies to this patch as well. However, the not-actually-narrowing
cases (where the two types involved in the function have the same
floating-point format) are aliased to sqrt, sqrtl or sqrtf128 rather
than needing a separately built not-actually-narrowing function such
as was needed for add / sub / mul / div. Thus, there is no
__nldbl_dsqrtl name for ldbl-opt because no such name was needed
(whereas the other functions needed such a name since the only other
name for that entry point was e.g. f32xaddf64, not reserved by TS
18661-1); the headers are made to arrange for sqrt to be called in
that case instead.
The DIAG_* calls in sysdeps/ieee754/soft-fp/s_dsqrtl.c are because
they were observed to be needed in GCC 7 testing of
riscv32-linux-gnu-rv32imac-ilp32. The other sysdeps/ieee754/soft-fp/
files added didn't need such DIAG_* in any configuration I tested with
build-many-glibcs.py, but if they do turn out to be needed in more
files with some other configuration / GCC version, they can always be
added there.
I reused the same test inputs in auto-libm-test-in as for
non-narrowing sqrt rather than adding extra or separate inputs for
narrowing sqrt. The tests in libm-test-narrow-sqrt.inc also follow
those for non-narrowing sqrt.
Tested as followed: natively with the full glibc testsuite for x86_64
(GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
hard float, mips64 (all three ABIs, both hard and soft float). The
different GCC versions are to cover the different cases in tgmath.h
and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
__builtin_tgmath).
2021-09-11 04:56:22 +08:00
|
|
|
#define RUN_TEST_1_f(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
2017-02-07 02:12:16 +08:00
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
Add narrowing square root functions
This patch adds the narrowing square root functions from TS 18661-1 /
TS 18661-3 / C2X to glibc's libm: fsqrt, fsqrtl, dsqrtl, f32sqrtf64,
f32sqrtf32x, f32xsqrtf64 for all configurations; f32sqrtf64x,
f32sqrtf128, f64sqrtf64x, f64sqrtf128, f32xsqrtf64x, f32xsqrtf128,
f64xsqrtf128 for configurations with _Float64x and _Float128;
__f32sqrtieee128 and __f64sqrtieee128 aliases in the powerpc64le case
(for calls to fsqrtl and dsqrtl when long double is IEEE binary128).
Corresponding tgmath.h macro support is also added.
The changes are mostly similar to those for the other narrowing
functions previously added, so the description of those generally
applies to this patch as well. However, the not-actually-narrowing
cases (where the two types involved in the function have the same
floating-point format) are aliased to sqrt, sqrtl or sqrtf128 rather
than needing a separately built not-actually-narrowing function such
as was needed for add / sub / mul / div. Thus, there is no
__nldbl_dsqrtl name for ldbl-opt because no such name was needed
(whereas the other functions needed such a name since the only other
name for that entry point was e.g. f32xaddf64, not reserved by TS
18661-1); the headers are made to arrange for sqrt to be called in
that case instead.
The DIAG_* calls in sysdeps/ieee754/soft-fp/s_dsqrtl.c are because
they were observed to be needed in GCC 7 testing of
riscv32-linux-gnu-rv32imac-ilp32. The other sysdeps/ieee754/soft-fp/
files added didn't need such DIAG_* in any configuration I tested with
build-many-glibcs.py, but if they do turn out to be needed in more
files with some other configuration / GCC version, they can always be
added there.
I reused the same test inputs in auto-libm-test-in as for
non-narrowing sqrt rather than adding extra or separate inputs for
narrowing sqrt. The tests in libm-test-narrow-sqrt.inc also follow
those for non-narrowing sqrt.
Tested as followed: natively with the full glibc testsuite for x86_64
(GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
hard float, mips64 (all three ABIs, both hard and soft float). The
different GCC versions are to cover the different cases in tgmath.h
and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
__builtin_tgmath).
2021-09-11 04:56:22 +08:00
|
|
|
#define RUN_TEST_LOOP_1_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
2017-02-07 02:12:16 +08:00
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
Add narrowing square root functions
This patch adds the narrowing square root functions from TS 18661-1 /
TS 18661-3 / C2X to glibc's libm: fsqrt, fsqrtl, dsqrtl, f32sqrtf64,
f32sqrtf32x, f32xsqrtf64 for all configurations; f32sqrtf64x,
f32sqrtf128, f64sqrtf64x, f64sqrtf128, f32xsqrtf64x, f32xsqrtf128,
f64xsqrtf128 for configurations with _Float64x and _Float128;
__f32sqrtieee128 and __f64sqrtieee128 aliases in the powerpc64le case
(for calls to fsqrtl and dsqrtl when long double is IEEE binary128).
Corresponding tgmath.h macro support is also added.
The changes are mostly similar to those for the other narrowing
functions previously added, so the description of those generally
applies to this patch as well. However, the not-actually-narrowing
cases (where the two types involved in the function have the same
floating-point format) are aliased to sqrt, sqrtl or sqrtf128 rather
than needing a separately built not-actually-narrowing function such
as was needed for add / sub / mul / div. Thus, there is no
__nldbl_dsqrtl name for ldbl-opt because no such name was needed
(whereas the other functions needed such a name since the only other
name for that entry point was e.g. f32xaddf64, not reserved by TS
18661-1); the headers are made to arrange for sqrt to be called in
that case instead.
The DIAG_* calls in sysdeps/ieee754/soft-fp/s_dsqrtl.c are because
they were observed to be needed in GCC 7 testing of
riscv32-linux-gnu-rv32imac-ilp32. The other sysdeps/ieee754/soft-fp/
files added didn't need such DIAG_* in any configuration I tested with
build-many-glibcs.py, but if they do turn out to be needed in more
files with some other configuration / GCC version, they can always be
added there.
I reused the same test inputs in auto-libm-test-in as for
non-narrowing sqrt rather than adding extra or separate inputs for
narrowing sqrt. The tests in libm-test-narrow-sqrt.inc also follow
those for non-narrowing sqrt.
Tested as followed: natively with the full glibc testsuite for x86_64
(GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
hard float, mips64 (all three ABIs, both hard and soft float). The
different GCC versions are to cover the different cases in tgmath.h
and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
__builtin_tgmath).
2021-09-11 04:56:22 +08:00
|
|
|
RUN_TEST_1_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
2017-02-07 02:12:16 +08:00
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
Add narrowing square root functions
This patch adds the narrowing square root functions from TS 18661-1 /
TS 18661-3 / C2X to glibc's libm: fsqrt, fsqrtl, dsqrtl, f32sqrtf64,
f32sqrtf32x, f32xsqrtf64 for all configurations; f32sqrtf64x,
f32sqrtf128, f64sqrtf64x, f64sqrtf128, f32xsqrtf64x, f32xsqrtf128,
f64xsqrtf128 for configurations with _Float64x and _Float128;
__f32sqrtieee128 and __f64sqrtieee128 aliases in the powerpc64le case
(for calls to fsqrtl and dsqrtl when long double is IEEE binary128).
Corresponding tgmath.h macro support is also added.
The changes are mostly similar to those for the other narrowing
functions previously added, so the description of those generally
applies to this patch as well. However, the not-actually-narrowing
cases (where the two types involved in the function have the same
floating-point format) are aliased to sqrt, sqrtl or sqrtf128 rather
than needing a separately built not-actually-narrowing function such
as was needed for add / sub / mul / div. Thus, there is no
__nldbl_dsqrtl name for ldbl-opt because no such name was needed
(whereas the other functions needed such a name since the only other
name for that entry point was e.g. f32xaddf64, not reserved by TS
18661-1); the headers are made to arrange for sqrt to be called in
that case instead.
The DIAG_* calls in sysdeps/ieee754/soft-fp/s_dsqrtl.c are because
they were observed to be needed in GCC 7 testing of
riscv32-linux-gnu-rv32imac-ilp32. The other sysdeps/ieee754/soft-fp/
files added didn't need such DIAG_* in any configuration I tested with
build-many-glibcs.py, but if they do turn out to be needed in more
files with some other configuration / GCC version, they can always be
added there.
I reused the same test inputs in auto-libm-test-in as for
non-narrowing sqrt rather than adding extra or separate inputs for
narrowing sqrt. The tests in libm-test-narrow-sqrt.inc also follow
those for non-narrowing sqrt.
Tested as followed: natively with the full glibc testsuite for x86_64
(GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
hard float, mips64 (all three ABIs, both hard and soft float). The
different GCC versions are to cover the different cases in tgmath.h
and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
__builtin_tgmath).
2021-09-11 04:56:22 +08:00
|
|
|
#define RUN_TEST_LOOP_f_f RUN_TEST_LOOP_1_f
|
|
|
|
#define RUN_TEST_LOOP_a_f RUN_TEST_LOOP_1_f
|
2017-02-07 02:12:16 +08:00
|
|
|
#define RUN_TEST_fp_f(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (&(ARG)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fp_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fp_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_2_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_2_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_2_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
|
|
|
|
(ARRAY)[i].arg2, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_ff_f RUN_TEST_2_f
|
|
|
|
#define RUN_TEST_LOOP_ff_f RUN_TEST_LOOP_2_f
|
|
|
|
#define RUN_TEST_LOOP_fj_f RUN_TEST_LOOP_2_f
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#define RUN_TEST_LOOP_aa_f RUN_TEST_LOOP_2_f
|
2017-02-07 02:12:16 +08:00
|
|
|
#define RUN_TEST_fi_f RUN_TEST_2_f
|
|
|
|
#define RUN_TEST_LOOP_fi_f RUN_TEST_LOOP_2_f
|
|
|
|
#define RUN_TEST_fl_f RUN_TEST_2_f
|
|
|
|
#define RUN_TEST_LOOP_fl_f RUN_TEST_LOOP_2_f
|
|
|
|
#define RUN_TEST_if_f RUN_TEST_2_f
|
|
|
|
#define RUN_TEST_LOOP_if_f RUN_TEST_LOOP_2_f
|
|
|
|
#define RUN_TEST_fff_f(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
|
|
|
|
EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fff_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fff_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
|
|
|
|
(ARRAY)[i].arg2, (ARRAY)[i].arg3, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_fiu_M(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
|
|
|
|
EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_intmax_t (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fiu_M(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fiu_M ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
|
|
|
|
(ARRAY)[i].arg2, (ARRAY)[i].arg3, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_fiu_U(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3, \
|
|
|
|
EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_uintmax_t (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (ARG1, ARG2, ARG3), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fiu_U(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fiu_U ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1, \
|
|
|
|
(ARRAY)[i].arg2, (ARRAY)[i].arg3, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_c_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_float (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),\
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_c_f(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_c_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr, \
|
|
|
|
(ARRAY)[i].argc, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_fF_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA_VAR)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fF_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fF_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_fI_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
check_float (test_name, FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA_VAR)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fI_f1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_ffI_f1_mod8(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
check_float (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (ARG1, ARG2, &(EXTRA_VAR)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_int (extra1_name, (EXTRA_VAR) % 8, EXTRA_EXPECTED, 0); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_ffI_f1_mod8(FUNC_NAME, ARRAY, ROUNDING_MODE, \
|
|
|
|
EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_ffI_f1_mod8 ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(ARRAY)[i].arg1, (ARRAY)[i].arg2, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_Ff_b1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
/* Clear any exceptions from comparison involving sNaN \
|
|
|
|
EXTRA_EXPECTED. */ \
|
|
|
|
feclearexcept (FE_ALL_EXCEPT); \
|
|
|
|
check_bool (test_name, FUNC_TEST (FUNC_NAME) (&(EXTRA_VAR), \
|
|
|
|
(ARG)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, \
|
|
|
|
(EXCEPTIONS) & TEST_NAN_PAYLOAD); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_Ff_b1(FUNC_NAME, ARRAY, ROUNDING_MODE, \
|
|
|
|
EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_Ff_b1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_Ffp_b1(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS, EXTRA_VAR, EXTRA_TEST, \
|
|
|
|
EXTRA_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0; \
|
|
|
|
check_bool (test_name, FUNC_TEST (FUNC_NAME) (&(EXTRA_VAR), \
|
|
|
|
&(ARG)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA_TEST) \
|
|
|
|
check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, \
|
|
|
|
(EXCEPTIONS) & TEST_NAN_PAYLOAD); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_Ffp_b1(FUNC_NAME, ARRAY, ROUNDING_MODE, \
|
|
|
|
EXTRA_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_Ffp_b1 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_c_c(ARG_STR, FUNC_NAME, ARGR, ARGC, EXPR, EXPC, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_complex (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)), \
|
|
|
|
BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_c_c(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_c_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].argr, \
|
|
|
|
(ARRAY)[i].argc, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expr, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expc, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_cc_c(ARG_STR, FUNC_NAME, ARG1R, ARG1C, ARG2R, ARG2C, \
|
|
|
|
EXPR, EXPC, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_complex (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C), \
|
|
|
|
BUILD_COMPLEX (ARG2R, ARG2C)), \
|
|
|
|
BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_cc_c(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_cc_c ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg1r, \
|
|
|
|
(ARRAY)[i].arg1c, (ARRAY)[i].arg2r, \
|
|
|
|
(ARRAY)[i].arg2c, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expr, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expc, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_i(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_int (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_i(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_i ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_i_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_int (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
2021-01-13 11:38:07 +08:00
|
|
|
#define RUN_TEST_LOOP_j_b_tg_u(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
2020-12-24 10:44:20 +08:00
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
2021-01-13 11:38:07 +08:00
|
|
|
RUN_TEST_f_b_tg ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(FLOAT)(ARRAY)[i].arg.value, \
|
2020-12-24 10:44:20 +08:00
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
2021-01-13 11:38:07 +08:00
|
|
|
#define RUN_TEST_LOOP_j_i_tg_u(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
2020-12-24 10:44:20 +08:00
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
2021-01-13 11:38:07 +08:00
|
|
|
RUN_TEST_f_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(FLOAT)(ARRAY)[i].arg.value, \
|
2020-12-24 10:44:20 +08:00
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
2017-02-07 02:12:16 +08:00
|
|
|
#define RUN_TEST_ff_b(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_bool (test_name, FUNC_TEST (FUNC_NAME) (ARG1, ARG2), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_ff_b(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_ff_b ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(ARRAY)[i].arg1, (ARRAY)[i].arg2, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
Make totalorder and totalordermag functions take pointer arguments.
The resolution of C floating-point Clarification Request 25
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2397.htm#dr_25> is
that the totalorder and totalordermag functions should take pointer
arguments, and this has been adopted in C2X (with const added; note
that the integration of this change into C2X is present in the C
standard git repository but postdates the most recent public PDF
draft).
This patch updates glibc accordingly. As a defect resolution, the API
is changed unconditionally rather than supporting any sort of TS
18661-1 mode for compilation with the old version of the API. There
are compat symbols for existing binaries that pass floating-point
arguments directly. As a consequence of changing to pointer
arguments, there are no longer type-generic macros in tgmath.h for
these functions.
Because of the fairly complicated logic for creating libm function
aliases and determining the set of aliases to create in a given glibc
configuration, rather than duplicating all that in individual source
files to create the versioned and compat symbols, the source files for
the various versions of totalorder functions are set up to redefine
weak_alias before using libm_alias_* macros to create the symbols
required. In turn, this requires creating a separate alias for each
symbol version pointing to the same implementation (see binutils bug
<https://sourceware.org/bugzilla/show_bug.cgi?id=23840>), which is
done automatically using __COUNTER__. (As I noted in
<https://sourceware.org/ml/libc-alpha/2018-10/msg00631.html>, it might
well make sense for glibc's symbol versioning macros to do that alias
creation with __COUNTER__ themselves, which would somewhat simplify
the logic in the totalorder source files.)
It is of course desirable to test the compat symbols. I did this with
the generic libm-test machinery, but didn't wish to duplicate the
actual tables of test inputs and outputs, and thought it risky to
attempt to have a single object file refer to both default and compat
versions of the same function in order to test them together. Thus, I
created libm-test-compat_totalorder.inc and
libm-test-compat_totalordermag.inc which include the generated .c
files (with the processed version of those tables of inputs) from the
non-compat tests, and added appropriate dependencies. I think this
provides sufficient test coverage for the compat symbols without also
needing to make the special ldbl-96 and ldbl-128ibm tests (of
peculiarities relating to the representations of those formats that
can't be covered in the generic tests) run for the compat symbols.
Tests of compat symbols need to be internal tests, meaning _ISOMAC is
not defined. Making some libm-test tests into internal tests showed
up two other issues. GCC diagnoses duplicate macro definitions of
__STDC_* macros, including __STDC_WANT_IEC_60559_TYPES_EXT__; I added
an appropriate conditional and filed
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91451> for this issue.
On ia64, include/setjmp.h ends up getting included indirectly from
libm-symbols.h, resulting in conflicting definitions of the STR macro
(also defined in libm-test-driver.c); I renamed the macros in
include/setjmp.h. (It's arguable that we should have common internal
headers used everywhere for stringizing and concatenation macros.)
Tested for x86_64 and x86, and with build-many-glibcs.py.
* math/bits/mathcalls.h
[__GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN]
(totalorder): Take pointer arguments.
[__GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN]
(totalordermag): Likewise.
* manual/arith.texi (totalorder): Likewise.
(totalorderf): Likewise.
(totalorderl): Likewise.
(totalorderfN): Likewise.
(totalorderfNx): Likewise.
(totalordermag): Likewise.
(totalordermagf): Likewise.
(totalordermagl): Likewise.
(totalordermagfN): Likewise.
(totalordermagfNx): Likewise.
* math/tgmath.h (__TGMATH_BINARY_REAL_RET_ONLY): Remove macro.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (totalorder): Likewise.
[__GLIBC_USE (IEC_60559_BFP_EXT)] (totalordermag): Likewise.
* math/Versions (GLIBC_2.31): Add totalorder, totalorderf,
totalorderl, totalordermag, totalordermagf, totalordermagl,
totalorderf32, totalorderf64, totalorderf32x, totalordermagf32,
totalordermagf64, totalordermagf32x, totalorderf64x,
totalordermagf64x, totalorderf128 and totalordermagf128.
* math/Makefile (libm-test-funcs-noauto): Add compat_totalorder
and compat_totalordermag.
(libm-test-funcs-compat): New variable.
(libm-tests-compat): Likewise.
(tests): Do not include compat tests.
(tests-internal): Add compat tests.
($(foreach t,$(libm-tests-base),
$(objpfx)$(t)-compat_totalorder.o)): Depend
on $(objpfx)libm-test-totalorder.c.
($(foreach t,$(libm-tests-base),
$(objpfx)$(t)-compat_totalordermag.o): Depend on
$(objpfx)libm-test-totalordermag.c.
(tgmath3-macros): Remove totalorder and totalordermag.
* math/libm-test-compat_totalorder.inc: New file.
* math/libm-test-compat_totalordermag.inc: Likewise.
* math/libm-test-driver.c (struct test_ff_i_data): Update comment.
(RUN_TEST_fpfp_b): New macro.
(RUN_TEST_LOOP_fpfp_b): Likewise.
* math/libm-test-totalorder.inc (totalorder_test_data): Use
TEST_fpfp_b.
(totalorder_test): Condition on [!COMPAT_TEST].
(do_test): Likewise.
* math/libm-test-totalordermag.inc (totalordermag_test_data): Use
TEST_fpfp_b.
(totalordermag_test): Condition on [!COMPAT_TEST].
(do_test): Likewise.
* math/gen-tgmath-tests.py (Tests.add_all_tests): Remove
totalorder and totalordermag.
* math/test-tgmath.c (NCALLS): Change to 132.
(F(compile_test)): Do not call totalorder or totalordermag.
(F(totalorder)): Remove.
(F(totalordermag)): Likewise.
* include/float.h (__STDC_WANT_IEC_60559_TYPES_EXT__): Do not
define if [__STDC_WANT_IEC_60559_TYPES_EXT__].
* include/setjmp.h [!_ISOMAC] (STR_HELPER): Rename to
SJSTR_HELPER.
[!_ISOMAC] (STR): Rename to SJSTR. Update call to STR_HELPER.
[!_ISOMAC] (TEST_SIZE): Update call to STR.
[!_ISOMAC] (TEST_ALIGN): Likewise.
[!_ISOMAC] (TEST_OFFSET): Likewise.
* sysdeps/ieee754/dbl-64/s_totalorder.c: Include <shlib-compat.h>
and <first-versions.h>.
(__totalorder): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/dbl-64/s_totalordermag.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermag): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorder): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermag): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/float128/float128_private.h
(__totalorder_compatl): New macro.
(__totalordermag_compatl): Likewise.
* sysdeps/ieee754/flt-32/s_totalorderf.c: Include <shlib-compat.h>
and <first-versions.h>.
(__totalorderf): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/flt-32/s_totalordermagf.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagf): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-128/s_totalorderl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-128/s_totalordermagl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c: Include
<shlib-compat.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c: Include
<shlib-compat.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-96/s_totalorderl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalorderl): Take pointer arguments. Add symbol versions and
compat symbols.
* sysdeps/ieee754/ldbl-96/s_totalordermagl.c: Include
<shlib-compat.h> and <first-versions.h>.
(__totalordermagl): Take pointer arguments. Add symbol versions
and compat symbols.
* sysdeps/ieee754/ldbl-opt/nldbl-totalorder.c (totalorderl): Take
pointer arguments.
* sysdeps/ieee754/ldbl-opt/nldbl-totalordermag.c (totalordermagl):
Likewise.
* sysdeps/ieee754/ldbl-128ibm/test-totalorderl-ldbl-128ibm.c
(do_test): Update calls to totalorderl and totalordermagl.
* sysdeps/ieee754/ldbl-96/test-totalorderl-ldbl-96.c (do_test):
Update calls to totalorderl and totalordermagl.
* sysdeps/mach/hurd/i386/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/csky/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/be/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libm.abilist:
Likewise.
* sysdeps/unix/sysv/linux/riscv/rv64/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/x86_64/64/libm.abilist: Likewise.
* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2019-08-15 23:18:34 +08:00
|
|
|
#define RUN_TEST_fpfp_b(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_bool (test_name, \
|
|
|
|
FUNC_TEST (FUNC_NAME) (&(ARG1), &(ARG2)), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fpfp_b(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fpfp_b ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(ARRAY)[i].arg1, (ARRAY)[i].arg2, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
2017-02-07 02:12:16 +08:00
|
|
|
#define RUN_TEST_ff_i_tg(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_int (test_name, FUNC_NAME (ARG1, ARG2), EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_ff_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_ff_i_tg ((ARRAY)[i].arg_str, FUNC_NAME, \
|
|
|
|
(ARRAY)[i].arg1, (ARRAY)[i].arg2, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_b(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_bool (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_b(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_b ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_b_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED, \
|
|
|
|
EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_bool (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_b_tg(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_b_tg ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_l(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_long (test_name, FUNC_TEST (FUNC_NAME) (ARG), EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_l(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_l ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_f_L(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
check_longlong (test_name, FUNC_TEST (FUNC_NAME) (ARG), \
|
|
|
|
EXPECTED, EXCEPTIONS); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_f_L(FUNC_NAME, ARRAY, ROUNDING_MODE) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_f_L ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.expected, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
#define RUN_TEST_fFF_11(ARG_STR, FUNC_NAME, ARG, EXCEPTIONS, \
|
|
|
|
EXTRA1_VAR, EXTRA1_TEST, \
|
|
|
|
EXTRA1_EXPECTED, EXTRA2_VAR, \
|
|
|
|
EXTRA2_TEST, EXTRA2_EXPECTED) \
|
|
|
|
do \
|
|
|
|
if (enable_test (EXCEPTIONS)) \
|
|
|
|
{ \
|
|
|
|
COMMON_TEST_SETUP (ARG_STR); \
|
|
|
|
FUNC_TEST (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR)); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1); \
|
|
|
|
if (EXTRA1_TEST) \
|
|
|
|
check_float (extra1_name, EXTRA1_VAR, EXTRA1_EXPECTED, \
|
|
|
|
EXCEPTIONS); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (1); \
|
|
|
|
EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 2); \
|
|
|
|
if (EXTRA2_TEST) \
|
|
|
|
check_float (extra2_name, EXTRA2_VAR, EXTRA2_EXPECTED, 0); \
|
|
|
|
EXTRA_OUTPUT_TEST_CLEANUP (2); \
|
|
|
|
COMMON_TEST_CLEANUP; \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
#define RUN_TEST_LOOP_fFF_11(FUNC_NAME, ARRAY, ROUNDING_MODE, \
|
|
|
|
EXTRA1_VAR, EXTRA2_VAR) \
|
|
|
|
IF_ROUND_INIT_ ## ROUNDING_MODE \
|
|
|
|
for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \
|
|
|
|
RUN_TEST_fFF_11 ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.exceptions, \
|
|
|
|
EXTRA1_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra1_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra1_expected, \
|
|
|
|
EXTRA2_VAR, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra2_test, \
|
|
|
|
(ARRAY)[i].RM_##ROUNDING_MODE.extra2_expected); \
|
|
|
|
ROUND_RESTORE_ ## ROUNDING_MODE
|
|
|
|
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#if TEST_MATHVEC
|
|
|
|
# define TEST_SUFF VEC_SUFF
|
|
|
|
# define TEST_SUFF_STR
|
|
|
|
#elif TEST_NARROW
|
|
|
|
# define TEST_SUFF
|
|
|
|
# define TEST_SUFF_STR "_" ARG_TYPE_STR
|
|
|
|
#else
|
|
|
|
# define TEST_SUFF
|
|
|
|
# define TEST_SUFF_STR
|
2017-02-07 02:12:16 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define STR_CONCAT(a, b, c) __STRING (a##b##c)
|
|
|
|
#define STR_CON3(a, b, c) STR_CONCAT (a, b, c)
|
|
|
|
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
#if TEST_NARROW
|
|
|
|
# define TEST_COND_any_ibm128 (TEST_COND_ibm128 || TEST_COND_arg_ibm128)
|
|
|
|
#else
|
|
|
|
# define TEST_COND_any_ibm128 TEST_COND_ibm128
|
|
|
|
#endif
|
|
|
|
|
2017-02-07 02:12:16 +08:00
|
|
|
/* Start and end the tests for a given function. */
|
|
|
|
#define START(FUN, SUFF, EXACT) \
|
|
|
|
CHECK_ARCH_EXT; \
|
Add test infrastructure for narrowing libm functions.
This patch continues preparations for adding TS 18661-1 narrowing libm
functions by adding the required testsuite infrastructure to test such
functions through the libm-test infrastructure.
That infrastructure is based around testing for a single type, FLOAT.
For the narrowing functions, FLOAT, the "main" type for testing, is
the function return type; the argument type is ARG_FLOAT. This is
consistent with how the code built once for each type,
libm-test-support.c, depends on FLOAT for such things as calculating
ulps errors in results but can already handle different argument types
(pointers, integers, long double for nexttoward).
Makefile machinery is added to handle building tests for all pairs of
types for which there are narrowing functions (as with non-narrowing
functions, aliases are tested just the same as the functions they
alias). gen-auto-libm-tests gains a --narrow option for building
outputs for narrowing functions (so narrowing sqrt and fma will share
the same inputs as non-narrowing, but gen-auto-libm-tests will be run
with and without that option to generate different output files). In
the narrowing case, the auto-libm-test-out-narrow-* files include
annotations for each test about what properties ARG_FLOAT must have to
be able to represent all the inputs for that test; those annotations
result in calls to the TEST_COND_arg_fmt macro.
gen-libm-test.pl has some minor updates to handle narrowing tests (for
example, arguments in such tests must be surrounded by ARG_LIT calls
instead of LIT calls). Various new macros are added to the C test
support code (for example, sNaN initializers need to be properly
typed, so arg_snan_value is added; other such arg_* macros are added
as it seems cleanest to do so, though some are not strictly required).
Special-casing of the ibm128 format to allow for its limitations is
adjusted to handle it as the argument format as well as as the result
format; thus, the tests of the new functions allow nonzero ulps only
in the case where ibm128 is the argument format, as otherwise the
functions correspond to fully-defined IEEE operations. The ulps in
question appear as e.g. 'Function: "add_ldouble"' in libm-test-ulps
(with 1ulp errors then listed for double and float for that function
in powerpc); no support is added to generate corresponding faddl /
daddl ulps listings in the ulps table in the manual.
For the previous patch, I noted the need to avoid spurious macro
expansions of identifiers such as "add". A test test-narrow-macros.c
is added to verify such macro expansions are successfully avoided, and
there is also a -mlong-double-64 version of that test for ldbl-opt.
This test is set up to cover the full set of relevant identifiers from
the start rather than adding functions one at a time as each function
group is added.
Tested for x86_64 (this patch in isolation, as well as testing for
various configurations in conjunction with the actual addition of
"add" functions).
* math/Makefile (test-type-pairs): New variable.
(test-type-pairs-f64xf128-yes): Likewise.
(tests): Add test-narrow-macros.
(libm-test-funcs-narrow): New variable.
(libm-test-c-narrow): Likewise.
(generated): Add $(libm-test-c-narrow).
(libm-tests-base-narrow): New variable.
(libm-tests-narrow): Likewise.
(libm-tests): Add $(libm-tests-narrow).
(libm-tests-for-type): Handle $(libm-tests-narrow).
(libm-test-c-narrow-obj): New variable.
($(libm-test-c-narrow-obj)): New rule.
($(foreach t,$(libm-tests-narrow),$(objpfx)$(t).c)): Likewise.
($(foreach f,$(libm-test-funcs-narrow),$(objpfx)$(o)-$(f).o)): Use
$(o-iterator) to set dependencies and CFLAGS.
* math/gen-auto-libm-tests.c: Document use for narrowing
functions.
(output_for_one_input_case): Take argument NARROW.
(generate_output): Likewise. Update call to
output_for_one_input_case.
(main): Take --narrow option. Update call to generate_output.
* math/gen-libm-test.pl (_apply_lit): Take macro name as argument.
(apply_lit): Update call to _apply_lit.
(apply_arglit): New function.
(parse_args): Handle "a" arguments.
(parse_auto_input): Handle format names using ":".
* math/README.libm-test: Document "a" parameter type.
* math/libm-test-support.h (ARG_TYPE_MIN): New macro.
(ARG_TYPE_TRUE_MIN): Likewise.
(ARG_TYPE_MAX): Likwise.
(ARG_MIN_EXP): Likewise.
(ARG_MAX_EXP): Likewise.
(ARG_MANT_DIG): Likewise.
(TEST_COND_arg_ibm128): Likewise.
(TEST_COND_ibm128_libgcc): Define conditional on [ARG_FLOAT].
(TEST_COND_arg_fmt): New macro.
(init_max_error): Update prototype.
* math/libm-test-support.c (test_ibm128): New variable.
(init_max_error): Take argument testing_ibm128 and set test_ibm128
instead of using [TEST_COND_ibm128] conditional.
(test_exceptions): Use test_ibm128 instead of TEST_COND_ibm128.
* math/libm-test-driver.c (STR_ARG_FLOAT): New macro.
[TEST_NARROW] (TEST_MSG): New definition.
(arg_plus_zero): New macro.
(arg_minus_zero): Likewise.
(arg_plus_infty): Likewise.
(arg_minus_infty): Likewise.
(arg_qnan_value_pl): Likewise.
(arg_qnan_value): Likewise.
(arg_snan_value_pl): Likewise.
(arg_snan_value): Likewise.
(arg_max_value): Likewise.
(arg_min_value): Likewise.
(arg_min_subnorm_value): Likewise.
[ARG_FLOAT] (struct test_aa_f_data): New struct type.
(RUN_TEST_LOOP_aa_f): New macro.
(TEST_SUFF): New macro.
(TEST_SUFF_STR): Likewise.
[!TEST_MATHVEC] (VEC_SUFF): Don't define.
(TEST_COND_any_ibm128): New macro.
(START): Use TEST_SUFF and TEST_SUFF_STR in initializer for
this_func. Update call to init_max_error.
* math/test-double.h (FUNC_NARROW_PREFIX): New macro.
* math/test-float.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float128.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float32x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-float64x.h (FUNC_NARROW_PREFIX): Likewise.
* math/test-math-scalar.h (TEST_NARROW): Likewise.
* math/test-math-vector.h (TEST_NARROW): Likewise.
* math/test-arg-double.h: New file.
* math/test-arg-float128.h: Likewise.
* math/test-arg-float32x.h: Likewise.
* math/test-arg-float64.h: Likewise.
* math/test-arg-float64x.h: Likewise.
* math/test-arg-ldouble.h: Likewise.
* math/test-math-narrow.h: Likewise.
* math/test-narrow-macros.c: Likewise.
* sysdeps/ieee754/ldbl-opt/test-narrow-macros-ldbl-64.c: Likewise.
* sysdeps/ieee754/ldbl-opt/Makefile (tests): Add
test-narrow-macros-ldbl-64.
(CFLAGS-test-narrow-macros-ldbl-64.c): New variable.
2018-02-10 05:55:48 +08:00
|
|
|
const char *this_func \
|
|
|
|
= STR_CON3 (FUN, SUFF, TEST_SUFF) TEST_SUFF_STR; \
|
|
|
|
init_max_error (this_func, EXACT, TEST_COND_any_ibm128)
|
2017-02-07 02:12:16 +08:00
|
|
|
#define END \
|
|
|
|
print_max_error (this_func)
|
|
|
|
#define END_COMPLEX \
|
|
|
|
print_complex_max_error (this_func)
|
|
|
|
|
|
|
|
/* Run tests for a given function in all rounding modes. */
|
|
|
|
#define ALL_RM_TEST(FUNC, EXACT, ARRAY, LOOP_MACRO, END_MACRO, ...) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
START (FUNC,, EXACT); \
|
|
|
|
LOOP_MACRO (FUNC, ARRAY, , ## __VA_ARGS__); \
|
|
|
|
END_MACRO; \
|
|
|
|
} \
|
|
|
|
while (0); \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
START (FUNC, _downward, EXACT); \
|
|
|
|
LOOP_MACRO (FUNC, ARRAY, FE_DOWNWARD, ## __VA_ARGS__); \
|
|
|
|
END_MACRO; \
|
|
|
|
} \
|
|
|
|
while (0); \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
START (FUNC, _towardzero, EXACT); \
|
|
|
|
LOOP_MACRO (FUNC, ARRAY, FE_TOWARDZERO, ## __VA_ARGS__); \
|
|
|
|
END_MACRO; \
|
|
|
|
} \
|
|
|
|
while (0); \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
START (FUNC, _upward, EXACT); \
|
|
|
|
LOOP_MACRO (FUNC, ARRAY, FE_UPWARD, ## __VA_ARGS__); \
|
|
|
|
END_MACRO; \
|
|
|
|
} \
|
|
|
|
while (0); \
|
|
|
|
} \
|
|
|
|
while (0);
|
|
|
|
|
|
|
|
/* Short description of program. */
|
Build most libm-test support code once per type.
libm-test-driver.c contains various functions used in the course of
libm testing, which are built as part of each test using this
machinery.
Currently, these functions get built for three tests for each type
(e.g. test-float, test-ifloat, test-float-finite), plus the vector
function tests. All these tests are huge and thus slow to build; the
output of gen-libm-test.pl totals around 40 MB across all functions.
To make the individual tests built from the Makefile smaller, it makes
sense to split these tests up so the tests for each function are built
separately (thus, three tests for each (function, type) pair, plus
vector tests built only for functions that actually have vector
versions). This improves parallelism and means that if tests fail,
the summary of failed tests makes it more obvious where the problem
might be without needing to look in the .out files to see which
functions' tests failed (though architecture maintainers still need to
keep libm-test-ulps up to date to avoid spurious failures of little
interest).
Simply including libm-test-driver.c as-is in such individual-function
tests does not work because of unused static check_* functions (those
functions only being used for the types of the outputs of the function
under test). It also means the common code gets built over 1000 times
instead of nine (plus vector tests). To avoid that issue, this patch
splits out the bulk of the libm-test-driver.c code into a separate
file libm-test-support.c (with a few functions made non-static). That
separate file is built only once for each floating-point type (so at
present three times, or twice on architectures with long double =
double). Definitions needed in both libm-test-support.c and
libm-test-driver.c go in libm-test-support.h (it's possible some of
those are in fact only needed in one of the two files).
libm-test-driver.c keeps definitions of a limited number of variables
used to configure how libm-test-support.c behaves, various macros and
structures needed by individual-function tests, and the main function.
This move is also consistent in spirit with the move away from
test-skeleton.c having all the test support code, to a small
support/test-driver.c included in individual tests with most of the
code built separately.
Tested for x86_64 and x86.
* math/libm-test-support.c: New file. Content from
math/libm-test-driver.c.
* math/libm-test-support.h: Likewise.
* math/libm-test-support-double.c: New file.
* math/libm-test-support-float.c: Likewise.
* math/libm-test-support-ldouble.c: Likewise.
* math/libm-test-driver.c: Remove main comment and header
includes. Include libm-test-support.h.
[!_GNU_SOURCE] (_GNU_SOURCE): Do not define.
(flag_test_errno): Remove static.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(NO_EXCEPTION): Remove.
(INVALID_EXCEPTION): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION): Likewise.
(OVERFLOW_EXCEPTION): Likewise.
(UNDERFLOW_EXCEPTION): Likewise.
(INEXACT_EXCEPTION): Likewise.
(INVALID_EXCEPTION_OK): Likewise.
(DIVIDE_BY_ZERO_EXCEPTION_OK): Likewise.
(OVERFLOW_EXCEPTION_OK): Likewise.
(UNDERFLOW_EXCEPTION_OK): Likewise.
(NO_INEXACT_EXCEPTION): Likewise.
(EXCEPTIONS_OK): Likewise.
(IGNORE_ZERO_INF_SIGN): Likewise.
(TEST_NAN_SIGN): Likewise.
(TEST_NAN_PAYLOAD): Likewise.
(NO_TEST_INLINE): Likewise.
(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.
(__CONCATX): Likewise.
(TYPE_MIN): Likewise.
(TYPE_TRUE_MIN): Likewise.
(TYPE_MAX): Likewise.
(MIN_EXP): Likewise.
(MAX_EXP): Likewise.
(MANT_DIG): Likewise.
(FSTR_MAX): Likewise.
(ulp_idx): Likewise.
(qtype_str): Remove static.
(TEST_COND_binary32): Remove.
(TEST_COND_binary64): Likewise.
(TEST_COND_binary128): Likewise.
(TEST_COND_ibm128): Likewise.
(TEST_COND_intel96): Likewise.
(TEST_COND_m68k96): Likewise.
(TEST_COND_ibm128_libgcc): Likewise.
(XFAIL_IBM128_LIBGCC): Likewise.
(PAYLOAD_DIG): Likewise.
(UNDERFLOW_EXCEPTION_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_OK_FLOAT): Likewise.
(UNDERFLOW_EXCEPTION_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_OK_DOUBLE): Likewise.
(UNDERFLOW_EXCEPTION_LDOUBLE_IBM): Likewise.
(UNDERFLOW_EXCEPTION_BEFORE_ROUNDING): Likewise.
(TEST_COND_long32): Likewise.
(TEST_COND_long64): Likewise.
(TEST_COND_before_rounding): Likewise.
(TEST_COND_after_rounding): Likewise.
(ulps_file_name): Likewise.
(ulps_file): Likewise.
(output_ulps): Likewise.
(output_dir): Likewise.
(noErrors): Likewise.
(noTests): Likewise.
(noExcTests): Likewise.
(noErrnoTests): Likewise.
(verbose): Likewise.
(output_max_error): Likewise.
(output_points): Likewise.
(ignore_max_ulp): Likewise.
(max_error): Likewise.
(real_max_error): Likewise.
(imag_max_error): Likewise.
(prev_max_error): Likewise.
(prev_real_max_error): Likewise.
(prev_imag_max_error): Likewise.
(max_valid_error): Likewise.
(TYPE_DECIMAL_DIG): Likewise.
(TYPE_HEX_DIG): Likewise.
(fmt_ftostr): Likewise.
(compare_ulp_data): Likewise.
(find_ulps): Likewise.
(init_max_error): Likewise.
(set_max_error): Likewise.
(print_float): Likewise.
(print_screen): Likewise.
(print_screen_max_error): Likewise.
(update_stats): Likewise.
(print_function_ulps): Likewise.
(print_complex_function_ulps): Likewise.
(fpstack_test): Likewise.
(print_max_error): Likewise.
(print_complex_max_error): Likewise.
(test_single_exception): Likewise.
(test_exceptions): Likewise.
(test_single_errno): Likewise.
(test_errno): Likewise.
(ULPDIFF): Likewise.
(ulp): Likewise.
(check_float_internal): Likewise.
(check_float): Likewise.
(check_complex): Likewise.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.
(enable_test): Likewise.
(matherr): Likewise.
(initialize): Likewise.
(options): Likewise.
(doc): Remove static.
(argp): Likewise.
(parse_opt): Remove.
(check_ulp): Likewise.
(libm_test_init): Likewise.
(libm_test_finish): Likewise.
* math/Makefile (libm-test-support): New variable.
(test-extras): Add libm-test-support files.
(extra-test-objs): Likewise.
(CFLAGS-libm-test-support-float.c): New variable.
(CFLAGS-libm-test-support-double.c): Likewise.
(CFLAGS-libm-test-support-ldouble.c): Likewise.
($(addprefix $(objpfx),$(libm-tests)): Depend on appropriate
libm-test-support objects.
2017-02-09 05:11:49 +08:00
|
|
|
const char doc[] = "Math test suite: " TEST_MSG ;
|
2017-02-07 02:12:16 +08:00
|
|
|
|
|
|
|
static void do_test (void);
|
|
|
|
|
Refactor some code in libm-test-driver.c.
Splitting libm tests by function will mean about a thousand such tests
built separately instead of the present nine (plus vector variants).
When this is done, it's desirable to avoid needing to build all the
test infrastructure so many times. Also, simply including
libm-test-driver.c as-is into per-function tests doesn't actually
work, because the various check_* functions are not used by all tests
and so generate errors for unused static functions.
Although some pieces of infrastructure depend on the type being tested
while others don't, building once per type seems the simplest
approach. This patch makes changes to libm-test-driver.c in
preparation for that. Various cases where functions directly use
macros such as TEST_ERRNO (that may vary depending on things other
than the type under test) are changed to use variables initialized
using those macros, while most of the code in main is moved out to
functions libm_test_init and libm_test_fini.
The idea is that all the functions in libm-test-driver.c will be moved
out in a subsequent patch to be built once per type (and be no longer
static when they are used from per-function tests), while
libm-test-driver.c remains containing definitions of various variables
(no longer static, of course, because they'll be used in the per-type
code) and the main function. Declarations / macros relevant to both
the once-per-type code and the per-function tests will go in a shared
header.
Tested for x86_64.
* math/libm-test-driver.c (flag_test_errno): New variable.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(ulp_idx): Likewise.
(qtype_str): Likewise.
(ULP_IDX): Remove macro.
(QTYPE_STR): Likewise.
(find_ulps): Use ulp_idx not ULP_IDX.
(print_function_ulps): Use qtype_str, printed with %s, not
QTYPE_STR, printed with concatentation to format string.
(print_complex_function_ulps): Likewise.
(test_exceptions): Use flag_test_exceptions not TEST_EXCEPTIONS.
(test_errno): Use flag_test_errno not TEST_ERRNO.
(enable_test): Use flag_test_inline, flag_test_finite and
flag_test_mathvec instead of TEST_INLINE, TEST_FINITE and
TEST_MATHVEC.
(libm_test_init): New function. Factored out of main.
(libm_test_finish): Likewise.
(main): Call libm_test_init and libm_test_finish and move most
code to those functions.
2017-02-07 07:23:54 +08:00
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
{
|
|
|
|
libm_test_init (argc, argv);
|
2017-02-14 08:15:48 +08:00
|
|
|
INIT_ARCH_EXT;
|
Refactor some code in libm-test-driver.c.
Splitting libm tests by function will mean about a thousand such tests
built separately instead of the present nine (plus vector variants).
When this is done, it's desirable to avoid needing to build all the
test infrastructure so many times. Also, simply including
libm-test-driver.c as-is into per-function tests doesn't actually
work, because the various check_* functions are not used by all tests
and so generate errors for unused static functions.
Although some pieces of infrastructure depend on the type being tested
while others don't, building once per type seems the simplest
approach. This patch makes changes to libm-test-driver.c in
preparation for that. Various cases where functions directly use
macros such as TEST_ERRNO (that may vary depending on things other
than the type under test) are changed to use variables initialized
using those macros, while most of the code in main is moved out to
functions libm_test_init and libm_test_fini.
The idea is that all the functions in libm-test-driver.c will be moved
out in a subsequent patch to be built once per type (and be no longer
static when they are used from per-function tests), while
libm-test-driver.c remains containing definitions of various variables
(no longer static, of course, because they'll be used in the per-type
code) and the main function. Declarations / macros relevant to both
the once-per-type code and the per-function tests will go in a shared
header.
Tested for x86_64.
* math/libm-test-driver.c (flag_test_errno): New variable.
(flag_test_exceptions): Likewise.
(flag_test_finite): Likewise.
(flag_test_inline): Likewise.
(flag_test_mathvec): Likewise.
(test_msg): Likewise.
(ulp_idx): Likewise.
(qtype_str): Likewise.
(ULP_IDX): Remove macro.
(QTYPE_STR): Likewise.
(find_ulps): Use ulp_idx not ULP_IDX.
(print_function_ulps): Use qtype_str, printed with %s, not
QTYPE_STR, printed with concatentation to format string.
(print_complex_function_ulps): Likewise.
(test_exceptions): Use flag_test_exceptions not TEST_EXCEPTIONS.
(test_errno): Use flag_test_errno not TEST_ERRNO.
(enable_test): Use flag_test_inline, flag_test_finite and
flag_test_mathvec instead of TEST_INLINE, TEST_FINITE and
TEST_MATHVEC.
(libm_test_init): New function. Factored out of main.
(libm_test_finish): Likewise.
(main): Call libm_test_init and libm_test_finish and move most
code to those functions.
2017-02-07 07:23:54 +08:00
|
|
|
do_test ();
|
|
|
|
return libm_test_finish ();
|
|
|
|
}
|