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).
|
2017-02-06 18:12:16 +00:00
|
|
|
Copyright (C) 1997-2017 Free Software Foundation, Inc.
|
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with the GNU C Library; if not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
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
|
|
|
|
2017-02-06 23:07:22 +00:00
|
|
|
#define STRX(x) #x
|
|
|
|
#define STR(x) STRX (x)
|
|
|
|
#define STR_FLOAT STR (FLOAT)
|
|
|
|
#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"
|
|
|
|
#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
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
};
|
|
|
|
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
|
|
|
|
#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
|
|
|
|
|
|
|
|
#if !TEST_MATHVEC
|
|
|
|
# define VEC_SUFF
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define STR_CONCAT(a, b, c) __STRING (a##b##c)
|
|
|
|
#define STR_CON3(a, b, c) STR_CONCAT (a, b, c)
|
|
|
|
|
|
|
|
/* Start and end the tests for a given function. */
|
|
|
|
#define START(FUN, SUFF, EXACT) \
|
|
|
|
CHECK_ARCH_EXT; \
|
|
|
|
const char *this_func = STR_CON3 (FUN, SUFF, VEC_SUFF); \
|
|
|
|
init_max_error (this_func, EXACT)
|
|
|
|
#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 ();
|
|
|
|
}
|