From patchwork Wed Sep 14 16:31:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Paul E. Murphy" X-Patchwork-Id: 15631 X-Patchwork-Delegate: joseph@codesourcery.com Received: (qmail 59158 invoked by alias); 14 Sep 2016 16:31:48 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 58595 invoked by uid 89); 14 Sep 2016 16:31:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.6 required=5.0 tests=AWL, BAYES_50, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=1993, sc, drepper, 1.6 X-HELO: mx0a-001b2d01.pphosted.com X-IBM-Helo: d03dlp03.boulder.ibm.com X-IBM-MailFrom: murphyp@linux.vnet.ibm.com Subject: Re: [PATCH] Make ldexpF generic. References: Cc: Joseph Myers From: "Paul E. Murphy" To: "libc-alpha@sourceware.org" Date: Wed, 14 Sep 2016 11:31:31 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16091416-0020-0000-0000-000009C81B87 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00005760; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000185; SDB=6.00757643; UDB=6.00359373; IPR=6.00531153; BA=6.00004726; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00012670; XFM=3.00000011; UTC=2016-09-14 16:31:34 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16091416-0021-0000-0000-0000557B6BC2 Message-Id: <9186f43a-2749-70e9-809c-400137f35d57@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-09-14_08:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609020000 definitions=main-1609140221 On 09/13/2016 05:56 PM, Joseph Myers wrote: > On Tue, 13 Sep 2016, Paul E. Murphy wrote: > >> This one is a little more tricky since it is built both for >> libm and libc, and exports multiple aliases. >> >> To simplify aliasing, a new macro is introduced which handles >> aliasing to two symbols. By default, it just applies >> declare_mgen_alias to both target symbols. >> >> Likewise, the makefile is tweaked a little to generate >> templates for shared files too, and a new rule is added >> to build m_*.c objects from the objpfx directory. > > Could you describe the testing done, in particular the configurations for > which you've confirmed unchanged code generation for the relevant objects? I'd manually checked the symbols and text sections. Which, as usual, turns out to be error prone. I put this against the same set of automated tests as the other generated patches (including both m_* and s_* objects). This is missing the second alias for scalbn on NO_LONG_DOUBLE machines. Likewise, I used the s_catan* objects to verify removing the redundant macro definition does not alter generation. Attached is an updated patch. The only substantial change is adding an extra weak alias for to2 for the new macro when building on a NO_LONG_DOUBLE machine. It has been verified on multiple platforms as described in the amended log. From db3629188e4292fe1e259109a3264d3eb738dbe5 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Thu, 8 Sep 2016 08:48:08 -0500 Subject: [PATCH] Make ldexpF generic. This one is a little more tricky since it is built both for libm and libc, and exports multiple aliases. To simplify aliasing, a new macro is introduced which handles aliasing to two symbols. By default, it just applies declare_mgen_alias to both target symbols. Likewise, the makefile is tweaked a little to generate templates for shared files too, and a new rule is added to build m_*.c objects from the objpfx directory. Verified there are no symbol or code changes using a script to diff the *_ldexp* object files on s390x, aarch64, arm, x86_64, and ppc64. * math/Makefile (gen-all-calls): New variable. (generated): Replace gen-libm-calls with gen-all-calls. (gen-libm-templates.stmp): Likewise, and add dependency on output directory generation. (calls): Move s_ldexpF into gen-calls. (gen-calls): New variable. * math/s_ldexpf.c: Removed. * math/s_ldexpl.c: Removed. * math/s_ldexp.c: Refactored into ... * math/s_ldexp_template.c: New file. * sysdeps/generic/math-type-macros-double.h: Remove redundant fall-through definition of declare_mgen_alias. (declare_mgen_alias_2): New macro. * sysdeps/generc/math-type-macros.h (declare_mgen_alias_2): New macro for function aliased to two exported symbols. * sysdeps/ieee754/ldbl-opt/s_ldexp.c: Update to use new template file. sysdeps/ieee754/ldbl-opt/s_ldexpl.c: Likewise. fixup ldexpF --- math/Makefile | 19 ++++++++++++----- math/s_ldexp.c | 34 ------------------------------- math/s_ldexp_template.c | 32 +++++++++++++++++++++++++++++ math/s_ldexpf.c | 32 ----------------------------- math/s_ldexpl.c | 33 ------------------------------ sysdeps/generic/math-type-macros-double.h | 10 ++++++--- sysdeps/generic/math-type-macros.h | 12 +++++++++++ sysdeps/ieee754/ldbl-opt/s_ldexp.c | 25 +++++++++++++++++++++-- sysdeps/ieee754/ldbl-opt/s_ldexpl.c | 27 ++++++++++++++++++++---- 9 files changed, 111 insertions(+), 113 deletions(-) delete mode 100644 math/s_ldexp.c create mode 100644 math/s_ldexp_template.c delete mode 100644 math/s_ldexpf.c delete mode 100644 math/s_ldexpl.c diff --git a/math/Makefile b/math/Makefile index fc48960..0c59616 100644 --- a/math/Makefile +++ b/math/Makefile @@ -120,7 +120,8 @@ libm-routines = $(strip $(libm-support) $(libm-compat-calls) \ # In libm-calls (above), list m_foo in place of s_foo for any # routine that should be compiled separately for its libc and libm versions. calls = s_isinfF s_isnanF s_finiteF s_copysignF s_modfF s_scalbnF s_frexpF \ - s_ldexpF s_signbitF + s_signbitF $(gen-calls) +gen-calls = s_ldexpF generated += $(foreach s,.c .S,$(call type-foreach, $(calls:s_%=m_%$(s)))) routines = $(call type-foreach, $(calls)) @@ -272,12 +273,14 @@ extra-objs += libieee.a ieee-math.o include ../Rules -generated += $(addsuffix .c,$(call type-foreach,$(gen-libm-calls))) \ +gen-all-calls = $(gen-libm-calls) $(gen-calls) + +generated += $(addsuffix .c,$(call type-foreach,$(gen-all-calls))) \ gen-libm-templates.stmp # Create wrappers in the math build directory. -$(objpfx)gen-libm-templates.stmp: - for gcall in $(gen-libm-calls); do \ +$(objpfx)gen-libm-templates.stmp: $(objpfx) + for gcall in $(gen-all-calls); do \ func=$${gcall%F*}$${gcall#*F}; \ for type in $(foreach t,$(types),$(t)__$(type-$(t)-suffix)); do \ suff=$${type#*__}; \ @@ -292,7 +295,7 @@ $(objpfx)gen-libm-templates.stmp: echo > $(@) # Add dependency to ensure the generator runs prior. -$(foreach t, $(call type-foreach, $(gen-libm-calls)), \ +$(foreach t, $(call type-foreach, $(gen-all-calls)), \ $(objpfx)$(t).c): $(objpfx)gen-libm-templates.stmp ifneq (no,$(PERL)) @@ -334,6 +337,12 @@ endef object-suffixes-left := $(all-object-suffixes) include $(o-iterator) +# Likewise, for those generated files shared with libc. +define o-iterator-doit +$(objpfx)m_%$o: $(objpfx)s_%.c $(before-compile); $$(compile-command.c) +endef +object-suffixes-left := $(all-object-suffixes) +include $(o-iterator) # This file defines the default _LIB_VERSION variable that controls # the error return conventions for the math functions. diff --git a/math/s_ldexp.c b/math/s_ldexp.c deleted file mode 100644 index ee53695..0000000 --- a/math/s_ldexp.c +++ /dev/null @@ -1,34 +0,0 @@ -/* @(#)s_ldexp.c 5.1 93/09/24 */ -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $"; -#endif - -#include -#include -#include - -double __ldexp(double value, int exp) -{ - if(!isfinite(value)||value==0.0) return value + value; - value = __scalbn(value,exp); - if(!isfinite(value)||value==0.0) __set_errno (ERANGE); - return value; -} -weak_alias (__ldexp, ldexp) -weak_alias (__ldexp, scalbn) -#ifdef NO_LONG_DOUBLE -strong_alias (__ldexp, __ldexpl) -weak_alias (__ldexp, ldexpl) -weak_alias (__ldexp, scalbnl) -#endif diff --git a/math/s_ldexp_template.c b/math/s_ldexp_template.c new file mode 100644 index 0000000..42a8333 --- /dev/null +++ b/math/s_ldexp_template.c @@ -0,0 +1,32 @@ +/* @(#)s_ldexp.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#if defined(LIBM_SCCS) && !defined(lint) +static char rcsid[] = "$NetBSD: s_ldexp.c,v 1.6 1995/05/10 20:47:40 jtc Exp $"; +#endif + +#include +#include +#include + +FLOAT +M_SUF (__ldexp) (FLOAT value, int exp) +{ + if(!isfinite(value)||value==0) return value + value; + value = M_SCALBN(value,exp); + if(!isfinite(value)||value==0) __set_errno (ERANGE); + return value; +} + +declare_mgen_alias_2 (__ldexp, ldexp, scalbn); + +/* Note, versioning issues are punted to ldbl-opt in this case. */ diff --git a/math/s_ldexpf.c b/math/s_ldexpf.c deleted file mode 100644 index b83062f..0000000 --- a/math/s_ldexpf.c +++ /dev/null @@ -1,32 +0,0 @@ -/* s_ldexpf.c -- float version of s_ldexp.c. - * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. - */ - -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: s_ldexpf.c,v 1.3 1995/05/10 20:47:42 jtc Exp $"; -#endif - -#include -#include -#include - -float __ldexpf(float value, int exp) -{ - if(!isfinite(value)||value==(float)0.0) return value + value; - value = __scalbnf(value,exp); - if(!isfinite(value)||value==(float)0.0) __set_errno (ERANGE); - return value; -} -weak_alias (__ldexpf, ldexpf) -weak_alias (__ldexpf, scalbnf) diff --git a/math/s_ldexpl.c b/math/s_ldexpl.c deleted file mode 100644 index 52fb093..0000000 --- a/math/s_ldexpl.c +++ /dev/null @@ -1,33 +0,0 @@ -/* s_ldexpl.c -- long double version of s_ldexp.c. - * Conversion to long double by Ulrich Drepper, - * Cygnus Support, drepper@cygnus.com. - */ - -/* - * ==================================================== - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. - * - * Developed at SunPro, a Sun Microsystems, Inc. business. - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -#if defined(LIBM_SCCS) && !defined(lint) -static char rcsid[] = "$NetBSD: $"; -#endif - -#include -#include -#include - -long double __ldexpl(long double value, int exp) -{ - if(!isfinite(value)||value==0.0) return value + value; - value = __scalbnl(value,exp); - if(!isfinite(value)||value==0.0) __set_errno (ERANGE); - return value; -} -weak_alias (__ldexpl, ldexpl) -weak_alias (__ldexpl, scalbnl) diff --git a/sysdeps/generic/math-type-macros-double.h b/sysdeps/generic/math-type-macros-double.h index 154f416..284a6a4 100644 --- a/sysdeps/generic/math-type-macros-double.h +++ b/sysdeps/generic/math-type-macros-double.h @@ -34,9 +34,13 @@ weak_alias (from, to) \ strong_alias (from, from ## l) \ weak_alias (from, to ## l) -#elif !defined declare_mgen_alias -# define declare_mgen_alias(from, to) \ - weak_alias (M_SUF (from), M_SUF (to)) +#endif + +#if defined NO_LONG_DOUBLE && !defined declare_mgen_alias_2 +# define declare_mgen_alias_2(from, to, to2) \ + declare_mgen_alias (from, to) \ + weak_alias (from, to2) \ + weak_alias (from, to2 ## l) #endif /* Supply the generic macros. */ diff --git a/sysdeps/generic/math-type-macros.h b/sysdeps/generic/math-type-macros.h index 259cb94..bd9e25a 100644 --- a/sysdeps/generic/math-type-macros.h +++ b/sysdeps/generic/math-type-macros.h @@ -38,6 +38,11 @@ This exposes the appropriate symbol(s) for a function f of type FLOAT. + declare_mgen_alias_2(from,to,to2) + This exposes the appropriate symbol(s) for a + function f of type FLOAT when it is aliased + to two symbols. + M_LIBM_NEED_COMPAT(func) This is utilized in macro context to indicate whether func should declare compat symbols. @@ -112,6 +117,13 @@ # define declare_mgen_alias(from, to) weak_alias (M_SUF (from), M_SUF (to)) #endif +/* Likewise, if two aliases are derived from the same symbol. */ +#ifndef declare_mgen_alias_2 +# define declare_mgen_alias_2(from, to, to2) \ + declare_mgen_alias (from, to) \ + declare_mgen_alias (from, to2) +#endif + /* Do not generate anything for compat symbols by default. */ #ifndef M_LIBM_NEED_COMPAT # define M_LIBM_NEED_COMPAT(func) 0 diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexp.c b/sysdeps/ieee754/ldbl-opt/s_ldexp.c index 20e107b..65f96e0 100644 --- a/sysdeps/ieee754/ldbl-opt/s_ldexp.c +++ b/sysdeps/ieee754/ldbl-opt/s_ldexp.c @@ -1,5 +1,26 @@ -#include -#include +/* ldexp alias overrides for platforms where long double + was previously not unique. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define M_LIBM_NEED_COMPAT(f) 0 +#include +#include + #if IS_IN (libm) # if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0) compat_symbol (libm, __ldexp, ldexpl, GLIBC_2_0); diff --git a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c index ed87a92..7a26437 100644 --- a/sysdeps/ieee754/ldbl-opt/s_ldexpl.c +++ b/sysdeps/ieee754/ldbl-opt/s_ldexpl.c @@ -1,7 +1,26 @@ -#include -#undef weak_alias -#define weak_alias(n,a) -#include +/* ldexpl alias overrides for platforms where long double + was previously not unique. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define declare_mgen_alias(f,t) +#include +#include + strong_alias (__ldexpl, __ldexpl_2) #if IS_IN (libm) long_double_symbol (libm, __ldexpl, ldexpl); -- 2.7.4