mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-14 23:30:06 +00:00
189 lines
6.5 KiB
C
189 lines
6.5 KiB
C
/* Support code for testing libm functions (common declarations).
|
|
Copyright (C) 1997-2020 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
|
|
<https://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_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.py, not entered here manually. */
|
|
#define IGNORE_RESULT 0x40000
|
|
#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.py 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. */
|