(in_dso): Make sure the TLS variable access is not moved ahead of the
[kopensolaris-gnu/glibc.git] / soft-fp / op-common.h
index 012e76f..232604e 100644 (file)
@@ -89,11 +89,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 */                                      \
@@ -682,25 +681,27 @@ do {                                                                      \
   do {                                                                 \
     if (r)                                                             \
       {                                                                        \
+        unsigned rtype ur_;                                            \
        X##_c = FP_CLS_NORMAL;                                          \
                                                                        \
        if ((X##_s = (r < 0)))                                          \
          r = -r;                                                       \
                                                                        \
+       ur_ = (unsigned rtype) r;                                       \
        if (rsize <= _FP_W_TYPE_SIZE)                                   \
-         __FP_CLZ(X##_e, r);                                           \
+         __FP_CLZ(X##_e, ur_);                                         \
        else                                                            \
-         __FP_CLZ_2(X##_e, (_FP_W_TYPE)(r >> _FP_W_TYPE_SIZE),         \
-                    (_FP_W_TYPE)r);                                    \
+         __FP_CLZ_2(X##_e, (_FP_W_TYPE)(ur_ >> _FP_W_TYPE_SIZE),       \
+                    (_FP_W_TYPE)ur_);                                  \
        if (rsize < _FP_W_TYPE_SIZE)                                    \
                X##_e -= (_FP_W_TYPE_SIZE - rsize);                     \
        X##_e = rsize - X##_e - 1;                                      \
                                                                        \
        if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e)    \
-         __FP_FRAC_SRS_1(r, (X##_e - _FP_WFRACBITS_##fs), rsize);      \
-       r &= ~((rtype)1 << X##_e);                                      \
-       _FP_FRAC_DISASSEMBLE_##wc(X, ((unsigned rtype)r), rsize);       \
-       _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));         \
+         __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\
+       _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize);                       \
+       if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0)                       \
+         _FP_FRAC_SLL_##wc(X, (_FP_WFRACBITS_##fs - X##_e - 1));       \
       }                                                                        \
     else                                                               \
       {                                                                        \