]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - soft-fp/op-4.h
support: Invent verbose_printf macro
[thirdparty/glibc.git] / soft-fp / op-4.h
index 12731e2e78e211eacd68ecd0ee12ffc3f172babc..65a0644326cb141046602f2ae63047a766cf94f9 100644 (file)
@@ -1,6 +1,6 @@
 /* Software floating-point emulation.
    Basic four-word fraction declaration and manipulation.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson (rth@cygnus.com),
                  Jakub Jelinek (jj@ultra.linux.cz),
@@ -30,6 +30,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef SOFT_FP_OP_4_H
+#define SOFT_FP_OP_4_H 1
+
 #define _FP_FRAC_DECL_4(X)     _FP_W_TYPE X##_f[4]
 #define _FP_FRAC_COPY_4(D, S)                  \
   (D##_f[0] = S##_f[0], D##_f[1] = S##_f[1],   \
   do                                                           \
     {                                                          \
       int _FP_FRAC_SRS_4_sticky;                               \
-      _FP_FRAC_SRST_4 (X, _FP_FRAC_SRS_4_sticky, N, size);     \
+      _FP_FRAC_SRST_4 (X, _FP_FRAC_SRS_4_sticky, (N), (size)); \
       X##_f[0] |= _FP_FRAC_SRS_4_sticky;                       \
     }                                                          \
   while (0)
   do                                           \
     {                                          \
       if (X##_f[3])                            \
-       __FP_CLZ (R, X##_f[3]);                 \
+       __FP_CLZ ((R), X##_f[3]);               \
       else if (X##_f[2])                       \
        {                                       \
-         __FP_CLZ (R, X##_f[2]);               \
-         R += _FP_W_TYPE_SIZE;                 \
+         __FP_CLZ ((R), X##_f[2]);             \
+         (R) += _FP_W_TYPE_SIZE;               \
        }                                       \
       else if (X##_f[1])                       \
        {                                       \
-         __FP_CLZ (R, X##_f[1]);               \
-         R += _FP_W_TYPE_SIZE*2;               \
+         __FP_CLZ ((R), X##_f[1]);             \
+         (R) += _FP_W_TYPE_SIZE*2;             \
        }                                       \
       else                                     \
        {                                       \
-         __FP_CLZ (R, X##_f[0]);               \
-         R += _FP_W_TYPE_SIZE*3;               \
+         __FP_CLZ ((R), X##_f[0]);             \
+         (R) += _FP_W_TYPE_SIZE*3;             \
        }                                       \
     }                                          \
   while (0)
     {                                                                  \
       _FP_FRAC_DECL_8 (_FP_MUL_MEAT_4_wide_z);                         \
                                                                        \
-      _FP_MUL_MEAT_DW_4_wide (wfracbits, _FP_MUL_MEAT_4_wide_z,                \
+      _FP_MUL_MEAT_DW_4_wide ((wfracbits), _FP_MUL_MEAT_4_wide_z,      \
                              X, Y, doit);                              \
                                                                        \
       /* Normalize since we know where the msb of the multiplicands    \
         were (bit B), we know that the msb of the of the product is    \
         at either 2B or 2B-1.  */                                      \
-      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_wide_z, wfracbits-1, 2*wfracbits);        \
+      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_wide_z, (wfracbits)-1,            \
+                     2*(wfracbits));                                   \
       __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 3),  \
                       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 2),      \
                       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_wide_z, 1),      \
     {                                                                  \
       _FP_FRAC_DECL_8 (_FP_MUL_MEAT_4_gmp_z);                          \
                                                                        \
-      _FP_MUL_MEAT_DW_4_gmp (wfracbits, _FP_MUL_MEAT_4_gmp_z, X, Y);   \
+      _FP_MUL_MEAT_DW_4_gmp ((wfracbits), _FP_MUL_MEAT_4_gmp_z, X, Y); \
                                                                        \
       /* Normalize since we know where the msb of the multiplicands    \
         were (bit B), we know that the msb of the of the product is    \
         at either 2B or 2B-1.  */                                      \
-      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_gmp_z, wfracbits-1, 2*wfracbits); \
+      _FP_FRAC_SRS_8 (_FP_MUL_MEAT_4_gmp_z, (wfracbits)-1,             \
+                     2*(wfracbits));                                   \
       __FP_FRAC_SET_4 (R, _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 3),   \
                       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 2),       \
                       _FP_FRAC_WORD_8 (_FP_MUL_MEAT_4_gmp_z, 1),       \
     {                                                                  \
       while (q)                                                                \
        {                                                               \
-         T##_f[3] = S##_f[3] + q;                                      \
+         T##_f[3] = S##_f[3] + (q);                                    \
          if (T##_f[3] <= X##_f[3])                                     \
            {                                                           \
-             S##_f[3] = T##_f[3] + q;                                  \
+             S##_f[3] = T##_f[3] + (q);                                \
              X##_f[3] -= T##_f[3];                                     \
-             R##_f[3] += q;                                            \
+             R##_f[3] += (q);                                          \
            }                                                           \
          _FP_FRAC_SLL_4 (X, 1);                                        \
-         q >>= 1;                                                      \
+         (q) >>= 1;                                                    \
        }                                                               \
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                     \
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                   \
       while (q)                                                                \
        {                                                               \
-         T##_f[2] = S##_f[2] + q;                                      \
+         T##_f[2] = S##_f[2] + (q);                                    \
          T##_f[3] = S##_f[3];                                          \
          if (T##_f[3] < X##_f[3]                                       \
              || (T##_f[3] == X##_f[3] && T##_f[2] <= X##_f[2]))        \
            {                                                           \
-             S##_f[2] = T##_f[2] + q;                                  \
+             S##_f[2] = T##_f[2] + (q);                                \
              S##_f[3] += (T##_f[2] > S##_f[2]);                        \
              __FP_FRAC_DEC_2 (X##_f[3], X##_f[2],                      \
                               T##_f[3], T##_f[2]);                     \
-             R##_f[2] += q;                                            \
+             R##_f[2] += (q);                                          \
            }                                                           \
          _FP_FRAC_SLL_4 (X, 1);                                        \
-         q >>= 1;                                                      \
+         (q) >>= 1;                                                    \
        }                                                               \
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                     \
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                   \
       while (q)                                                                \
        {                                                               \
-         T##_f[1] = S##_f[1] + q;                                      \
+         T##_f[1] = S##_f[1] + (q);                                    \
          T##_f[2] = S##_f[2];                                          \
          T##_f[3] = S##_f[3];                                          \
          if (T##_f[3] < X##_f[3]                                       \
                      || (T##_f[2] == X##_f[2]                          \
                          && T##_f[1] <= X##_f[1]))))                   \
            {                                                           \
-             S##_f[1] = T##_f[1] + q;                                  \
+             S##_f[1] = T##_f[1] + (q);                                \
              S##_f[2] += (T##_f[1] > S##_f[1]);                        \
              S##_f[3] += (T##_f[2] > S##_f[2]);                        \
              __FP_FRAC_DEC_3 (X##_f[3], X##_f[2], X##_f[1],            \
                               T##_f[3], T##_f[2], T##_f[1]);           \
-             R##_f[1] += q;                                            \
+             R##_f[1] += (q);                                          \
            }                                                           \
          _FP_FRAC_SLL_4 (X, 1);                                        \
-         q >>= 1;                                                      \
+         (q) >>= 1;                                                    \
        }                                                               \
-      q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                     \
-      while (q != _FP_WORK_ROUND)                                      \
+      (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1);                   \
+      while ((q) != _FP_WORK_ROUND)                                    \
        {                                                               \
-         T##_f[0] = S##_f[0] + q;                                      \
+         T##_f[0] = S##_f[0] + (q);                                    \
          T##_f[1] = S##_f[1];                                          \
          T##_f[2] = S##_f[2];                                          \
          T##_f[3] = S##_f[3];                                          \
          if (_FP_FRAC_GE_4 (X, T))                                     \
            {                                                           \
-             S##_f[0] = T##_f[0] + q;                                  \
+             S##_f[0] = T##_f[0] + (q);                                \
              S##_f[1] += (T##_f[0] > S##_f[0]);                        \
              S##_f[2] += (T##_f[1] > S##_f[1]);                        \
              S##_f[3] += (T##_f[2] > S##_f[2]);                        \
              _FP_FRAC_DEC_4 (X, T);                                    \
-             R##_f[0] += q;                                            \
+             R##_f[0] += (q);                                          \
            }                                                           \
          _FP_FRAC_SLL_4 (X, 1);                                        \
-         q >>= 1;                                                      \
+         (q) >>= 1;                                                    \
        }                                                               \
       if (!_FP_FRAC_ZEROP_4 (X))                                       \
        {                                                               \
 #endif
 
 #ifndef __FP_FRAC_SUB_3
-# define __FP_FRAC_SUB_3(r2, r1, r0, x2, x1, x0, y2, y1, y0)   \
-  do                                                           \
-    {                                                          \
-      _FP_W_TYPE __FP_FRAC_SUB_3_c1, __FP_FRAC_SUB_3_c2;       \
-      r0 = x0 - y0;                                            \
-      __FP_FRAC_SUB_3_c1 = r0 > x0;                            \
-      r1 = x1 - y1;                                            \
-      __FP_FRAC_SUB_3_c2 = r1 > x1;                            \
-      r1 -= __FP_FRAC_SUB_3_c1;                                        \
-      __FP_FRAC_SUB_3_c2 |= __FP_FRAC_SUB_3_c1 && (y1 == x1);  \
-      r2 = x2 - y2 - __FP_FRAC_SUB_3_c2;                       \
-    }                                                          \
+# define __FP_FRAC_SUB_3(r2, r1, r0, x2, x1, x0, y2, y1, y0)    \
+  do                                                            \
+    {                                                           \
+      _FP_W_TYPE __FP_FRAC_SUB_3_tmp[2];                        \
+      _FP_W_TYPE __FP_FRAC_SUB_3_c1, __FP_FRAC_SUB_3_c2;        \
+      __FP_FRAC_SUB_3_tmp[0] = x0 - y0;                         \
+      __FP_FRAC_SUB_3_c1 = __FP_FRAC_SUB_3_tmp[0] > x0;         \
+      __FP_FRAC_SUB_3_tmp[1] = x1 - y1;                         \
+      __FP_FRAC_SUB_3_c2 = __FP_FRAC_SUB_3_tmp[1] > x1;         \
+      __FP_FRAC_SUB_3_tmp[1] -= __FP_FRAC_SUB_3_c1;             \
+      __FP_FRAC_SUB_3_c2 |= __FP_FRAC_SUB_3_c1 && (y1 == x1);   \
+      r2 = x2 - y2 - __FP_FRAC_SUB_3_c2;                        \
+      r1 = __FP_FRAC_SUB_3_tmp[1];                              \
+      r0 = __FP_FRAC_SUB_3_tmp[0];                              \
+    }                                                           \
   while (0)
 #endif
 
 #ifndef __FP_FRAC_SUB_4
 # define __FP_FRAC_SUB_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) \
-  do                                                                   \
-    {                                                                  \
-      _FP_W_TYPE __FP_FRAC_SUB_4_c1, __FP_FRAC_SUB_4_c2;               \
-      _FP_W_TYPE __FP_FRAC_SUB_4_c3;                                   \
-      r0 = x0 - y0;                                                    \
-      __FP_FRAC_SUB_4_c1 = r0 > x0;                                    \
-      r1 = x1 - y1;                                                    \
-      __FP_FRAC_SUB_4_c2 = r1 > x1;                                    \
-      r1 -= __FP_FRAC_SUB_4_c1;                                                \
-      __FP_FRAC_SUB_4_c2 |= __FP_FRAC_SUB_4_c1 && (y1 == x1);          \
-      r2 = x2 - y2;                                                    \
-      __FP_FRAC_SUB_4_c3 = r2 > x2;                                    \
-      r2 -= __FP_FRAC_SUB_4_c2;                                                \
-      __FP_FRAC_SUB_4_c3 |= __FP_FRAC_SUB_4_c2 && (y2 == x2);          \
-      r3 = x3 - y3 - __FP_FRAC_SUB_4_c3;                               \
-    }                                                                  \
+  do                                                                     \
+    {                                                                    \
+      _FP_W_TYPE __FP_FRAC_SUB_4_tmp[3];                                 \
+      _FP_W_TYPE __FP_FRAC_SUB_4_c1, __FP_FRAC_SUB_4_c2;                 \
+      _FP_W_TYPE __FP_FRAC_SUB_4_c3;                                     \
+      __FP_FRAC_SUB_4_tmp[0] = x0 - y0;                                  \
+      __FP_FRAC_SUB_4_c1 = __FP_FRAC_SUB_4_tmp[0] > x0;                  \
+      __FP_FRAC_SUB_4_tmp[1] = x1 - y1;                                  \
+      __FP_FRAC_SUB_4_c2 = __FP_FRAC_SUB_4_tmp[1] > x1;                  \
+      __FP_FRAC_SUB_4_tmp[1] -= __FP_FRAC_SUB_4_c1;                      \
+      __FP_FRAC_SUB_4_c2 |= __FP_FRAC_SUB_4_c1 && (y1 == x1);            \
+      __FP_FRAC_SUB_4_tmp[2] = x2 - y2;                                  \
+      __FP_FRAC_SUB_4_c3 = __FP_FRAC_SUB_4_tmp[2] > x2;                  \
+      __FP_FRAC_SUB_4_tmp[2] -= __FP_FRAC_SUB_4_c2;                      \
+      __FP_FRAC_SUB_4_c3 |= __FP_FRAC_SUB_4_c2 && (y2 == x2);            \
+      r3 = x3 - y3 - __FP_FRAC_SUB_4_c3;                                 \
+      r2 = __FP_FRAC_SUB_4_tmp[2];                                       \
+      r1 = __FP_FRAC_SUB_4_tmp[1];                                       \
+      r0 = __FP_FRAC_SUB_4_tmp[0];                                       \
+    }                                                                    \
   while (0)
 #endif
 
 #define _FP_FRAC_ASSEMBLE_4(r, X, rsize)                               \
   do                                                                   \
     {                                                                  \
-      if (rsize <= _FP_W_TYPE_SIZE)                                    \
-       r = X##_f[0];                                                   \
-      else if (rsize <= 2*_FP_W_TYPE_SIZE)                             \
+      if ((rsize) <= _FP_W_TYPE_SIZE)                                  \
+       (r) = X##_f[0];                                                 \
+       else if ((rsize) <= 2*_FP_W_TYPE_SIZE)                          \
        {                                                               \
-         r = X##_f[1];                                                 \
-         r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);    \
-         r += X##_f[0];                                                \
+         (r) = X##_f[1];                                               \
+         (r) = ((rsize) <= _FP_W_TYPE_SIZE                             \
+                ? 0                                                    \
+                : (r) << _FP_W_TYPE_SIZE);                             \
+         (r) += X##_f[0];                                              \
        }                                                               \
       else                                                             \
        {                                                               \
          /* I'm feeling lazy so we deal with int == 3words             \
             (implausible) and int == 4words as a single case.  */      \
-         r = X##_f[3];                                                 \
-         r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);    \
-         r += X##_f[2];                                                \
-         r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);    \
-         r += X##_f[1];                                                \
-         r = (rsize <= _FP_W_TYPE_SIZE ? 0 : r << _FP_W_TYPE_SIZE);    \
-         r += X##_f[0];                                                \
+         (r) = X##_f[3];                                               \
+         (r) = ((rsize) <= _FP_W_TYPE_SIZE                             \
+                ? 0                                                    \
+                : (r) << _FP_W_TYPE_SIZE);                             \
+         (r) += X##_f[2];                                              \
+         (r) = ((rsize) <= _FP_W_TYPE_SIZE                             \
+                ? 0                                                    \
+                : (r) << _FP_W_TYPE_SIZE);                             \
+         (r) += X##_f[1];                                              \
+         (r) = ((rsize) <= _FP_W_TYPE_SIZE                             \
+                ? 0                                                    \
+                : (r) << _FP_W_TYPE_SIZE);                             \
+         (r) += X##_f[0];                                              \
        }                                                               \
     }                                                                  \
   while (0)
 /* Move an integer of size rsize into X's fractional part. We rely on
    the _f[] array consisting of words of size _FP_W_TYPE_SIZE to avoid
    having to mask the values we store into it.  */
-#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)                            \
-  do                                                                   \
-    {                                                                  \
-      X##_f[0] = r;                                                    \
-      X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE);        \
-      X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \
-      X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \
-    }                                                                  \
+#define _FP_FRAC_DISASSEMBLE_4(X, r, rsize)    \
+  do                                           \
+    {                                          \
+      X##_f[0] = (r);                          \
+      X##_f[1] = ((rsize) <= _FP_W_TYPE_SIZE   \
+                 ? 0                           \
+                 : (r) >> _FP_W_TYPE_SIZE);    \
+      X##_f[2] = ((rsize) <= 2*_FP_W_TYPE_SIZE \
+                 ? 0                           \
+                 : (r) >> 2*_FP_W_TYPE_SIZE);  \
+      X##_f[3] = ((rsize) <= 3*_FP_W_TYPE_SIZE \
+                 ? 0                           \
+                 : (r) >> 3*_FP_W_TYPE_SIZE);  \
+    }                                          \
   while (0)
 
 #define _FP_FRAC_COPY_4_1(D, S)                        \
   while (0)
 
 #define _FP_FRAC_COPY_4_4(D, S)        _FP_FRAC_COPY_4 (D, S)
+
+#endif /* !SOFT_FP_OP_4_H */