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.133.124]) by sourceware.org (Postfix) with ESMTPS id 208E5384147B for ; Fri, 24 Jun 2022 15:30:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 208E5384147B Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-142-qXl8n8X9M6qMoJpHn0EbwA-1; Fri, 24 Jun 2022 11:30:52 -0400 X-MC-Unique: qXl8n8X9M6qMoJpHn0EbwA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1C71B8032EE; Fri, 24 Jun 2022 15:30:52 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.104]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D0D811121314; Fri, 24 Jun 2022 15:30:51 +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 25OFUd22002533 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 24 Jun 2022 17:30:39 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 25OFUcN4002532; Fri, 24 Jun 2022 17:30:38 +0200 Date: Fri, 24 Jun 2022 17:30:38 +0200 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org Subject: [PATCH] libgfortran: Avoid using libquadmath powerpc64le fixes Message-ID: Reply-To: Jakub Jelinek MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 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=-3.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jun 2022 15:30:57 -0000 Hi! Testing this on powerpc64le-linux revealed some problems with the patch when gcc is configured against glibc 2.26 through 2.31. Here is incremental patch (against the v2 patch) that fixes it. Built and tested on powerpc64le-linux with glibc 2.28, ok for trunk? 2022-06-24 Jakub Jelinek * kinds-override.h (GFC_REAL_17, GFC_COMPLEX_17, GFC_REAL_17_HUGE, GFC_REAL_17_LITERAL_SUFFIX,GFC_REAL_17_LITERAL): Define differently if HAVE__FLOAT128 is defined. * intrinsics/erfc_scaled.c (_THRESH, _M_2_SQRTPI, _ERFC, _EXP): Likewise. * m4/mtype.m4: Use f128 suffix for GFC_REAL_17 if not POWER_IEEE128 and HAVE__FLOAT128 is defined. * io/read.c (convert_real): Handle HAVE__FLOAT128 differently if POWER_IEEE128 is not defined. * io/transfer128.c (tmp1, tmp2): Likewise. * io/write_float.def (gfor_strfromf128): Define even for GFC_REAL_17 if POWERPC_IEEE128 isn't defined and HAVE__FLOAT128 is. (DTOA2Q, FDTOA2Q): Define differently for GFC_REAL_17 if POWERPC_IEEE128 isn't defined and HAVE__FLOAT128 is. * generated/norm2_r17.c: Regenerated. * generated/bessel_r17.c: Regenerated. --- libgfortran/kinds-override.h.jj 2022-06-22 12:40:05.170224299 +0200 +++ libgfortran/kinds-override.h 2022-06-24 14:19:00.886823630 +0200 @@ -34,13 +34,24 @@ see the files COPYING3 and COPYING.RUNTI /* Keep these conditions on one line so grep can filter it out. */ #if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && __SIZEOF_LONG_DOUBLE__ == 16 +#ifdef HAVE__FLOAT128 +typedef _Float128 GFC_REAL_17; +typedef _Complex _Float128 GFC_COMPLEX_17; +#else typedef __float128 GFC_REAL_17; typedef _Complex float __attribute__((mode(KC))) GFC_COMPLEX_17; +#endif #define HAVE_GFC_REAL_17 #define HAVE_GFC_COMPLEX_17 +#ifdef HAVE__FLOAT128 +#define GFC_REAL_17_HUGE 1.18973149535723176508575932662800702e4932f128 +#define GFC_REAL_17_LITERAL_SUFFIX f128 +#define GFC_REAL_17_LITERAL(X) (X ## f128) +#else #define GFC_REAL_17_HUGE 1.18973149535723176508575932662800702e4932q #define GFC_REAL_17_LITERAL_SUFFIX q #define GFC_REAL_17_LITERAL(X) (X ## q) +#endif #define GFC_REAL_17_DIGITS 113 #define GFC_REAL_17_RADIX 2 #endif --- libgfortran/intrinsics/erfc_scaled.c.jj 2022-06-24 07:38:55.640826314 -0400 +++ libgfortran/intrinsics/erfc_scaled.c 2022-06-24 09:10:05.311263353 -0400 @@ -147,12 +147,15 @@ ERFC_SCALED(16) /* For quadruple-precision, netlib's implementation is not accurate enough. We provide another one. */ -# define _THRESH -106.566990228185312813205074546585730Q -# define _M_2_SQRTPI M_2_SQRTPIq +# define _THRESH GFC_REAL_17_LITERAL(-106.566990228185312813205074546585730) +# define _M_2_SQRTPI GFC_REAL_17_LITERAL(M_2_SQRTPI) # define _INF __builtin_inff128() # ifdef POWER_IEEE128 # define _ERFC(x) __erfcieee128(x) # define _EXP(x) __expieee128(x) +# elif defined(HAVE__FLOAT128) +# define _ERFC(x) erfcf128(x) +# define _EXP(x) expf128(x) # else # define _ERFC(x) erfcq(x) # define _EXP(x) expq(x) --- libgfortran/m4/mtype.m4.jj 2022-06-22 13:52:56.987824469 +0200 +++ libgfortran/m4/mtype.m4 2022-06-24 14:21:40.435769659 +0200 @@ -15,6 +15,8 @@ ifelse(kind,17,`1 /* FIXME: figure this define(mathfunc_macro,`ifelse(kind,17,dnl `#if defined(POWER_IEEE128) #define MATHFUNC(funcname) __ ## funcname ## ieee128 +#elif defined(HAVE__FLOAT128) +#define MATHFUNC(funcname) funcname ## f128 #else #define MATHFUNC(funcname) funcname ## q #endif',dnl --- libgfortran/io/read.c.jj 2022-06-22 14:13:35.351567588 +0200 +++ libgfortran/io/read.c 2022-06-24 14:29:43.199555539 +0200 @@ -203,6 +203,8 @@ convert_real (st_parameter_dt *dtp, void case 17: # if defined(POWER_IEEE128) *((GFC_REAL_17*) dest) = __strtoieee128 (buffer, &endptr); +# elif defined(HAVE__FLOAT128) + *((GFC_REAL_17*) dest) = strtof128 (buffer, &endptr); # else *((GFC_REAL_17*) dest) = __qmath_(strtoflt128) (buffer, &endptr); # endif --- libgfortran/io/transfer128.c.jj 2022-06-22 13:20:31.657252114 +0200 +++ libgfortran/io/transfer128.c 2022-06-24 14:31:18.616329211 +0200 @@ -67,7 +67,8 @@ export_proto(transfer_complex128_write); that there is a non-weakref dependence if the quadmath functions are used. That avoids segfault when libquadmath is statically linked. */ # ifndef GFC_REAL_16_IS__FLOAT128 -# if !defined(HAVE_GFC_REAL_17) || !defined(POWER_IEEE128) +# if !defined(HAVE_GFC_REAL_17) \ + || (!defined(POWER_IEEE128) && !defined(HAVE__FLOAT128)) static void __attribute__((used)) *tmp1 = strtoflt128; static void __attribute__((used)) *tmp2 = quadmath_snprintf; # endif --- libgfortran/io/write_float.def.jj 2022-06-24 07:38:55.640826314 -0400 +++ libgfortran/io/write_float.def 2022-06-24 09:13:48.653519940 -0400 @@ -837,7 +837,9 @@ snprintf (buffer, size, "%+-#.*e", (prec #define DTOA2L(prec,val) \ snprintf (buffer, size, "%+-#.*Le", (prec), (val)) -#ifdef GFC_REAL_16_IS__FLOAT128 +#if defined(GFC_REAL_16_IS__FLOAT128) \ + || (defined(HAVE_GFC_REAL_17) && !defined(POWER_IEEE128) \ + && defined(HAVE__FLOAT128)) /* strfromf128 unfortunately doesn't allow +, - and # modifiers nor .* (only allows .number). For +, work around it by adding leading + manually for !signbit values. For - I don't see why @@ -870,6 +872,9 @@ gfor_strfromf128 (char *buffer, size_t s } return ret; } +#endif + +#ifdef GFC_REAL_16_IS__FLOAT128 # define DTOA2F128(prec,val) \ gfor_strfromf128 (buffer, size, 'e', (prec), (val)) #endif @@ -878,6 +883,9 @@ gfor_strfromf128 (buffer, size, 'e', (pr # if defined(POWER_IEEE128) # define DTOA2Q(prec,val) \ __snprintfieee128 (buffer, size, "%+-#.*Le", (prec), (val)) +# elif defined(HAVE__FLOAT128) +# define DTOA2Q(prec,val) \ +gfor_strfromf128 (buffer, size, 'e', (prec), (val)) # else # define DTOA2Q(prec,val) \ quadmath_snprintf (buffer, size, "%+-#.*Qe", (prec), (val)) @@ -905,6 +913,9 @@ gfor_strfromf128 (buffer, size, 'f', (pr # if defined(POWER_IEEE128) # define FDTOA2Q(prec,val) \ __snprintfieee128 (buffer, size, "%+-#.*Lf", (prec), (val)) +# elif defined(HAVE__FLOAT128) +# define FDTOA2Q(prec,val) \ +gfor_strfromf128 (buffer, size, 'f', (prec), (val)) # else # define FDTOA2Q(prec,val) \ quadmath_snprintf (buffer, size, "%+-#.*Qf", (prec), (val)) --- libgfortran/generated/norm2_r17.c.jj 2022-01-11 23:38:13.062640651 +0100 +++ libgfortran/generated/norm2_r17.c 2022-06-24 14:22:30.614123682 +0200 @@ -31,6 +31,8 @@ see the files COPYING3 and COPYING.RUNTI #if defined(POWER_IEEE128) #define MATHFUNC(funcname) __ ## funcname ## ieee128 +#elif defined(HAVE__FLOAT128) +#define MATHFUNC(funcname) funcname ## f128 #else #define MATHFUNC(funcname) funcname ## q #endif --- libgfortran/generated/bessel_r17.c.jj 2022-01-11 23:38:13.057640721 +0100 +++ libgfortran/generated/bessel_r17.c 2022-06-24 14:22:11.108374785 +0200 @@ -30,6 +30,8 @@ see the files COPYING3 and COPYING.RUNTI #if defined(POWER_IEEE128) #define MATHFUNC(funcname) __ ## funcname ## ieee128 +#elif defined(HAVE__FLOAT128) +#define MATHFUNC(funcname) funcname ## f128 #else #define MATHFUNC(funcname) funcname ## q #endif Jakub