From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 6C8203858D20 for ; Fri, 20 Jan 2023 14:21:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6C8203858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1674224459; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references; bh=doOqa9Yc35yPSkEiJZyzwbF3aQpWVHnT9N+b+VywzmA=; b=Udiix71Xb+pfCrhm7liGnjxL7jHPUOOMbclqnvs0aaSqzKZu9zFCX3QcLf+ztpBnkduPrT aDJnwBsppTPHGlVv5KBdbmw9rbf2VJ5qLD8VATbyZQrfjDoNX/bPs43QYEWYKZNJ997fE/ vOH9m/sUgWml+vo7mdVPycEPSCvLDdw= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-563-Hu0TXZbYNseILt0Hq44Iiw-1; Fri, 20 Jan 2023 09:20:58 -0500 X-MC-Unique: Hu0TXZbYNseILt0Hq44Iiw-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 370E83C1485C; Fri, 20 Jan 2023 14:20:58 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.223]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E57C8492C3C; Fri, 20 Jan 2023 14:20:57 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 30KEKsMA3386992 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 20 Jan 2023 15:20:55 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 30KEKrZT3386991; Fri, 20 Jan 2023 15:20:53 +0100 Date: Fri, 20 Jan 2023 15:20:53 +0100 From: Jakub Jelinek To: i.nixman@autistici.org Cc: Gcc Patches Subject: Re: libquadmath fix for 94756 and 87204 Message-ID: Reply-To: Jakub Jelinek References: <0e5ef1d5ce3e47e8431450ae8383a342@autistici.org> MIME-Version: 1.0 In-Reply-To: <0e5ef1d5ce3e47e8431450ae8383a342@autistici.org> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_NUMSUBJECT,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Fri, Jan 20, 2023 at 02:06:01PM +0000, i.nixman--- via Gcc-patches wrote: > I have fixed: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94756 > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87204 > > tested on i686-mingw-w64, x86_64-mingw-w64, and for i686 and x86_64 linux. > > could anyone check and apply please? > > > > best! > diff --git a/libquadmath/printf/gmp-impl.h b/libquadmath/printf/gmp-impl.h > index 94d88efc57f..af0719321dc 100644 > --- a/libquadmath/printf/gmp-impl.h > +++ b/libquadmath/printf/gmp-impl.h > @@ -33,15 +33,30 @@ MA 02111-1307, USA. */ > #define MAX(h,i) ((h) > (i) ? (h) : (i)) > #endif > > -#define BITS_PER_MP_LIMB (__SIZEOF_LONG__ * __CHAR_BIT__) > -#define BYTES_PER_MP_LIMB (BITS_PER_MP_LIMB / __CHAR_BIT__) > -typedef unsigned long int mp_limb_t; > -typedef long int mp_limb_signed_t; > +#ifdef __MINGW32__ > + /* for MinGW targets the Microsoft ABI requires that `long` > + types will always have 32 bit, because of that we will use > + `int32_t` for 32-bit builds and `int64_t` for 64-bit builds */ > +# if __x86_64__ > + typedef long long int mp_limb_signed_t; > + typedef unsigned long long int mp_limb_t; > +# define BITS_PER_MP_LIMB (__SIZEOF_LONG_LONG__ * __CHAR_BIT__) > +# else // !__x86_64__ > + typedef long int mp_limb_signed_t; > + typedef unsigned long int mp_limb_t; > +# define BITS_PER_MP_LIMB (__SIZEOF_LONG__ * __CHAR_BIT__) > +# endif // __x86_64__ > +#else // !__MINGW32__ > + typedef long int mp_limb_signed_t; > + typedef unsigned long int mp_limb_t; > +# define BITS_PER_MP_LIMB (__SIZEOF_LONG__ * __CHAR_BIT__) > +#endif // __MINGW32__ The above looks way too complicated for what it does. If all you want to change mp_limb* to be long long for mingw 64-bit, then just do: #if defined(__MINGW32__) && defined(__x86_64__) typedef unsigned long long int mp_limb_t; typedef long long int mp_limb_signed_t; #define BITS_PER_MP_LIMB (__SIZEOF_LONG_LONG__ * __CHAR_BIT__) #else typedef unsigned long int mp_limb_t; typedef long int mp_limb_signed_t; #define BITS_PER_MP_LIMB (__SIZEOF_LONG__ * __CHAR_BIT__) #endif and nothing else. Or port the changes from glibc stdlib/gmp.h etc. where there are macros to control what type is used for mp_limb_t etc. > -typedef mp_limb_t * mp_ptr; > -typedef const mp_limb_t * mp_srcptr; > -typedef long int mp_size_t; > -typedef long int mp_exp_t; > +#define BYTES_PER_MP_LIMB (BITS_PER_MP_LIMB / __CHAR_BIT__) > +typedef long int mp_size_t; > +typedef long int mp_exp_t; > +typedef mp_limb_t *mp_ptr; > +typedef const mp_limb_t *mp_srcptr; Why? As for the rest, it would help if you could list the exact glibc commits which you've ported to libquadmath and indicate if it is solely those and nothing else. The patch needs a ChangeLog entry too. > --- a/libquadmath/strtod/strtod_l.c > +++ b/libquadmath/strtod/strtod_l.c > @@ -200,7 +200,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, > > round_limb = retval[RETURN_LIMB_SIZE - 1]; > round_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB; > - for (i = 0; i < RETURN_LIMB_SIZE; ++i) > + for (i = 0; i < RETURN_LIMB_SIZE - 1; ++i) > more_bits |= retval[i] != 0; > MPN_ZERO (retval, RETURN_LIMB_SIZE); > } > @@ -215,9 +215,14 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, > more_bits |= ((round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) > != 0); > > - (void) mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB], > - RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB), > - shift % BITS_PER_MP_LIMB); > + /* mpn_rshift requires 0 < shift < BITS_PER_MP_LIMB. */ > + if ((shift % BITS_PER_MP_LIMB) != 0) > + (void) mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB], > + RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB), > + shift % BITS_PER_MP_LIMB); > + else > + for (i = 0; i < RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB); i++) > + retval[i] = retval[i + (shift / BITS_PER_MP_LIMB)]; > MPN_ZERO (&retval[RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB)], > shift / BITS_PER_MP_LIMB); > } > @@ -276,7 +281,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, > } > } > > - if (exponent > MAX_EXP) > + if (exponent >= MAX_EXP) > goto overflow; > > #ifdef HAVE_FENV_H > @@ -308,7 +313,7 @@ round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, > } > #endif > > - if (exponent > MAX_EXP) > + if (exponent >= MAX_EXP) > overflow: > return overflow_value (negative); > > @@ -688,7 +693,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group) > if (endptr != NULL) > *endptr = (STRING_TYPE *) cp; > > - return retval; > + return negative ? -retval : retval; > } > > /* It is really a text we do not recognize. */ > @@ -1193,7 +1198,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group) > if (__builtin_expect (exponent > MAX_10_EXP + 1 - (intmax_t) int_no, 0)) > return overflow_value (negative); > > - if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 1), 0)) > + if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 2), 0)) > return underflow_value (negative); > > if (int_no > 0) > @@ -1360,7 +1365,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group) > > assert (dig_no > int_no > && exponent <= 0 > - && exponent >= MIN_10_EXP - (DIG + 1)); > + && exponent >= MIN_10_EXP - (DIG + 2)); > > /* We need to compute MANT_DIG - BITS fractional bits that lie > within the mantissa of the result, the following bit for > @@ -1651,8 +1656,8 @@ ____STRTOF_INTERNAL (nptr, endptr, group) > d1 = den[densize - 2]; > > /* The division does not work if the upper limb of the two-limb > - numerator is greater than the denominator. */ > - if (mpn_cmp (num, &den[densize - numsize], numsize) > 0) > + numerator is greater or equal to than the denominator. */ > + if (mpn_cmp (num, &den[densize - numsize], numsize) >= 0) > num[numsize++] = 0; > > if (numsize < densize) > @@ -1761,7 +1766,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group) > got_limb; > } > > - for (i = densize; num[i] == 0 && i >= 0; --i) > + for (i = densize; i >= 0 && num[i] == 0; --i) > ; > return round_and_return (retval, exponent - 1, negative, > quot, BITS_PER_MP_LIMB - 1 - used, Jakub