From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id 02A903858D35 for ; Tue, 8 Nov 2022 18:31:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 02A903858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.96,148,1665475200"; d="scan'208";a="86606962" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa2.mentor.iphmx.com with ESMTP; 08 Nov 2022 10:31:32 -0800 IronPort-SDR: 5n7v0eKnbIWF2aURMx6bG1xkXg8v2alf6Pf13M/r44SR3apoCjt6WloDAbcgqPZxT6PUGrlKMh YJ5bEACwt/TLoQOGLINiL5HNUM5pEMB/dlGdQJEQTBUWRLD82/r9cfXa7m3XURhfl1mBx/W0sb vLkPwpEC4wWYXbFHjNiPI0lenVe+U9mz3XhXwAQeMPAKotAKDcnexjg0ItbiY1+CpYAtWJ23I1 an37uWGOmjKtVzNPzkdlthRQ7GhJzqVMOQvE+gcudvu6VPSrCiZitLF4itKXOIKeq9QQguQr1z fVQ= From: Thomas Schwinge To: CC: , , , , , , Thomas Schwinge Subject: [newlib] Generally make all 'long double complex' methods available in Date: Tue, 8 Nov 2022 19:31:08 +0100 Message-ID: <20221108183108.1233500-1-thomas@codesourcery.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-08.mgc.mentorg.com (139.181.222.8) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,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: ..., not just '#if defined(__CYGWIN__)'. (Exception: 'clog10l' which curre= ntly indeed is for Cygwin only.) This completes 2017-07-05 commit be3ca3947402827aa52709e677369bc7ad30aa1d "Fixed warnings for some long double complex methods" after Aditya Upadhyay= 's work on importing "Long double complex methods" from NetBSD. For example, this changes GCC/nvptx libgfortran 'configure' output as follo= ws: [...] checking for ccosf... yes checking for ccos... yes checking for ccosl... [-no-]{+yes+} [...] ..., and correspondingly GCC/nvptx 'nvptx-none/libgfortran/config.h' as follows: [...] /* Define to 1 if you have the `ccosl' function. */ -/* #undef HAVE_CCOSL */ +#define HAVE_CCOSL 1 [...] Similarly for 'ccoshl', 'cexpl', 'cpowl', 'csinl', 'csinhl', 'ctanl', 'ctan= hl', 'cacoshl', 'cacosl', 'casinhl', 'catanhl'. ('conjl', 'cprojl' are not currently being used in libgfortran.) This in turn simplifies GCC/nvptx 'libgfortran/intrinsics/c99_functions.c' compilation such that this files doesn't have to provide its own "Implementation of various C99 functions" for those, when in fact they're available in newlib libm. --- A few more words on why this is relevant for GCC. For example, 'cexpl' usually is provided by libm, but if it isn't, the open-coded replacement function in 'libgfortran/intrinsics/c99_functions.c' is effective if it holds that 'defined(HAVE_COSL) && defined(HAVE_SINL) && defined(HAVE_EXPL)': long double complex cexpl (long double complex z) { long double a, b; long double complex v; a =3D REALPART (z); b =3D IMAGPART (z); COMPLEX_ASSIGN (v, cosl (b), sinl (b)); return expl (a) * v; } This replacement code is active for current GCC/nvptx (... if no longer compiling GCC/nvptx libgfortran in "minimal" mode, 'LIBGFOR_MINIMAL', which I'm currently working on). Comparing the preceeding to the 'c99_functions.c.188t.sincos' dump, we see = for that function: __attribute__((nothrow, leaf, const)) complex long double cexpl (complex long double z) { long double b; long double a; long double _1; long double _2; long double _4; long double _5; long double _11; + complex long double sincostmp_13; [local count: 1073741824]: a_7 =3D REALPART_EXPR ; b_8 =3D IMAGPART_EXPR ; - _1 =3D cosl (b_8); - _2 =3D sinl (b_8); + sincostmp_13 =3D __builtin_cexpil (b_8); + _1 =3D REALPART_EXPR ; + _2 =3D IMAGPART_EXPR ; _11 =3D expl (a_7); _4 =3D _1 * _11; _5 =3D _2 * _11; REALPART_EXPR <> =3D _4; IMAGPART_EXPR <> =3D _5; return ; } That is, the 'cosl (b)', 'sinl (b)' sequence is replaced by '__builtin_cexpil'. That '__builtin_cexpil' is then later mapped back into: 'cexpl'. We've now got an infinitely-recursive 'cexpl' replacement function, "implemented via itself"; GCC/nvptx libgfortran assumes there is no 'cexpl' in libm, whereas this 'sincos' transformation does assume that there is. (..., which looks like an additional bug on its own.) At the PTX-level, this leads to the following: [...] // BEGIN GLOBAL FUNCTION DECL: cexpl .visible .func cexpl (.param.u64 %in_ar0, .param.f64 %in_ar1, .param.f6= 4 %in_ar2); // BEGIN GLOBAL FUNCTION DEF: cexpl .visible .func cexpl (.param.u64 %in_ar0, .param.f64 %in_ar1, .param.f6= 4 %in_ar2) { [...] call cexpl, (%out_arg1, %out_arg2, %out_arg3); [...] ret; } [...] // BEGIN GLOBAL FUNCTION DECL: cexpl .extern .func cexpl (.param.u64 %in_ar0, .param.f64 %in_ar1, .param.f64= %in_ar2); [...] We see the '.visible .func cexpl' declaration and definition for the libgfortran replacement function and in the same compilation unit also the '.extern .func cexpl' declaration that implicitly gets introduced via the 'sincos' transformation (via the GCC/nvptx back end emitting an explicit declaration of any function referenced), and 'ptxas' then (rightfully so) complains about that mismatch: ptxas c99_functions.o, line 35; error : Inconsistent redefinition of = variable 'cexpl' ptxas fatal : Ptx assembly aborted due to errors nvptx-as: ptxas returned 255 exit status make[2]: *** [c99_functions.lo] Error 1 --- newlib/libc/include/complex.h | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/newlib/libc/include/complex.h b/newlib/libc/include/complex.h index 0a3ea97ed..ad3028e4c 100644 --- a/newlib/libc/include/complex.h +++ b/newlib/libc/include/complex.h @@ -20,6 +20,7 @@ __BEGIN_DECLS /* 7.3.5.1 The cacos functions */ double complex cacos(double complex); float complex cacosf(float complex); +long double complex cacosl(long double complex); /* 7.3.5.2 The casin functions */ double complex casin(double complex); @@ -34,44 +35,54 @@ long double complex catanl(long double complex); /* 7.3.5.1 The ccos functions */ double complex ccos(double complex); float complex ccosf(float complex); +long double complex ccosl(long double complex); /* 7.3.5.1 The csin functions */ double complex csin(double complex); float complex csinf(float complex); +long double complex csinl(long double complex); /* 7.3.5.1 The ctan functions */ double complex ctan(double complex); float complex ctanf(float complex); +long double complex ctanl(long double complex); /* 7.3.6 Hyperbolic functions */ /* 7.3.6.1 The cacosh functions */ double complex cacosh(double complex); float complex cacoshf(float complex); +long double complex cacoshl(long double complex); /* 7.3.6.2 The casinh functions */ double complex casinh(double complex); float complex casinhf(float complex); +long double complex casinhl(long double complex); /* 7.3.6.3 The catanh functions */ double complex catanh(double complex); float complex catanhf(float complex); +long double complex catanhl(long double complex); /* 7.3.6.4 The ccosh functions */ double complex ccosh(double complex); float complex ccoshf(float complex); +long double complex ccoshl(long double complex); /* 7.3.6.5 The csinh functions */ double complex csinh(double complex); float complex csinhf(float complex); +long double complex csinhl(long double complex); /* 7.3.6.6 The ctanh functions */ double complex ctanh(double complex); float complex ctanhf(float complex); +long double complex ctanhl(long double complex); /* 7.3.7 Exponential and logarithmic functions */ /* 7.3.7.1 The cexp functions */ double complex cexp(double complex); float complex cexpf(float complex); +long double complex cexpl(long double complex); /* 7.3.7.2 The clog functions */ double complex clog(double complex); @@ -93,6 +104,7 @@ float cabsf(float complex) ; /* 7.3.8.2 The cpow functions */ double complex cpow(double complex, double complex); float complex cpowf(float complex, float complex); +long double complex cpowl(long double complex, long double complex); /* 7.3.8.3 The csqrt functions */ double complex csqrt(double complex); @@ -113,10 +125,12 @@ long double cimagl(long double complex); /* 7.3.9.3 The conj functions */ double complex conj(double complex); float complex conjf(float complex); +long double complex conjl(long double complex); /* 7.3.9.4 The cproj functions */ double complex cproj(double complex); float complex cprojf(float complex); +long double complex cprojl(long double complex); /* 7.3.9.5 The creal functions */ double creal(double complex); @@ -126,27 +140,10 @@ long double creall(long double complex); #if __GNU_VISIBLE double complex clog10(double complex); float complex clog10f(float complex); -#endif - -#if defined(__CYGWIN__) -long double complex cacosl(long double complex); -long double complex ccosl(long double complex); -long double complex csinl(long double complex); -long double complex ctanl(long double complex); -long double complex cacoshl(long double complex); -long double complex casinhl(long double complex); -long double complex catanhl(long double complex); -long double complex ccoshl(long double complex); -long double complex csinhl(long double complex); -long double complex ctanhl(long double complex); -long double complex cexpl(long double complex); -long double complex cpowl(long double complex, long double complex); -long double complex conjl(long double complex); -long double complex cprojl(long double complex); -#if __GNU_VISIBLE +# if defined(__CYGWIN__) long double complex clog10l(long double complex); +# endif #endif -#endif /* __CYGWIN__ */ __END_DECLS -- 2.25.1 ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=DFe 201, 8= 0634 M=FCnchen; Gesellschaft mit beschr=E4nkter Haftung; Gesch=E4ftsf=FChre= r: Thomas Heurung, Frank Th=FCrauf; Sitz der Gesellschaft: M=FCnchen; Regis= tergericht M=FCnchen, HRB 106955