]> sourceware.org Git - glibc.git/commitdiff
Fix dbl-64 e_sqrt.c for non-default rounding modes (bug 16271).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 28 Nov 2013 16:50:38 +0000 (16:50 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 28 Nov 2013 16:50:38 +0000 (16:50 +0000)
31 files changed:
ChangeLog
NEWS
include/fenv.h
math/fegetround.c
ports/ChangeLog.aarch64
ports/ChangeLog.alpha
ports/ChangeLog.am33
ports/ChangeLog.arm
ports/ChangeLog.hppa
ports/ChangeLog.ia64
ports/ChangeLog.m68k
ports/ChangeLog.microblaze
ports/ChangeLog.mips
ports/sysdeps/aarch64/fpu/fegetround.c
ports/sysdeps/alpha/fpu/fegetround.c
ports/sysdeps/am33/fpu/fegetround.c
ports/sysdeps/arm/fegetround.c
ports/sysdeps/hppa/fpu/fegetround.c
ports/sysdeps/ia64/fpu/fegetround.c
ports/sysdeps/m68k/fpu/fegetround.c
ports/sysdeps/microblaze/fegetround.c
ports/sysdeps/mips/fpu/fegetround.c
sysdeps/i386/fpu/fegetround.c
sysdeps/ieee754/dbl-64/e_sqrt.c
sysdeps/powerpc/fpu/fegetround.c
sysdeps/powerpc/nofpu/fegetround.c
sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c
sysdeps/s390/fpu/fegetround.c
sysdeps/sh/sh4/fpu/fegetround.c
sysdeps/sparc/fpu/fegetround.c
sysdeps/x86_64/fpu/fegetround.c

index 7e46a669192f5397f5faa9eb21ce6ea833f9835b..16aa48aec3d41e9bb765e922ce027c5f06431b54 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #16271]
+       * sysdeps/ieee754/dbl-64/e_sqrt.c (__ieee754_sqrt): Set
+       round-to-nearest then adjust result for other rounding modes.
+       * include/fenv.h (fegetround): Use libm_hidden_proto.
+       * math/fegetround.c (fegetround): Use libm_hidden_def.
+       * sysdeps/i386/fpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/powerpc/fpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/powerpc/nofpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/powerpc/powerpc32/e500/nofpu/fegetround.c (fegetround):
+       Likewise.
+       * sysdeps/s390/fpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/sh/sh4/fpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/sparc/fpu/fegetround.c (fegetround): Likewise.
+       * sysdeps/x86_64/fpu/fegetround.c (fegetround): Likewise.
+
 2013-11-28  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        [BZ #16077]
diff --git a/NEWS b/NEWS
index b45fa5316539e71d7dce41fb41b3a9fbfbab238f..4a8e3c0bd89f9e1d97bb34bc326bcecc98cf4bed 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,7 +19,7 @@ Version 2.19
   15897, 15905, 15909, 15917, 15919, 15921, 15923, 15939, 15948, 15963,
   15966, 15985, 15988, 15997, 16032, 16034, 16036, 16037, 16041, 16055,
   16071, 16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146,
-  16150, 16151, 16153, 16167, 16172, 16245.
+  16150, 16151, 16153, 16167, 16172, 16245, 16271.
 
 * The public headers no longer use __unused nor __block.  This change is to
   support compiling programs that are derived from BSD sources and use
index 925d4b50c3991f69efcdf8278043d95c4405195e..bd2c99db9675855108adee145860a591b549f46c 100644 (file)
@@ -16,6 +16,7 @@ extern int __feupdateenv (const fenv_t *__envp);
 
 libm_hidden_proto (feraiseexcept)
 libm_hidden_proto (fegetenv)
+libm_hidden_proto (fegetround)
 libm_hidden_proto (fesetenv)
 libm_hidden_proto (fesetround)
 libm_hidden_proto (feholdexcept)
index 24bbd1609781601bb19fb3abe2939f0b02933e2d..140e698480c09259f29dc4c7dfff36a4621dbdc9 100644 (file)
@@ -28,4 +28,5 @@ fegetround (void)
   return 0;
 #endif
 }
+libm_hidden_def (fegetround)
 stub_warning (fegetround)
index c6331a4b91c7f19c5055efce7001eef01a26bb7f..4cbc11f84bf0961a40a42ae9c81d7e684b9d23a9 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/aarch64/fpu/fegetround.c (fegetround): Use
+       libm_hidden_def.
+
 2013-11-26  Will Newton  <will.newton@linaro.org>
 
        * sysdeps/aarch64/dl-irel.h: Include ldsodefs.h.
index 05c6ba4950f8c02686ddebdb422c739977f75aac..95b575edc00a1895d7b05fd18472cb327db6a586 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/alpha/fpu/fegetround.c (fegetround): Use
+       libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Use __glibc_reserved instead __unused.
        * sysdeps/unix/sysv/linux/alpha/bits/msq.h: Likewise.
index 15b7a1b300f4565308be524e53a7d134c3ac10a3..317dd8efbeb776f528f409435f4b6c08e74f59b2 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/am33/fpu/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-10-30  Mike Frysinger  <vapier@gentoo.org>
 
        * sysdeps/unix/sysv/linux/am33/configure.in: Moved to ...
index 4124e474b1490b106088bfa39efa757ea6152d7e..4a4d319a1b144ad4be16a9e20c8aa936a0a47d3a 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/arm/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/arm/bits/shm.h: Use __glibc_reserved instead __unused.
 
index 6a28bfe22133833ee4ef1bbdf4603777324fdf10..98d36a3e14b3238cc4f715e618149e9a5be8ae1d 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/hppa/fpu/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Use __glibc_reserved instead __unused.
        * sysdeps/unix/sysv/linux/hppa/bits/msq.h: Likewise.
index d2825f1700a9bbba9cafde941620b19ee0761234..1aded589a5ad15b4ad8f990cc0e0382f4ce2e03b 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/ia64/fpu/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Use __glibc_reserved instead __unused.
        * sysdeps/unix/sysv/linux/ia64/bits/msq.h: Likewise.
index f78f3848fadbec222d981622e9036b3a038e4c32..92ff9732436819c6d4965a10835f51dd9b1f9453 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/m68k/fpu/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/m68k/bits/stat.h: Use __glibc_reserved instead __unused.
 
index 0762dd3be2a59bed18d03b635e3ea71b987ced03..7d47e0468af9a174d62d6829ed2858f598e5b07a 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/microblaze/fegetround.c (fegetround): Use
+       libm_hidden_def.
+
 2013-11-26  Ondřej Bílka  <neleai@seznam.cz>
        * sysdeps/unix/sysv/linux/microblaze/bits/stat.h: Use __glibc_reserved instead __unused.
        * sysdeps/unix/sysv/linux/microblaze/kernel_stat.h: Likewise.
index 84567997b7a14dcb8c467810bea269d57ed1288f..21308e7f1b6b095b8e6cf09127f3d8c60004b7d0 100644 (file)
@@ -1,3 +1,7 @@
+2013-11-28  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/mips/fpu/fegetround.c (fegetround): Use libm_hidden_def.
+
 2013-11-27  Aurelien Jarno <aurelien@aurel32.net>
 
        * sysdeps/unix/sysv/linux/mips/bits/resource.h (RLIM64_INFINITY): Fix
index 3b5b3068b26241f375e8d9c82646bfd285a8a82e..370caa16d3b6ed97d2dbcaaeb35a1e4b100aa5c9 100644 (file)
@@ -26,3 +26,4 @@ fegetround (void)
   _FPU_GETCW (fpcr);
   return fpcr & FE_TOWARDZERO;
 }
+libm_hidden_def (fegetround)
index aba657aebd4465e81a1b06bd7576e07022febae5..03a55ee7a76f35f57f1d06bbb875f3241620dc74 100644 (file)
@@ -28,3 +28,4 @@ fegetround (void)
 
   return (fpcr >> FPCR_ROUND_SHIFT) & 3;
 }
+libm_hidden_def (fegetround)
index b309c92e08ff68532e98ea95c6486b57fcbd0738..49cae00fd027a703844a0d5a3a1d3f33396ea55a 100644 (file)
@@ -32,3 +32,4 @@ fegetround (void)
 
   return (cw & ROUND_MASK);
 }
+libm_hidden_def (fegetround)
index 78a3795b236a4b923a36856336038a2861489125..149a989518291e44b245d4bfe51c6ecfa1062c45 100644 (file)
@@ -37,3 +37,4 @@ fegetround (void)
   /* The current soft-float implementation only handles TONEAREST.  */
   return FE_TONEAREST;
 }
+libm_hidden_def (fegetround)
index 67dd7c487a6fd948dfed2a3c40542b7f042e7097..3815fbd94c2d036033d503190e50660e3cc87250 100644 (file)
@@ -24,3 +24,4 @@ fegetround (void)
 {
   return get_rounding_mode ();
 }
+libm_hidden_def (fegetround)
index 5c9b34338c3fed63052d403078bd20b4dd548fab..f6dfea7276b0a36eb8af33ef836bd2f11c71b12b 100644 (file)
@@ -24,3 +24,4 @@ fegetround (void)
 {
   return get_rounding_mode ();
 }
+libm_hidden_def (fegetround)
index f1227fe593d1012927c91bc86a3a1ecf79a89de5..54fa7df896b438cfd5fb090ccab5404e0fd2eeaf 100644 (file)
@@ -28,3 +28,4 @@ fegetround (void)
 
   return fpcr & FE_UPWARD;
 }
+libm_hidden_def (fegetround)
index 4f47dd1fef4f486b1c37e3d524b6c903b81fba00..b1039e8651ab5a560779e54c570b8e9add842049 100644 (file)
@@ -22,3 +22,4 @@ fegetround (void)
 {
   return FE_TONEAREST;
 }
+libm_hidden_def (fegetround)
index 17cd3e994ab9d3fea9484904746cdf983034f241..011d27f295542d58834de21f893f53090a2ddb2d 100644 (file)
@@ -30,3 +30,4 @@ fegetround (void)
 
   return cw & _FPU_RC_MASK;
 }
+libm_hidden_def (fegetround)
index d0170d3c868adc6496b9e6d432bb9fbd6b610d86..cd96ae99d35dfb96692d2c047fa3c8bc6db33633 100644 (file)
@@ -28,3 +28,4 @@ fegetround (void)
 
   return cw & 0xc00;
 }
+libm_hidden_def (fegetround)
index 854ae38c41f2f7a581dda375324104173fb0c4bd..88809daa76ccaf012994c341c0646dacebb0a4fd 100644 (file)
@@ -66,8 +66,9 @@ __ieee754_sqrt (double x)
   /*----------------- 2^-1022  <= | x |< 2^1024  -----------------*/
   if (k > 0x000fffff && k < 0x7ff00000)
     {
+      int rm = fegetround ();
       fenv_t env;
-      libc_feholdexcept (&env);
+      libc_feholdexcept_setround (&env, FE_TONEAREST);
       double ret;
       y = 1.0 - t * (t * s);
       t = t * (rt0 + y * (rt1 + y * (rt2 + y * rt3)));
@@ -82,15 +83,44 @@ __ieee754_sqrt (double x)
        {
          res1 = res + 1.5 * ((y - res) + del);
          EMULV (res, res1, z, zz, p, hx, tx, hy, ty); /* (z+zz)=res*res1 */
-         ret = ((((z - s) + zz) < 0) ? max (res, res1) :
-                                       min (res, res1)) * c.x;
+         res = ((((z - s) + zz) < 0) ? max (res, res1) :
+                                       min (res, res1));
+         ret = res * c.x;
        }
       math_force_eval (ret);
       libc_fesetenv (&env);
-      if (x / ret != ret)
+      double dret = x / ret;
+      if (dret != ret)
        {
          double force_inexact = 1.0 / 3.0;
          math_force_eval (force_inexact);
+         /* The square root is inexact, ret is the round-to-nearest
+            value which may need adjusting for other rounding
+            modes.  */
+         switch (rm)
+           {
+#ifdef FE_UPWARD
+           case FE_UPWARD:
+             if (dret > ret)
+               ret = (res + 0x1p-1022) * c.x;
+             break;
+#endif
+
+#ifdef FE_DOWNWARD
+           case FE_DOWNWARD:
+#endif
+#ifdef FE_TOWARDZERO
+           case FE_TOWARDZERO:
+#endif
+#if defined FE_DOWNWARD || defined FE_TOWARDZERO
+             if (dret < ret)
+               ret = (res - 0x1p-1022) * c.x;
+             break;
+#endif
+
+           default:
+             break;
+           }
        }
       /* Otherwise (x / ret == ret), either the square root was exact or
          the division was inexact.  */
index bcb6caab9d198ed0342e45cb4815bccdc1197c42..078911f4a3627322b7d1f13bcc50e57cb0c5a2e5 100644 (file)
@@ -24,3 +24,4 @@ fegetround (void)
 {
   return __fegetround();
 }
+libm_hidden_def (fegetround)
index 016602fac61b1d6c1eaa1c0fbb0433c4b2f1138e..2c7bdbe5f6609bc4b33812bec317c0fa750a3616 100644 (file)
@@ -26,3 +26,4 @@ fegetround (void)
 {
   return __sim_round_mode_thread;
 }
+libm_hidden_def (fegetround)
index f69e9a5bdbf65d63a4f6204f43175cb352eb7305..1e894e7523c203e1554cb4024b0db80e397636fe 100644 (file)
@@ -27,3 +27,4 @@ fegetround (void)
   fpescr = fegetenv_register ();
   return fpescr & 3;
 }
+libm_hidden_def (fegetround)
index 4843a56d262da4dd56b5a29f4ce1cf2d8d129bcf..94482f63189d43a88f9c895096a35116fd9c59ff 100644 (file)
@@ -29,3 +29,4 @@ fegetround (void)
 
   return cw & FPC_RM_MASK;
 }
+libm_hidden_def (fegetround)
index be4833f0177eb92f5b0678e16cb72699a04eb648..0523321b2d8482e9510ce3431e0c1e262d587521 100644 (file)
@@ -30,3 +30,4 @@ fegetround (void)
 
   return cw & 0x1;
 }
+libm_hidden_def (fegetround)
index c4987e8b3ee3aaa192737839fba5a99e4e2b10d0..c2d5f5af0380bfc62adfb9a00b5533cc0d569d42 100644 (file)
@@ -27,3 +27,4 @@ fegetround (void)
 
   return tmp & __FE_ROUND_MASK;
 }
+libm_hidden_def (fegetround)
index 1a52b7ea67eeeecdb3183b27a0c89cc9641524bf..c7cd046f391e30c6192229a59c7025712befa370 100644 (file)
@@ -30,3 +30,4 @@ fegetround (void)
 
   return cw & 0xc00;
 }
+libm_hidden_def (fegetround)
This page took 0.145678 seconds and 5 git commands to generate.