https://gcc.gnu.org/g:092dcef93d40ff3dfed6c35001325bf522785c25

commit r16-756-g092dcef93d40ff3dfed6c35001325bf522785c25
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue May 20 08:20:16 2025 +0200

    libgcc: Small bitint_reduce_prec big-endian fixes
    
    The big-endian _BitInt support in libgcc was written without any
    testing and so I haven't discovered I've made one mistake in it
    (in multiple places).
    The bitint_reduce_prec function attempts to optimize inputs
    which have some larger precision but at runtime they are found
    to need smaller number of limbs.
    For little-endian that is handled just by returning smaller
    precision (or negative precision for signed), but for
    big-endian we need to adjust the passed in limb pointer so that
    when it returns smaller precision the argument still contains
    the least significant limbs for the returned precision.
    
    2025-05-20  Jakub Jelinek  <ja...@redhat.com>
    
            * libgcc2.c (bitint_reduce_prec): For big endian
            __LIBGCC_BITINT_ORDER__ use ++*p and --*p instead of
            ++p and --p.
            * soft-fp/bitint.h (bitint_reduce_prec): Likewise.

Diff:
---
 libgcc/libgcc2.c        | 10 +++++-----
 libgcc/soft-fp/bitint.h | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c
index 92cb79dc8f8d..faefff3730ca 100644
--- a/libgcc/libgcc2.c
+++ b/libgcc/libgcc2.c
@@ -1333,7 +1333,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
                  if (prec >= -1)
                    return -2;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-                 ++p;
+                 ++*p;
 #else
                  --i;
 #endif
@@ -1347,7 +1347,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
              if (prec >= -1)
                return -2;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-             ++p;
+             ++*p;
 #else
              --i;
 #endif
@@ -1358,7 +1358,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
              if ((Wtype) mslimb >= 0)
                {
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-                 --p;
+                 --*p;
 #endif
                  return prec - 1;
                }
@@ -1387,7 +1387,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
          if (prec == 0)
            return 1;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-         ++p;
+         ++*p;
 #else
          --i;
 #endif
@@ -1400,7 +1400,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
       if (prec == 0)
        return 1;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-      ++p;
+      ++*p;
 #else
       --i;
 #endif
diff --git a/libgcc/soft-fp/bitint.h b/libgcc/soft-fp/bitint.h
index 07a7bcbb0b99..8d489e65a622 100644
--- a/libgcc/soft-fp/bitint.h
+++ b/libgcc/soft-fp/bitint.h
@@ -76,7 +76,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
                  if (prec >= -1)
                    return -2;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-                 ++p;
+                 ++*p;
 #else
                  --i;
 #endif
@@ -90,7 +90,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
              if (prec >= -1)
                return -2;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-             ++p;
+             ++*p;
 #else
              --i;
 #endif
@@ -101,7 +101,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
              if ((BILtype) mslimb >= 0)
                {
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-                 --p;
+                 --*p;
 #endif
                  return prec - 1;
                }
@@ -130,7 +130,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
          if (prec == 0)
            return 1;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-         ++p;
+         ++*p;
 #else
          --i;
 #endif
@@ -143,7 +143,7 @@ bitint_reduce_prec (const UBILtype **p, SItype prec)
       if (prec == 0)
        return 1;
 #if __LIBGCC_BITINT_ORDER__ == __ORDER_BIG_ENDIAN__
-      ++p;
+      ++*p;
 #else
       --i;
 #endif

Reply via email to