From 3c023dbf5780f5afe8a5ea8e17667719307d955f Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Fri, 15 Jul 2016 14:29:51 -0500 Subject: [PATCH] float128: Add test-{float128,ifloat128,float128-finite} This adds test support for float128, and lays some groundwork for future _FloatN types. * math/gen-libm-test.pl (@all_floats): Add ifloat128 and float128. (%all_floats_pfx): Add macro prefix for float128 (FLT128). * math/libm-test-exp10.inc (pow10_test): Do not test for _FloatN, * math/libm-test-isfinite.inc (finite_test): Likewise. * math/libm-test-lgamma.inc (gamma_test): Likewise. * math/libm-test-nexttoward.inc (nexttoward_test): Likewise. (nexttoward_test_data}: Likewise. * math/libm-test-remainder.inc (drem_test): Likewise. * math/libm-test-scalb.inc (scalb_test): Likewise. (scalb_test_data): Likewise. * math/libm-test-significand.inc (significand_test): Likewise. (significand_test_data): Likewise. * math/libm-test-support.c (check_complex): Replace __complex__ FLOAT with CFLOAT to get the support for old compiler. * math/libm-test-support.h (check_complex): Likewise. * math/test-double.h (CFLOAT, TEST_FLOATN): New macros. * math/test-float.h (CFLOAT, TEST_FLOATN): Likewise. * math/test-ldouble.h (CFLOAT, TEST_FLOATN): Likewise. * math/test-float128.h: New file. * math/test-math-floatn.h: New file. --- ChangeLog | 25 ++++++++++++++++++++++++ math/gen-libm-test.pl | 5 +++-- math/libm-test-exp10.inc | 2 ++ math/libm-test-isfinite.inc | 2 ++ math/libm-test-lgamma.inc | 2 ++ math/libm-test-nexttoward.inc | 4 ++++ math/libm-test-remainder.inc | 2 ++ math/libm-test-scalb.inc | 4 ++++ math/libm-test-significand.inc | 4 ++++ math/libm-test-support.c | 4 ++-- math/libm-test-support.h | 2 +- math/test-double.h | 2 ++ math/test-float.h | 2 ++ math/test-float128.h | 35 ++++++++++++++++++++++++++++++++++ math/test-ldouble.h | 2 ++ math/test-math-floatn.h | 20 +++++++++++++++++++ 16 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 math/test-float128.h create mode 100644 math/test-math-floatn.h diff --git a/ChangeLog b/ChangeLog index 429690e1fc3..c4cfaf64d7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2017-06-12 Paul E. Murphy + Gabriel F. T. Gomes + Tulio Magno Quites Machado Filho + + * math/gen-libm-test.pl (@all_floats): Add ifloat128 and float128. + (%all_floats_pfx): Add macro prefix for float128 (FLT128). + * math/libm-test-exp10.inc (pow10_test): Do not test for _FloatN, + * math/libm-test-isfinite.inc (finite_test): Likewise. + * math/libm-test-lgamma.inc (gamma_test): Likewise. + * math/libm-test-nexttoward.inc (nexttoward_test): Likewise. + (nexttoward_test_data}: Likewise. + * math/libm-test-remainder.inc (drem_test): Likewise. + * math/libm-test-scalb.inc (scalb_test): Likewise. + (scalb_test_data): Likewise. + * math/libm-test-significand.inc (significand_test): Likewise. + (significand_test_data): Likewise. + * math/libm-test-support.c (check_complex): Replace __complex__ + FLOAT with CFLOAT to get the support for old compiler. + * math/libm-test-support.h (check_complex): Likewise. + * math/test-double.h (CFLOAT, TEST_FLOATN): New macros. + * math/test-float.h (CFLOAT, TEST_FLOATN): Likewise. + * math/test-ldouble.h (CFLOAT, TEST_FLOATN): Likewise. + * math/test-float128.h: New file. + * math/test-math-floatn.h: New file. + 2017-06-12 Gabriel F. T. Gomes * include/float.h: Allow the definition of macros prefixed with diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl index a931bc542f1..8baeeb23b6a 100755 --- a/math/gen-libm-test.pl +++ b/math/gen-libm-test.pl @@ -44,14 +44,15 @@ use vars qw ($ulps_file); use vars qw (%auto_tests); # all_floats is sorted and contains all recognised float types -@all_floats = ('double', 'float', 'idouble', - 'ifloat', 'ildouble', 'ldouble'); +@all_floats = ('double', 'float', 'float128', 'idouble', + 'ifloat', 'ifloat128', 'ildouble', 'ldouble'); # all_floats_pfx maps C types to their C like prefix for macros. %all_floats_pfx = ( "double" => "DBL", "ldouble" => "LDBL", "float" => "FLT", + "float128" => "FLT128", ); %beautify = diff --git a/math/libm-test-exp10.inc b/math/libm-test-exp10.inc index 92c81adb7ae..374d12a1936 100644 --- a/math/libm-test-exp10.inc +++ b/math/libm-test-exp10.inc @@ -39,8 +39,10 @@ exp10_test (void) static void pow10_test (void) { +#if !TEST_FLOATN /* pow10 uses the same test data as exp10. */ ALL_RM_TEST (pow10, 0, exp10_test_data, RUN_TEST_LOOP_f_f, END); +#endif } static void diff --git a/math/libm-test-isfinite.inc b/math/libm-test-isfinite.inc index 48d4c2e15b5..0988997f744 100644 --- a/math/libm-test-isfinite.inc +++ b/math/libm-test-isfinite.inc @@ -47,7 +47,9 @@ static void finite_test (void) { /* finite uses the same test data as isfinite. */ +#if !TEST_FLOATN ALL_RM_TEST (finite, 1, isfinite_test_data, RUN_TEST_LOOP_f_b, END); +#endif } static void diff --git a/math/libm-test-lgamma.inc b/math/libm-test-lgamma.inc index 9799aa9aaff..0927dd01220 100644 --- a/math/libm-test-lgamma.inc +++ b/math/libm-test-lgamma.inc @@ -45,8 +45,10 @@ lgamma_test (void) static void gamma_test (void) { +#if !TEST_FLOATN /* gamma uses the same test data as lgamma. */ ALL_RM_TEST (gamma, 0, lgamma_test_data, RUN_TEST_LOOP_f_f1, END, signgam); +#endif } static void diff --git a/math/libm-test-nexttoward.inc b/math/libm-test-nexttoward.inc index f05cf5fe4bf..37a9338ca6c 100644 --- a/math/libm-test-nexttoward.inc +++ b/math/libm-test-nexttoward.inc @@ -20,6 +20,7 @@ static const struct test_fj_f_data nexttoward_test_data[] = { +#if !TEST_FLOATN TEST_fj_f (nexttoward, 0, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_fj_f (nexttoward, minus_zero, 0, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_fj_f (nexttoward, 0, minus_zero, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), @@ -80,6 +81,7 @@ static const struct test_fj_f_data nexttoward_test_data[] = TEST_fj_f (nexttoward, min_subnorm_value, minus_zero, 0, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE), TEST_fj_f (nexttoward, -min_subnorm_value, 0, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE), TEST_fj_f (nexttoward, -min_subnorm_value, minus_zero, minus_zero, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_ERANGE), +#endif #if TEST_COND_binary32 TEST_fj_f (nexttoward, 1.0, 1.1L, 0x1.000002p0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), @@ -153,7 +155,9 @@ static const struct test_fj_f_data nexttoward_test_data[] = static void nexttoward_test (void) { +#if !TEST_FLOATN ALL_RM_TEST (nexttoward, 1, nexttoward_test_data, RUN_TEST_LOOP_fj_f, END); +#endif } static void diff --git a/math/libm-test-remainder.inc b/math/libm-test-remainder.inc index ddeba66dabf..65503c70659 100644 --- a/math/libm-test-remainder.inc +++ b/math/libm-test-remainder.inc @@ -184,8 +184,10 @@ remainder_test (void) static void drem_test (void) { +#if !TEST_FLOATN /* drem uses the same test data as remainder. */ ALL_RM_TEST (drem, 1, remainder_test_data, RUN_TEST_LOOP_ff_f, END); +#endif } static void diff --git a/math/libm-test-scalb.inc b/math/libm-test-scalb.inc index 228a93d3492..b96f767c71f 100644 --- a/math/libm-test-scalb.inc +++ b/math/libm-test-scalb.inc @@ -20,6 +20,7 @@ static const struct test_ff_f_data scalb_test_data[] = { +#if !TEST_FLOATN /* Results in this case are unspecified by POSIX, so, for an otherwise fully-determined function, spurious "inexact" exceptions are OK. */ @@ -144,12 +145,15 @@ static const struct test_ff_f_data scalb_test_data[] = TEST_ff_f (scalb, 0.8L, 4, 12.8L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_ff_f (scalb, -0.854375L, 5, -27.34L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), +#endif }; static void scalb_test (void) { +#if !TEST_FLOATN ALL_RM_TEST (scalb, 1, scalb_test_data, RUN_TEST_LOOP_ff_f, END); +#endif } static void diff --git a/math/libm-test-significand.inc b/math/libm-test-significand.inc index 372c076fae2..5797e97a85b 100644 --- a/math/libm-test-significand.inc +++ b/math/libm-test-significand.inc @@ -20,6 +20,7 @@ static const struct test_f_f_data significand_test_data[] = { +#if !TEST_FLOATN /* significand returns the mantissa of the exponential representation. Tests for infinities, zero and NaNs reflect the implementation (including possibility of "inexact" and @@ -45,12 +46,15 @@ static const struct test_f_f_data significand_test_data[] = TEST_f_f (significand, -6.0, -1.5, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (significand, 8.0, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (significand, -8.0, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), +#endif }; static void significand_test (void) { +#if !TEST_FLOATN ALL_RM_TEST (significand, 1, significand_test_data, RUN_TEST_LOOP_f_f, END); +#endif } static void diff --git a/math/libm-test-support.c b/math/libm-test-support.c index 07b8f25ee98..7612d394d62 100644 --- a/math/libm-test-support.c +++ b/math/libm-test-support.c @@ -732,8 +732,8 @@ check_float (const char *test_name, FLOAT computed, FLOAT expected, void -check_complex (const char *test_name, __complex__ FLOAT computed, - __complex__ FLOAT expected, +check_complex (const char *test_name, CFLOAT computed, + CFLOAT expected, int exception) { FLOAT part_comp, part_exp; diff --git a/math/libm-test-support.h b/math/libm-test-support.h index 0e781442aa3..2cdc5fe8cfa 100644 --- a/math/libm-test-support.h +++ b/math/libm-test-support.h @@ -143,7 +143,7 @@ void init_max_error (const char *, 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 *, __complex__ FLOAT, __complex__ 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); diff --git a/math/test-double.h b/math/test-double.h index bd9be859bbd..3c562e27f57 100644 --- a/math/test-double.h +++ b/math/test-double.h @@ -18,6 +18,7 @@ #define FUNC(function) function #define FLOAT double +#define CFLOAT __complex__ double #define BUILD_COMPLEX(real, imag) (CMPLX ((real), (imag))) #define PREFIX DBL #define LIT(x) (x) @@ -25,3 +26,4 @@ #define LITM(x) x #define FTOSTR strfromd #define snan_value_MACRO SNAN +#define TEST_FLOATN 0 diff --git a/math/test-float.h b/math/test-float.h index a1df187d003..97e98c768a1 100644 --- a/math/test-float.h +++ b/math/test-float.h @@ -18,6 +18,7 @@ #define FUNC(function) function ## f #define FLOAT float +#define CFLOAT __complex__ float #define BUILD_COMPLEX(real, imag) (CMPLXF ((real), (imag))) #define PREFIX FLT #define TYPE_STR "float" @@ -26,3 +27,4 @@ #define LITM(x) x #define FTOSTR strfromf #define snan_value_MACRO SNANF +#define TEST_FLOATN 0 diff --git a/math/test-float128.h b/math/test-float128.h new file mode 100644 index 00000000000..17c5928bf6c --- /dev/null +++ b/math/test-float128.h @@ -0,0 +1,35 @@ +/* Common definitions for libm tests for _Float128. + + Copyright (C) 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 + . */ + +#include "test-math-floatn.h" + +/* Fixup builtins and constants for older compilers. */ +#include +#include + +#define FUNC(function) function ## f128 +#define FLOAT _Float128 +#define CFLOAT __CFLOAT128 +#define BUILD_COMPLEX(real, imag) (CMPLXF128 ((real), (imag))) +#define PREFIX FLT128 +#define TYPE_STR "float128" +#define LIT(x) __f128 (x) +#define LITM(x) x ## f128 +#define FTOSTR strfromf128 +#define snan_value_MACRO SNANF128 diff --git a/math/test-ldouble.h b/math/test-ldouble.h index 4bf2b416dfe..89d49401170 100644 --- a/math/test-ldouble.h +++ b/math/test-ldouble.h @@ -18,6 +18,7 @@ #define FUNC(function) function##l #define FLOAT long double +#define CFLOAT __complex__ long double #define BUILD_COMPLEX(real, imag) (CMPLXL ((real), (imag))) #define PREFIX LDBL #define TYPE_STR "ldouble" @@ -25,3 +26,4 @@ #define LITM(x) x ## l #define FTOSTR strfroml #define snan_value_MACRO SNANL +#define TEST_FLOATN 0 diff --git a/math/test-math-floatn.h b/math/test-math-floatn.h new file mode 100644 index 00000000000..f3ab6dfbbc3 --- /dev/null +++ b/math/test-math-floatn.h @@ -0,0 +1,20 @@ +/* Common definitions for libm tests for TS 18661-3 derived types. + Copyright (C) 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 + . */ + +#define TEST_FLOATN 1 +#define __STDC_WANT_IEC_60559_TYPES_EXT__ -- 2.39.5