]> git.neil.brown.name Git - history.git/commitdiff
Soft-fp fix:
authorDavid S. Miller <davem@nuts.ninka.net>
Wed, 8 May 2002 15:34:22 +0000 (08:34 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Wed, 8 May 2002 15:34:22 +0000 (08:34 -0700)
- Fix handling of implicit 1 bit of fraction part when converting
from int to float.  We cannot handle it properly unless we
defer implicit 1 bit handling till after rounding as
rounding may move where the implicit 1 bit is in
the final converted integer.

include/math-emu/op-1.h
include/math-emu/op-2.h
include/math-emu/op-4.h
include/math-emu/op-common.h

index 38c0561b70a6a6dee0206615deee88e7c11ad0d4..a5eac974298dadce097e6f7c3340489badff0d34 100644 (file)
@@ -58,6 +58,7 @@
 #define _FP_FRAC_NEGP_1(X)     ((_FP_WS_TYPE)X##_f < 0)
 #define _FP_FRAC_ZEROP_1(X)    (X##_f == 0)
 #define _FP_FRAC_OVERP_1(fs,X) (X##_f & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_1(fs,X)   (X##_f &= ~_FP_OVERFLOW_##fs)
 #define _FP_FRAC_EQ_1(X, Y)    (X##_f == Y##_f)
 #define _FP_FRAC_GE_1(X, Y)    (X##_f >= Y##_f)
 #define _FP_FRAC_GT_1(X, Y)    (X##_f > Y##_f)
index 81416782bc36878c204111667e089257950b8e8c..e193fb08fd553eb41f782e244b7982e1075c5159 100644 (file)
 #define _FP_FRAC_NEGP_2(X)     ((_FP_WS_TYPE)X##_f1 < 0)
 #define _FP_FRAC_ZEROP_2(X)    ((X##_f1 | X##_f0) == 0)
 #define _FP_FRAC_OVERP_2(fs,X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_2(fs,X)   (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
 #define _FP_FRAC_EQ_2(X, Y)    (X##_f1 == Y##_f1 && X##_f0 == Y##_f0)
 #define _FP_FRAC_GT_2(X, Y)    \
   (X##_f1 > Y##_f1 || (X##_f1 == Y##_f1 && X##_f0 > Y##_f0))
index bb0305e59f63afd75819584ac723ebd03ad1954f..18e43431b4f6561b695216db76f35dbb110fec37 100644 (file)
 #define _FP_FRAC_ZEROP_4(X)     ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0)
 #define _FP_FRAC_NEGP_4(X)      ((_FP_WS_TYPE)X##_f[3] < 0)
 #define _FP_FRAC_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs)
+#define _FP_FRAC_CLEAR_OVERP_4(fs,X)  (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs)
 
 #define _FP_FRAC_EQ_4(X,Y)                             \
  (X##_f[0] == Y##_f[0] && X##_f[1] == Y##_f[1]         \
index 592046bc90b4961a4ea9768cf0e27b5ee2813954..7b0206384cff21b410bbf9b0341168c28f4e2f4c 100644 (file)
@@ -97,11 +97,10 @@ do {                                                                \
        _FP_ROUND(wc, X);                                       \
        if (_FP_FRAC_OVERP_##wc(fs, X))                         \
          {                                                     \
-           _FP_FRAC_SRL_##wc(X, (_FP_WORKBITS+1));             \
+           _FP_FRAC_CLEAR_OVERP_##wc(fs, X);                   \
            X##_e++;                                            \
          }                                                     \
-       else                                                    \
-         _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                   \
+       _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);                     \
        if (X##_e >= _FP_EXPMAX_##fs)                           \
          {                                                     \
            /* overflow */                                      \
@@ -780,9 +779,8 @@ do {                                                                        \
                X##_e -= (_FP_W_TYPE_SIZE - rsize);                     \
        X##_e = rsize - X##_e - 1;                                      \
                                                                        \
-       r &= ~((rtype)1 << X##_e);                                      \
        if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e)    \
-         __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize);      \
+         __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);  \
        _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize);       \
        if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0)                       \
          _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));       \