about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-10-12 12:18:55 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-10-12 12:18:55 +0000
commit8399acaf7c5cb2252117ad1d65e468f688b84fc0 (patch)
tree492adfe232efb5737972eb3c65f8f547b0a3072a
parent99fd9f47effcd18489528e895c08b58ed24d6505 (diff)
downloadglibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.tar.gz
glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.tar.xz
glibc-8399acaf7c5cb2252117ad1d65e468f688b84fc0.zip
soft-fp: fix _FP_DIV_MEAT_* returning results with wrong exponent (bug 16032).
-rw-r--r--ChangeLog11
-rw-r--r--NEWS2
-rw-r--r--soft-fp/op-2.h6
-rw-r--r--soft-fp/op-4.h2
4 files changed, 16 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 7df0ae9cfe..d8b9b7eab1 100644
--- 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 48a92e8365..74231dc45c 100644
--- 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
diff --git a/soft-fp/op-2.h b/soft-fp/op-2.h
index 20088227e1..2892d3b04c 100644
--- a/soft-fp/op-2.h
+++ b/soft-fp/op-2.h
@@ -469,7 +469,7 @@
 #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;		\
@@ -539,9 +539,8 @@
     _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)));	\
@@ -549,6 +548,7 @@
       }									\
     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)));	\
diff --git a/soft-fp/op-4.h b/soft-fp/op-4.h
index 7fccbd52be..9086ba71c4 100644
--- a/soft-fp/op-4.h
+++ b/soft-fp/op-4.h
@@ -381,7 +381,7 @@
     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);						    \