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-08 21:11:49 +00:00
|
|
|
/* Support code for testing libm functions (driver).
|
2018-01-01 00:32:25 +00:00
|
|
|
Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
2017-02-06 18:12:16 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
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-08 21:11:49 +00:00
|
|
|
#include "libm-test-support.h"
|
2017-02-06 18:12:16 +00:00
|
|
|
|
2017-02-14 00:15:48 +00: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-06 23:23:54 +00: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-08 21:11:49 +00:00
|
|
|
const int flag_test_errno = TEST_ERRNO;
|
|
|
|
const int flag_test_exceptions = TEST_EXCEPTIONS;
|
|
|
|
const int flag_test_finite = TEST_FINITE;
|
|
|
|
const int flag_test_inline = TEST_INLINE;
|
|
|
|
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-06 23:23:54 +00:00
|
|
|
|
2018-02-09 22:56:35 +00: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-06 23:07:22 +00: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-09 21:55:48 +00:00
|
|
|
#define STR_ARG_FLOAT STR (ARG_FLOAT)
|
2017-02-06 23:07:22 +00: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"
|
|
|
|
#elif TEST_INLINE
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (inline functions)\n"
|
|
|
|
#elif TEST_FINITE
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (finite-math-only)\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-09 21:55:48 +00:00
|
|
|
#elif TEST_NARROW
|
|
|
|
# define TEST_MSG "testing " STR_FLOAT " (argument " STR_ARG_FLOAT ")\n"
|
2017-02-06 23:07:22 +00: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-08 21:11:49 +00:00
|
|
|
const char test_msg[] = TEST_MSG;
|
2017-02-06 23:07:22 +00:00
|
|
|
|
2017-02-06 18:12:16 +00: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)
|
|
|
|
|
|
|
|
#if TEST_INLINE
|
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-08 21:11:49 +00:00
|
|
|
const char qtype_str[] = "i" TYPE_STR;
|
2017-02-06 18:12:16 +00:00
|
|
|
#else
|
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-08 21:11:49 +00:00
|
|
|
const char qtype_str[] = TYPE_STR;
|
2017-02-06 18:12:16 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* 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-09 21:55:48 +00: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-06 18:12:16 +00:00
|
|
|
/* For nexttoward tests. */
|
|
|
|
#define snan_value_ld __builtin_nansl ("")
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
};
|
|
|
|
/* Strictly speaking, a j type argument is one gen-libm-test.pl will not
|
|
|
|
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-09 21:55:48 +00:00
|
|
|
#ifdef ARG_FLOAT
|
|
|
|
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-06 18:12:16 +00: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;
|
|
|
|
};
|
|
|
|
/* Used for both RUN_TEST_LOOP_ff_b and RUN_TEST_LOOP_ff_i_tg. */
|
|
|
|
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) \
|
|
|
|
&& 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) \
|
|
|
|
&& fesetround (FE_TOWARDZERO) == 0)
|
|
|
|
#define IF_ROUND_INIT_FE_UPWARD \
|
|
|
|
int save_round_mode = fegetround (); \
|
|
|
|
if (ROUNDING_TESTS (FLOAT, FE_UPWARD) \
|
|
|
|
&& 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. */
|
|
|
|
#define RUN_TEST_f_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_f_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_f_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_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-09 21:55:48 +00:00
|
|
|
#define RUN_TEST_LOOP_aa_f RUN_TEST_LOOP_2_f
|
2017-02-06 18:12:16 +00: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
|
|
|
|
#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
|
|
|
|
#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-09 21:55:48 +00: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-06 18:12:16 +00: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-09 21:55:48 +00: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-06 18:12:16 +00: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-09 21:55:48 +00: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-06 18:12:16 +00: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-08 21:11:49 +00:00
|
|
|
const char doc[] = "Math test suite: " TEST_MSG ;
|
2017-02-06 18:12:16 +00: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-06 23:23:54 +00:00
|
|
|
int
|
|
|
|
main (int argc, char **argv)
|
|
|
|
{
|
|
|
|
libm_test_init (argc, argv);
|
2017-02-14 00:15:48 +00: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-06 23:23:54 +00:00
|
|
|
do_test ();
|
|
|
|
return libm_test_finish ();
|
|
|
|
}
|