diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-12-27 16:39:27 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-12-27 16:39:27 +0000 |
commit | 52629237a522c7c146d788ddaaf69946fd2729f9 (patch) | |
tree | 552402b085cff37bc251fc0f45ed9255b53cdd57 /math/libm-test-support.h | |
parent | 3896c5809b49e72fbadc57da2189ff42aa2a5d02 (diff) | |
parent | 064374be911f72dfaec8a75f06da1f9fc1827712 (diff) |
Merge commit 'refs/top-bases/t/hurdsig-boot-fix' into t/hurdsig-boot-fix
Diffstat (limited to 'math/libm-test-support.h')
-rw-r--r-- | math/libm-test-support.h | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/math/libm-test-support.h b/math/libm-test-support.h new file mode 100644 index 0000000000..42637741ab --- /dev/null +++ b/math/libm-test-support.h @@ -0,0 +1,190 @@ +/* Support code for testing libm functions (common declarations). + Copyright (C) 1997-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef LIBM_TEST_SUPPORT_H +#define LIBM_TEST_SUPPORT_H 1 + +#include <complex.h> +#include <math.h> +#include <float.h> +#include <fenv.h> +#include <limits.h> + +#include <stdlib.h> +#include <stdint.h> +#include <stdio.h> +#include <tininess.h> +#include <math-tests.h> +#include <nan-high-order-bit.h> + +extern const int flag_test_errno; +extern const int flag_test_exceptions; +extern const int flag_test_finite; +extern const int flag_test_inline; +extern const int flag_test_mathvec; +extern const int snan_tests_arg; +extern const char test_msg[]; +extern const char qtype_str[]; +extern const char doc[]; + +/* Possible exceptions */ +#define NO_EXCEPTION 0x0 +#define INVALID_EXCEPTION 0x1 +#define DIVIDE_BY_ZERO_EXCEPTION 0x2 +#define OVERFLOW_EXCEPTION 0x4 +#define UNDERFLOW_EXCEPTION 0x8 +#define INEXACT_EXCEPTION 0x10 +/* The next flags signals that those exceptions are allowed but not required. */ +#define INVALID_EXCEPTION_OK 0x20 +#define DIVIDE_BY_ZERO_EXCEPTION_OK 0x40 +#define OVERFLOW_EXCEPTION_OK 0x80 +#define UNDERFLOW_EXCEPTION_OK 0x100 +/* For "inexact" exceptions, the default is allowed but not required + unless INEXACT_EXCEPTION or NO_INEXACT_EXCEPTION is specified. */ +#define NO_INEXACT_EXCEPTION 0x200 +/* Some special test flags, passed together with exceptions. */ +#define IGNORE_ZERO_INF_SIGN 0x400 +#define TEST_NAN_SIGN 0x800 +#define TEST_NAN_PAYLOAD 0x1000 +#define NO_TEST_INLINE 0x2000 +#define XFAIL_TEST 0x4000 +/* Indicate errno settings required or disallowed. */ +#define ERRNO_UNCHANGED 0x8000 +#define ERRNO_EDOM 0x10000 +#define ERRNO_ERANGE 0x20000 +/* Flags generated by gen-libm-test.pl, not entered here manually. */ +#define IGNORE_RESULT 0x40000 +#define NON_FINITE 0x80000 +#define TEST_SNAN 0x100000 +#define NO_TEST_MATHVEC 0x200000 + +#define __CONCATX(a,b) __CONCAT(a,b) + +#define TYPE_MIN __CONCATX (PREFIX, _MIN) +#define TYPE_TRUE_MIN __CONCATX (PREFIX, _TRUE_MIN) +#define TYPE_MAX __CONCATX (PREFIX, _MAX) +#define MIN_EXP __CONCATX (PREFIX, _MIN_EXP) +#define MAX_EXP __CONCATX (PREFIX, _MAX_EXP) +#define MANT_DIG __CONCATX (PREFIX, _MANT_DIG) + +#define ARG_TYPE_MIN __CONCATX (ARG_PREFIX, _MIN) +#define ARG_TYPE_TRUE_MIN __CONCATX (ARG_PREFIX, _TRUE_MIN) +#define ARG_TYPE_MAX __CONCATX (ARG_PREFIX, _MAX) +#define ARG_MIN_EXP __CONCATX (ARG_PREFIX, _MIN_EXP) +#define ARG_MAX_EXP __CONCATX (ARG_PREFIX, _MAX_EXP) +#define ARG_MANT_DIG __CONCATX (ARG_PREFIX, _MANT_DIG) + +/* Format specific test macros. */ +#define TEST_COND_binary32 (MANT_DIG == 24 \ + && MIN_EXP == -125 \ + && MAX_EXP == 128) + +#define TEST_COND_binary64 (MANT_DIG == 53 \ + && MIN_EXP == -1021 \ + && MAX_EXP == 1024) + +#define TEST_COND_binary128 (MANT_DIG == 113 \ + && MIN_EXP == -16381 \ + && MAX_EXP == 16384) + +#define TEST_COND_ibm128 (MANT_DIG == 106) + +#define TEST_COND_arg_ibm128 (ARG_MANT_DIG == 106) + +#define TEST_COND_intel96 (MANT_DIG == 64 \ + && MIN_EXP == -16381 \ + && MAX_EXP == 16384) + +#define TEST_COND_m68k96 (MANT_DIG == 64 \ + && MIN_EXP == -16382 \ + && MAX_EXP == 16384) + +/* The condition ibm128-libgcc is used instead of ibm128 to mark tests + where in principle the glibc code is OK but the tests fail because + of limitations of the libgcc support for that format (e.g. GCC bug + 59666, in non-default rounding modes). */ +#ifdef ARG_FLOAT +# define TEST_COND_ibm128_libgcc (TEST_COND_ibm128 || TEST_COND_arg_ibm128) +#else +# define TEST_COND_ibm128_libgcc TEST_COND_ibm128 +#endif + +/* Mark a test as expected to fail for ibm128-libgcc. This is used + via XFAIL_ROUNDING_IBM128_LIBGCC, which gen-libm-test.pl transforms + appropriately for each rounding mode. */ +#define XFAIL_IBM128_LIBGCC (TEST_COND_ibm128_libgcc ? XFAIL_TEST : 0) + +/* On some architectures, glibc can be built with compilers that do + not have suitable built-in functions for setting the payload of a + _Float128 NaN. */ +#if ((defined __x86_64__ || defined __i386__ || defined __ia64__) \ + && !__GNUC_PREREQ (7, 0)) +# define XFAIL_FLOAT128_PAYLOAD (TEST_COND_binary128 ? XFAIL_TEST : 0) +#else +# define XFAIL_FLOAT128_PAYLOAD 0 +#endif + +/* Number of bits in NaN payload. */ +#if TEST_COND_ibm128 +# define PAYLOAD_DIG (DBL_MANT_DIG - 2) +#else +# define PAYLOAD_DIG (MANT_DIG - 2) +#endif + +/* For narrowing functions, whether the argument format can represent + all the given argument values. */ +#define TEST_COND_arg_fmt(MAX_EXP, NUM_ONES, MIN_EXP, MAX_PREC) \ + (((MAX_EXP) < ARG_MAX_EXP) \ + && (!TEST_COND_arg_ibm128 \ + || (MAX_EXP) < ARG_MAX_EXP - 1 \ + || (NUM_ONES) <= 53) \ + && (MIN_EXP) >= ARG_MIN_EXP - ARG_MANT_DIG \ + && (MAX_PREC) <= ARG_MANT_DIG) + +/* Values underflowing on architectures detecting tininess before + rounding, but not on those detecting tininess after rounding. */ +#define UNDERFLOW_EXCEPTION_BEFORE_ROUNDING (TININESS_AFTER_ROUNDING \ + ? 0 \ + : UNDERFLOW_EXCEPTION) + +#if LONG_MAX == 0x7fffffff +# define TEST_COND_long32 1 +# define TEST_COND_long64 0 +#else +# define TEST_COND_long32 0 +# define TEST_COND_long64 1 +#endif +#define TEST_COND_before_rounding (!TININESS_AFTER_ROUNDING) +#define TEST_COND_after_rounding TININESS_AFTER_ROUNDING + +int enable_test (int); +void init_max_error (const char *, int, int); +void print_max_error (const char *); +void print_complex_max_error (const char *); +void check_float (const char *, FLOAT, FLOAT, int); +void check_complex (const char *, CFLOAT, CFLOAT, int); +void check_int (const char *, int, int, int); +void check_long (const char *, long int, long int, int); +void check_bool (const char *, int, int, int); +void check_longlong (const char *, long long int, long long int, int); +void check_intmax_t (const char *, intmax_t, intmax_t, int); +void check_uintmax_t (const char *, uintmax_t, uintmax_t, int); +void libm_test_init (int, char **); +int libm_test_finish (void); + +#endif /* LIBM_TEST_SUPPORT_H. */ |