aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2012-12-07 13:17:08 -0600
committerRichard Henderson <rth@twiddle.net>2012-12-07 13:17:08 -0600
commit573cd4843a9737103e6842470aea73e7687c2193 (patch)
treee23792a304b4a253761f55d490aa7e03ec81397f
parent7514f09e1e7e88c6d7f1fdabcd14469bccbf3167 (diff)
downloadglibc-573cd4843a9737103e6842470aea73e7687c2193.zip
glibc-573cd4843a9737103e6842470aea73e7687c2193.tar.gz
glibc-573cd4843a9737103e6842470aea73e7687c2193.tar.bz2
soft-fp: Fix used without set warning in _FP_MUL and _FP_DIV
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.
-rw-r--r--ChangeLog6
-rw-r--r--soft-fp/op-common.h4
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 2dfde80..80707a2 100644
--- 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>
diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
index 8855ad3..6e81b13 100644
--- a/soft-fp/op-common.h
+++ b/soft-fp/op-common.h
@@ -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; \