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