diff options
author | Richard Henderson <rth@twiddle.net> | 2012-12-07 13:17:08 -0600 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2012-12-07 13:17:08 -0600 |
commit | 573cd4843a9737103e6842470aea73e7687c2193 (patch) | |
tree | e23792a304b4a253761f55d490aa7e03ec81397f /soft-fp/op-common.h | |
parent | 7514f09e1e7e88c6d7f1fdabcd14469bccbf3167 (diff) | |
download | glibc-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.
Diffstat (limited to 'soft-fp/op-common.h')
-rw-r--r-- | soft-fp/op-common.h | 4 |
1 files changed, 2 insertions, 2 deletions
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; \ |