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.23-73-gcc40840


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  cc4084017e211cdeafef2d9036a130cbd6f2cadd (commit)
      from  920b35c92ed8f41796c090c2819434e56701da5b (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=cc4084017e211cdeafef2d9036a130cbd6f2cadd

commit cc4084017e211cdeafef2d9036a130cbd6f2cadd
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Tue Mar 8 00:27:21 2016 +0000

    Fix ldbl-128ibm remainderl equality test for zero low part (bug 19677).
    
    The ldbl-128ibm implementation of remainderl has logic resulting in
    incorrect tests for equality of the absolute values of the arguments
    in the case of zero low parts.  If the low parts are both zero but
    with different signs, this can wrongly cause equal arguments to be
    treated as different, resulting in turn in incorrect signs of zero
    result in nondefault rounding modes arising from the subtractions done
    when the arguments are not equal.
    
    This patch fixes the logic to convert -0 low parts into +0 before the
    comparison (remquo already has separate logic to deal with signs of
    zero results, so doesn't need such a change).  Tests are added for
    remainderl and remquol similar to that for fmodl, and based on a
    refactoring of it, since the bug depends on low parts which should not
    be relied upon in tests not setting the representation explicitly
    (although in fact the bug shows up in test-ldouble with current GCC).
    Tested for powerpc.
    
    	[BZ #19677]
    	* sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
    	(__ieee754_remainderl): Put zero low parts in canonical form.
    	* sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c: New
    	file.  Based on
    	sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c.
    	* sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c: Replace
    	with wrapper round test-fmodrem-ldbl-128ibm.c.
    	* sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c: New
    	file.
    	* sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c:
    	Likewise.
    	* sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Add
    	test-remainderl-ldbl-128ibm and test-remquol-ldbl-128ibm.

diff --git a/ChangeLog b/ChangeLog
index 50e32e0..3cb82bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2016-03-08  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #19677]
+	* sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
+	(__ieee754_remainderl): Put zero low parts in canonical form.
+	* sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c: New
+	file.  Based on
+	sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c.
+	* sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c: Replace
+	with wrapper round test-fmodrem-ldbl-128ibm.c.
+	* sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c: New
+	file.
+	* sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c:
+	Likewise.
+	* sysdeps/ieee754/ldbl-128ibm/Makefile (tests): Add
+	test-remainderl-ldbl-128ibm and test-remquol-ldbl-128ibm.
+
 2016-03-07  Florian Weimer  <fweimer@redhat.com>
 
 	[BZ #19610]
diff --git a/sysdeps/ieee754/ldbl-128ibm/Makefile b/sysdeps/ieee754/ldbl-128ibm/Makefile
index b633172..6242edd 100644
--- a/sysdeps/ieee754/ldbl-128ibm/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm/Makefile
@@ -10,5 +10,6 @@ $(objpfx)tst-strtold-ldbl-128ibm: $(libm)
 endif
 
 ifeq ($(subdir),math)
-tests += test-fmodl-ldbl-128ibm
+tests += test-fmodl-ldbl-128ibm test-remainderl-ldbl-128ibm \
+	 test-remquol-ldbl-128ibm
 endif
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c b/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
index 1dc59a4..68b8fb3 100644
--- a/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/e_remainderl.c
@@ -46,6 +46,10 @@ __ieee754_remainderl(long double x, long double p)
 	hp &= 0x7fffffffffffffffLL;
 	lx ^= sx;
 	hx &= 0x7fffffffffffffffLL;
+	if (lp == 0x8000000000000000ULL)
+	  lp = 0;
+	if (lx == 0x8000000000000000ULL)
+	  lx = 0;
 
     /* purge off exception values */
 	if(hp==0) return (x*p)/(x*p);	/* p = 0 */
diff --git a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c
index 3717c90..73d4bc1 100644
--- a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c
+++ b/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c
@@ -16,62 +16,6 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <float.h>
-#include <math.h>
-#include <stdio.h>
-
-union u
-{
-  long double ld;
-  double d[2];
-};
-
-volatile union u p1 = { .d = { DBL_MIN, 0.0 } };
-volatile union u p2 = { .d = { DBL_MIN, -0.0 } };
-volatile union u m1 = { .d = { -DBL_MIN, 0.0 } };
-volatile union u m2 = { .d = { -DBL_MIN, -0.0 } };
-
-static int
-test_fmodl (const char *s, long double x, long double y, long double expected)
-{
-  volatile long double r;
-  r = fmodl (x, y);
-  if (r != expected || copysignl (1.0, r) != copysignl (1.0, expected))
-    {
-      printf ("FAIL: fmodl (%s)\n", s);
-      return 1;
-    }
-  else
-    {
-      printf ("PASS: fmodl (%s)\n", s);
-      return 0;
-    }
-}
-
-#define TEST_FMODL(a, b, e) test_fmodl (#a ", " #b, a, b, e)
-
-static int
-do_test (void)
-{
-  int result = 0;
-  result |= TEST_FMODL (p1.ld, p1.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, p2.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, m1.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, m2.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, p1.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, p2.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, m1.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, m2.ld, 0.0L);
-  result |= TEST_FMODL (m1.ld, p1.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, p2.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, m1.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, m2.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, p1.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, p2.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, m1.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, m2.ld, -0.0L);
-  return result;
-}
-
-#define TEST_FUNCTION do_test ()
-#include "../../../test-skeleton.c"
+#define FUNC fmodl
+#define SETUP
+#include "test-fmodrem-ldbl-128ibm.c"
diff --git a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c
similarity index 54%
copy from sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c
copy to sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c
index 3717c90..4e1640c 100644
--- a/sysdeps/ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c
+++ b/sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c
@@ -1,4 +1,4 @@
-/* Test for ldbl-128ibm fmodl handling of equal values (bug 19602).
+/* Test for ldbl-128ibm fmodl etc. handling of equal values.
    Copyright (C) 2016 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,10 +16,16 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <fenv.h>
 #include <float.h>
 #include <math.h>
 #include <stdio.h>
 
+/* FUNC is defined to be the name of the function to test.  */
+#define STRX(x) #x
+#define STR(x) STRX (x)
+#define SFUNC STR (FUNC)
+
 union u
 {
   long double ld;
@@ -32,44 +38,45 @@ volatile union u m1 = { .d = { -DBL_MIN, 0.0 } };
 volatile union u m2 = { .d = { -DBL_MIN, -0.0 } };
 
 static int
-test_fmodl (const char *s, long double x, long double y, long double expected)
+test_func (const char *s, long double x, long double y, long double expected)
 {
   volatile long double r;
-  r = fmodl (x, y);
+  r = FUNC (x, y);
   if (r != expected || copysignl (1.0, r) != copysignl (1.0, expected))
     {
-      printf ("FAIL: fmodl (%s)\n", s);
+      printf ("FAIL: " SFUNC " (%s)\n", s);
       return 1;
     }
   else
     {
-      printf ("PASS: fmodl (%s)\n", s);
+      printf ("PASS: " SFUNC " (%s)\n", s);
       return 0;
     }
 }
 
-#define TEST_FMODL(a, b, e) test_fmodl (#a ", " #b, a, b, e)
+#define TEST_FUNC(a, b, e) test_func (#a ", " #b, a, b, e)
 
 static int
 do_test (void)
 {
   int result = 0;
-  result |= TEST_FMODL (p1.ld, p1.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, p2.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, m1.ld, 0.0L);
-  result |= TEST_FMODL (p1.ld, m2.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, p1.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, p2.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, m1.ld, 0.0L);
-  result |= TEST_FMODL (p2.ld, m2.ld, 0.0L);
-  result |= TEST_FMODL (m1.ld, p1.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, p2.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, m1.ld, -0.0L);
-  result |= TEST_FMODL (m1.ld, m2.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, p1.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, p2.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, m1.ld, -0.0L);
-  result |= TEST_FMODL (m2.ld, m2.ld, -0.0L);
+  SETUP;
+  result |= TEST_FUNC (p1.ld, p1.ld, 0.0L);
+  result |= TEST_FUNC (p1.ld, p2.ld, 0.0L);
+  result |= TEST_FUNC (p1.ld, m1.ld, 0.0L);
+  result |= TEST_FUNC (p1.ld, m2.ld, 0.0L);
+  result |= TEST_FUNC (p2.ld, p1.ld, 0.0L);
+  result |= TEST_FUNC (p2.ld, p2.ld, 0.0L);
+  result |= TEST_FUNC (p2.ld, m1.ld, 0.0L);
+  result |= TEST_FUNC (p2.ld, m2.ld, 0.0L);
+  result |= TEST_FUNC (m1.ld, p1.ld, -0.0L);
+  result |= TEST_FUNC (m1.ld, p2.ld, -0.0L);
+  result |= TEST_FUNC (m1.ld, m1.ld, -0.0L);
+  result |= TEST_FUNC (m1.ld, m2.ld, -0.0L);
+  result |= TEST_FUNC (m2.ld, p1.ld, -0.0L);
+  result |= TEST_FUNC (m2.ld, p2.ld, -0.0L);
+  result |= TEST_FUNC (m2.ld, m1.ld, -0.0L);
+  result |= TEST_FUNC (m2.ld, m2.ld, -0.0L);
   return result;
 }
 
diff --git a/sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c
new file mode 100644
index 0000000..767a670
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c
@@ -0,0 +1,21 @@
+/* Test for ldbl-128ibm remainderl handling of equal values (bug 19677).
+   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/>.  */
+
+#define FUNC remainderl
+#define SETUP fesetround (FE_DOWNWARD)
+#include "test-fmodrem-ldbl-128ibm.c"
diff --git a/sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c b/sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c
new file mode 100644
index 0000000..b691e3f
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c
@@ -0,0 +1,30 @@
+/* Test for ldbl-128ibm remquol handling of equal values (bug 19677).
+   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 <math.h>
+
+static long double
+wrap_remquol (long double x, long double y)
+{
+  int quo;
+  return remquol (x, y, &quo);
+}
+
+#define FUNC wrap_remquol
+#define SETUP fesetround (FE_DOWNWARD)
+#include "test-fmodrem-ldbl-128ibm.c"

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

Summary of changes:
 ChangeLog                                          |   17 ++++
 sysdeps/ieee754/ldbl-128ibm/Makefile               |    3 +-
 sysdeps/ieee754/ldbl-128ibm/e_remainderl.c         |    4 +
 .../ieee754/ldbl-128ibm/test-fmodl-ldbl-128ibm.c   |   62 +--------------
 .../ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c |   84 ++++++++++++++++++++
 .../ldbl-128ibm/test-remainderl-ldbl-128ibm.c      |   21 +++++
 .../ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.c |   30 +++++++
 7 files changed, 161 insertions(+), 60 deletions(-)
 create mode 100644 sysdeps/ieee754/ldbl-128ibm/test-fmodrem-ldbl-128ibm.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm/test-remainderl-ldbl-128ibm.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm/test-remquol-ldbl-128ibm.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]