From patchwork Fri Jun 24 15:30:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 1648053 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=rUVDo25c; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LV1LF3sD5z9s2R for ; Sat, 25 Jun 2022 01:31:16 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D27C93840C15 for ; Fri, 24 Jun 2022 15:31:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D27C93840C15 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1656084673; bh=5khqPP/SVtYzNV4g9GsaZ+Ftnrc0958BUOPL/ZpscaQ=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=rUVDo25cciqtuFUW9rVIq9m72RsaD++1Y4aj3uUNAjzGjiwjfnT3/hXi3JdhCRegz +WzPu0IxaoneS88bCt6U1DoVg020Q4DqcEc4nqZo63ZN7mLXuIDyVpSgQfiyp2sm1H AGE5suBHjGRXTXAvMVS+/ekWqbgtv5FmoMVT41pU= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 F3B32384147B for ; Fri, 24 Jun 2022 15:30:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org F3B32384147B 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 To: gcc-patches@gcc.gnu.org, fortran@gcc.gnu.org Subject: [PATCH] libgfortran: Avoid using libquadmath powerpc64le fixes Message-ID: 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-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=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jakub Jelinek via Gcc-patches From: Jakub Jelinek Reply-To: Jakub Jelinek Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" 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. Jakub --- 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