summaryrefslogtreecommitdiff
path: root/math/libm-test-support.h
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-12-27 16:39:27 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-12-27 16:39:27 +0000
commit52629237a522c7c146d788ddaaf69946fd2729f9 (patch)
tree552402b085cff37bc251fc0f45ed9255b53cdd57 /math/libm-test-support.h
parent3896c5809b49e72fbadc57da2189ff42aa2a5d02 (diff)
parent064374be911f72dfaec8a75f06da1f9fc1827712 (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.h190
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. */