This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.24-261-gd0800ae


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  d0800ae0e7162631136a0042e87eb42c641455d9 (commit)
      from  12e5d361a4dcfe3579f1dd263f911ac193b0fa29 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d0800ae0e7162631136a0042e87eb42c641455d9

commit d0800ae0e7162631136a0042e87eb42c641455d9
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Fri Oct 7 23:28:33 2016 +0000

    Make iseqsig handle excess precision.
    
    iseqsig, like other type-generic comparison macros, should behave like
    a comparison operator in not removing excess range and precision from
    its arguments (see C11 F.10.11).  This patch implements this by making
    definitions of iseqsig appropriately conditional on
    __FLT_EVAL_METHOD__ (including support for TS 18661-3 values of that
    macro), with a corresponding testcase (that failed for 32-bit x86 in
    the absence of the math.h changes) being added.  (Of course the
    definitions may need reworking when float128 support is added, just as
    with other type-generic macros.)
    
    Tested for x86_64 and x86.
    
    	* math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (iseqsig): Define
    	conditional on value of [__FLT_EVAL_METHOD__].
    	* math/test-iseqsig-excess-precision.c: New file.
    	* math/Makefile (tests): Add test-iseqsig-excess-precision.

diff --git a/ChangeLog b/ChangeLog
index e50a214..cd17710 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-10-07  Joseph Myers  <joseph@codesourcery.com>
+
+	* math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (iseqsig): Define
+	conditional on value of [__FLT_EVAL_METHOD__].
+	* math/test-iseqsig-excess-precision.c: New file.
+	* math/Makefile (tests): Add test-iseqsig-excess-precision.
+
 2016-10-07  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
 	* math/s_iseqsig_template.c: Include math-private.h.
diff --git a/math/Makefile b/math/Makefile
index a9f0608..ca07f9d 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -156,7 +156,8 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-signgam-ullong-init test-nan-overflow test-nan-payload \
 	test-fexcept test-fexcept-traps test-fesetexcept \
 	test-fesetexcept-traps test-fetestexceptflag test-femode \
-	test-femode-traps test-iszero-excess-precision $(tests-static)
+	test-femode-traps test-iszero-excess-precision \
+	test-iseqsig-excess-precision $(tests-static)
 tests-static = test-fpucw-static test-fpucw-ieee-static \
 	       test-signgam-uchar-static test-signgam-uchar-init-static \
 	       test-signgam-uint-static test-signgam-uint-init-static \
@@ -267,6 +268,7 @@ CFLAGS-test-signgam-ullong-init-static.c = -std=c99
 CFLAGS-test-math-isinff.cc = -std=gnu++11
 
 CFLAGS-test-iszero-excess-precision.c = -fexcess-precision=standard
+CFLAGS-test-iseqsig-excess-precision.c = -fexcess-precision=standard
 
 # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
 # for error handling in the -lm functions.
diff --git a/math/math.h b/math/math.h
index 394cefa..880b4a0 100644
--- a/math/math.h
+++ b/math/math.h
@@ -535,17 +535,32 @@ extern int matherr (struct exception *__exc);
 /* Return X == Y but raising "invalid" and setting errno if X or Y is
    a NaN.  */
 # ifdef __NO_LONG_DOUBLE_MATH
-#  define iseqsig(x, y)				\
+#  if (__FLT_EVAL_METHOD__ == 1			\
+       || __FLT_EVAL_METHOD__ == 2		\
+       || __FLT_EVAL_METHOD__ > 32)
+#   define iseqsig(x, y) __iseqsig ((x), (y))
+#  else
+#   define iseqsig(x, y)			\
   (sizeof ((x) + (y)) == sizeof (float)		\
    ? __iseqsigf ((x), (y))			\
    : __iseqsig ((x), (y)))
+#  endif
 # else
-#  define iseqsig(x, y)				\
+#  if __FLT_EVAL_METHOD__ == 2 || __FLT_EVAL_METHOD__ > 64
+#   define iseqsig(x, y) __iseqsigl ((x), (y))
+#  elif __FLT_EVAL_METHOD__ == 1 || __FLT_EVAL_METHOD__ > 32
+#   define iseqsig(x, y)			\
+  (sizeof ((x) + (y)) <= sizeof (double)	\
+   ? __iseqsig ((x), (y))			\
+   : __iseqsigl ((x), (y)))
+#  else
+#   define iseqsig(x, y)			\
   (sizeof ((x) + (y)) == sizeof (float)		\
    ? __iseqsigf ((x), (y))			\
    : sizeof ((x) + (y)) == sizeof (double)	\
    ? __iseqsig ((x), (y))			\
    : __iseqsigl ((x), (y)))
+#  endif
 # endif
 #endif
 
diff --git a/math/test-iseqsig-excess-precision.c b/math/test-iseqsig-excess-precision.c
new file mode 100644
index 0000000..01dea1c
--- /dev/null
+++ b/math/test-iseqsig-excess-precision.c
@@ -0,0 +1,80 @@
+/* Test iseqsig with excess precision.
+   Copyright (C) 2016 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/>.  */
+
+#include <float.h>
+#include <math.h>
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+  int result = 0;
+
+  if (FLT_EVAL_METHOD == 1 || FLT_EVAL_METHOD == 2 || FLT_EVAL_METHOD > 32)
+    {
+      /* Excess precision for float.  */
+      if (iseqsig (1.0f, 1.0f + (float) DBL_EPSILON))
+	{
+	  puts ("iseqsig removes excess precision float -> double");
+	  result = 1;
+	}
+      else
+	puts ("iseqsig preserves excess precision float -> double");
+      if (iseqsig (__builtin_inff (), FLT_MAX * FLT_MAX))
+	{
+	  puts ("iseqsig removes excess range float -> double");
+	  result = 1;
+	}
+      else
+	puts ("iseqsig preserves excess range float -> double");
+    }
+
+  if (FLT_EVAL_METHOD == 2 || FLT_EVAL_METHOD > 64)
+    {
+      /* Excess precision for float and double.  */
+      if (iseqsig (1.0f, 1.0f + (float) LDBL_EPSILON))
+	{
+	  puts ("iseqsig removes excess precision float -> long double");
+	  result = 1;
+	}
+      else
+	puts ("iseqsig preserves excess precision float -> long double");
+      if (iseqsig (1.0, 1.0 + (double) LDBL_EPSILON))
+	{
+	  puts ("iseqsig removes excess precision double -> long double");
+	  result = 1;
+	}
+      else
+	puts ("iseqsig preserves excess precision double -> long double");
+      if (LDBL_MAX_EXP >= 2 * DBL_MAX_EXP)
+	{
+	  if (iseqsig (__builtin_inf (), DBL_MAX * DBL_MAX))
+	    {
+	      puts ("iseqsig removes excess range double -> long double");
+	      result = 1;
+	    }
+	    else
+	      puts ("iseqsig preserves excess range double -> long double");
+	}
+    }
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                            |    7 +++
 math/Makefile                        |    4 +-
 math/math.h                          |   19 +++++++-
 math/test-iseqsig-excess-precision.c |   80 ++++++++++++++++++++++++++++++++++
 4 files changed, 107 insertions(+), 3 deletions(-)
 create mode 100644 math/test-iseqsig-excess-precision.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]