]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
soft-fp: fix _FP_DIV_MEAT_* returning results with wrong exponent (bug 16032).
authorJoseph Myers <joseph@codesourcery.com>
Sat, 12 Oct 2013 12:18:55 +0000 (12:18 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Sat, 12 Oct 2013 12:18:55 +0000 (12:18 +0000)
ChangeLog
NEWS
soft-fp/op-2.h
soft-fp/op-4.h

index 7df0ae9cfed665afca8fbe26fa348cc13da1c9ca..d8b9b7eab14ce24b4d643a8daa93ea9bf4e43bac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2013-10-12  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #16032]
+       * soft-fp/op-2.h (_FP_DIV_MEAT_2_udiv): Shift numerator right
+       without decrementing exponent if mantissa >= that for the
+       denominator, not >.
+       (_FP_DIV_MEAT_2_gmp): Test numerator mantissa >= that for the
+       denominator, not >.  Decrement exponent in < case instead of
+       incrementing in >= case.
+       * soft-fp/op-4.h (_FP_DIV_MEAT_4_udiv): Shift numerator right
+       without decrementing exponent if mantissa >= that for the
+       denominator, not >.
+
        * soft-fp/op-common.h (_FP_TO_INT): Reverse test of sign for
        computing saturated result for unsigned overflow.
 
diff --git a/NEWS b/NEWS
index 48a92e83650bff375c15e85887b8b7dcf01db704..74231dc45cb6d117488c11fda710e9de6848ccbf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,7 @@ Version 2.19
   15723, 15734, 15735, 15736, 15748, 15749, 15754, 15760, 15797, 15844,
   15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892,
   15893, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963,
-  15966, 15988, 16034.
+  15966, 15988, 16032, 16034.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
index 20088227e1915a4ce88b3ce82faa6d41e3cb4a16..2892d3b04c19a09a8b01210bbc40c3b6e86061d9 100644 (file)
 #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y)                               \
   do {                                                                 \
     _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0;                \
-    if (_FP_FRAC_GT_2(X, Y))                                           \
+    if (_FP_FRAC_GE_2(X, Y))                                           \
       {                                                                        \
        _n_f2 = X##_f1 >> 1;                                            \
        _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1;          \
     _FP_W_TYPE _x[4], _y[2], _z[4];                                    \
     _y[0] = Y##_f0; _y[1] = Y##_f1;                                    \
     _x[0] = _x[3] = 0;                                                 \
-    if (_FP_FRAC_GT_2(X, Y))                                           \
+    if (_FP_FRAC_GE_2(X, Y))                                           \
       {                                                                        \
-       R##_e++;                                                        \
        _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE) |   \
                 X##_f1 >> (_FP_W_TYPE_SIZE -                           \
                            (_FP_WFRACBITS_##fs-1 - _FP_W_TYPE_SIZE))); \
       }                                                                        \
     else                                                               \
       {                                                                        \
+       R##_e--;                                                        \
        _x[1] = (X##_f0 << (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE) |     \
                 X##_f1 >> (_FP_W_TYPE_SIZE -                           \
                            (_FP_WFRACBITS_##fs - _FP_W_TYPE_SIZE)));   \
index 7fccbd52be56777f078a828ace591e7e12e80ea6..9086ba71c43ad684ed6d8db9d4203a2808ea9ab0 100644 (file)
     int _i;                                                                \
     _FP_FRAC_DECL_4(_n); _FP_FRAC_DECL_4(_m);                              \
     _FP_FRAC_SET_4(_n, _FP_ZEROFRAC_4);                                            \
-    if (_FP_FRAC_GT_4(X, Y))                                               \
+    if (_FP_FRAC_GE_4(X, Y))                                               \
       {                                                                            \
        _n_f[3] = X##_f[0] << (_FP_W_TYPE_SIZE - 1);                        \
        _FP_FRAC_SRL_4(X, 1);                                               \