]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
soft-fp: Fix used without set warning in _FP_MUL and _FP_DIV
authorRichard Henderson <rth@twiddle.net>
Fri, 7 Dec 2012 19:17:08 +0000 (13:17 -0600)
committerRichard Henderson <rth@twiddle.net>
Fri, 7 Dec 2012 19:17:08 +0000 (13:17 -0600)
Seen in, e.g. ports/sysdeps/alpha/soft-fp/ots_mul.c.

The problem here is we have a switch on the class of X*Y, followed by
a switch on the class of R.  The exponent field of R really is not set
by the first switch for NaN outputs, because we know it's not going to
be used.  The compiler is not smart enough to see through this.

By pulling the exponent computation out of the NORMAL*NORMAL path, we
will not be pessimizing the most common case, while still providing an
arbitrary value to satisfy the compiler.

ChangeLog
soft-fp/op-common.h

index 2dfde8090024b1bfe9004fc2d9f63059c0314dde..80707a257be759ace7848d8bf121b49b983987a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-07  Richard Henderson  <rth@redhat.com>
+
+       * soft-fp/op-common.h (_FP_MUL): Pull computation of R_e from the
+       normal/normal case to before the switch.
+       (_FP_DIV): Likewise.
+
 2012-12-06  Carlos O'Donell  <carlos@systemhalted.org>
            Mike Frysinger  <vapier@gentoo.org>
 
index 8855ad3acf8e2c88c21e98b9d55b261506fb6631..6e81b138d31fb4e61afb3391632510d7c239d64e 100644 (file)
@@ -748,11 +748,11 @@ do {                                                                       \
 #define _FP_MUL(fs, wc, R, X, Y)                       \
 do {                                                   \
   R##_s = X##_s ^ Y##_s;                               \
+  R##_e = X##_e + Y##_e + 1;                           \
   switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
   {                                                    \
   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
     R##_c = FP_CLS_NORMAL;                             \
-    R##_e = X##_e + Y##_e + 1;                         \
                                                        \
     _FP_MUL_MEAT_##fs(R,X,Y);                          \
                                                        \
@@ -811,11 +811,11 @@ do {                                                      \
 #define _FP_DIV(fs, wc, R, X, Y)                       \
 do {                                                   \
   R##_s = X##_s ^ Y##_s;                               \
+  R##_e = X##_e - Y##_e;                               \
   switch (_FP_CLS_COMBINE(X##_c, Y##_c))               \
   {                                                    \
   case _FP_CLS_COMBINE(FP_CLS_NORMAL,FP_CLS_NORMAL):   \
     R##_c = FP_CLS_NORMAL;                             \
-    R##_e = X##_e - Y##_e;                             \
                                                        \
     _FP_DIV_MEAT_##fs(R,X,Y);                          \
     break;                                             \