]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix missing truncation UNDERFLOW.
authorMarcus Shawcroft <marcus.shawcroft@linaro.org>
Tue, 13 Nov 2012 17:01:05 +0000 (17:01 +0000)
committerMarcus Shawcroft <marcus.shawcroft@linaro.org>
Tue, 13 Nov 2012 17:01:05 +0000 (17:01 +0000)
ChangeLog
soft-fp/op-common.h
soft-fp/soft-fp.h

index ba9ecf3072e4a12bae3b3210e5f2b33d117a0805..b3bd03f8206aca2728d1b0522efdc4929420fc67 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-11-13  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
+
+       * soft-fp/op-common.h (_FP_PACK_SEMIRAW): Move underflow
+       detection to immediately after _FP_ROUND().
+       * soft-fp/soft-fp.h (_FP_ROUND): Don't round if working
+       bits are 0.
+
 2012-11-11  David S. Miller  <davem@davemloft.net>
 
        * sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c: Include
index db75af53e6054fc48e3bd2ec583817fa626c4723..12fb16e5efe9eb4fe57ea71cd4534eaa91ead5b4 100644 (file)
@@ -134,6 +134,12 @@ do {                                                                       \
 #define _FP_PACK_SEMIRAW(fs, wc, X)                            \
 do {                                                           \
   _FP_ROUND(wc, X);                                            \
+  if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc(X))                   \
+       { \
+         if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)               \
+             || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))    \
+           FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                  \
+       } \
   if (_FP_FRAC_HIGH_##fs(X)                                    \
       & (_FP_OVERFLOW_##fs >> 1))                              \
     {                                                          \
@@ -143,24 +149,15 @@ do {                                                              \
        _FP_OVERFLOW_SEMIRAW(fs, wc, X);                        \
     }                                                          \
   _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                          \
-  if (!_FP_EXP_NORMAL(fs, wc, X) && !_FP_FRAC_ZEROP_##wc(X))   \
+  if (X##_e == _FP_EXPMAX_##fs && !_FP_FRAC_ZEROP_##wc(X))     \
     {                                                          \
-      if (X##_e == 0)                                          \
+      if (!_FP_KEEPNANFRACP)                                   \
        {                                                       \
-         if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT)               \
-             || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))    \
-           FP_SET_EXCEPTION(FP_EX_UNDERFLOW);                  \
+         _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);               \
+         X##_s = _FP_NANSIGN_##fs;                             \
        }                                                       \
       else                                                     \
-       {                                                       \
-         if (!_FP_KEEPNANFRACP)                                \
-           {                                                   \
-             _FP_FRAC_SET_##wc(X, _FP_NANFRAC_##fs);           \
-             X##_s = _FP_NANSIGN_##fs;                         \
-           }                                                   \
-         else                                                  \
-           _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;      \
-       }                                                       \
+       _FP_FRAC_HIGH_RAW_##fs(X) |= _FP_QNANBIT_##fs;          \
     }                                                          \
 } while (0)
 
index 750c7fea2d1d3ec91b3e74e242952478589b9498..49a87706cc5e62f0b26e0f93d2c7e0ee8eb8ff12 100644 (file)
@@ -158,22 +158,24 @@ do {                                                      \
 #define _FP_ROUND(wc, X)                       \
 do {                                           \
        if (_FP_FRAC_LOW_##wc(X) & 7)           \
-         FP_SET_EXCEPTION(FP_EX_INEXACT);      \
-       switch (FP_ROUNDMODE)                   \
-       {                                       \
-         case FP_RND_NEAREST:                  \
-           _FP_ROUND_NEAREST(wc,X);            \
-           break;                              \
-         case FP_RND_ZERO:                     \
-           _FP_ROUND_ZERO(wc,X);               \
-           break;                              \
-         case FP_RND_PINF:                     \
-           _FP_ROUND_PINF(wc,X);               \
-           break;                              \
-         case FP_RND_MINF:                     \
-           _FP_ROUND_MINF(wc,X);               \
-           break;                              \
-       }                                       \
+         {                                     \
+           FP_SET_EXCEPTION(FP_EX_INEXACT);    \
+           switch (FP_ROUNDMODE)               \
+             {                                 \
+             case FP_RND_NEAREST:              \
+               _FP_ROUND_NEAREST(wc,X);        \
+               break;                          \
+             case FP_RND_ZERO:                 \
+               _FP_ROUND_ZERO(wc,X);           \
+               break;                          \
+             case FP_RND_PINF:                 \
+               _FP_ROUND_PINF(wc,X);           \
+               break;                          \
+             case FP_RND_MINF:                 \
+               _FP_ROUND_MINF(wc,X);           \
+               break;                          \
+             }                                 \
+         }                                     \
 } while (0)
 
 #define FP_CLS_NORMAL          0