From patchwork Mon Sep 19 20:03:40 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: 671935 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sdH063wPDz9s9c for ; Tue, 20 Sep 2016 06:04:06 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=pbRwE5Oz; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:cc:from:date :mime-version:in-reply-to:content-type:message-id; q=dns; s= default; b=BMzBnRO4gyb2JjJUm1/qe6DalLj9c+urh72EQe6qg+37HO7+9UGRF lyIccuoCjnhit+FRTqB2AB9Ui8uJyFniJjKAue/nLfz58+1fn5T0psfaHUMCGSpS k+Uw60qrwZjb1T0mrXvf2xkLqLSoM8dpqhCybINtcpmxk0mUCoKYvg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:subject:to:references:cc:from:date :mime-version:in-reply-to:content-type:message-id; s=default; bh=j1zBzVJ+vToqwoF93NKO5wtGrTg=; b=pbRwE5OzQ82ifjzp79IU+rsf3A+Y 0Q/nzoMUJQ4XH9aFBk1qPRCydtAuu1DczsBpwqW1dZrnAOmeFzD6sPoO6xLyhzCt 9gB+eyDDOWoN9dIFLvcH3Q+Sq8NAjrhSE4FEgGjrbxejFJbWEmmfNO+15r0j6buv +ElskV2Vh2Ub9/4= Received: (qmail 59871 invoked by alias); 19 Sep 2016 20:03:57 -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 59846 invoked by uid 89); 19 Sep 2016 20:03:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=AWL, BAYES_00, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=1.6, 1995, ft, netbsd X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH] Make ldexpF generic. To: Joseph Myers References: <9186f43a-2749-70e9-809c-400137f35d57@linux.vnet.ibm.com> Cc: "libc-alpha@sourceware.org" From: "Paul E. Murphy" Date: Mon, 19 Sep 2016 15:03:40 -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: 16091920-0016-0000-0000-000004BAE8A5 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00005787; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000185; SDB=6.00759231; UDB=6.00360825; IPR=6.00533467; BA=6.00004736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00012718; XFM=3.00000011; UTC=2016-09-19 20:03:43 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16091920-0017-0000-0000-00003316344E Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-09-19_11:, , 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-1609190269 On 09/16/2016 06:12 PM, Joseph Myers wrote: > On Wed, 14 Sep 2016, Paul E. Murphy wrote: > >> 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. > > OK. > One more fix to this patch. The dependency on the object directory shouldn't be a dependency. Likewise, as noted by Andreas, a dependency on Makefile should exist for incremental builds. From c86cce46d6d4c847adde746b19dd9a794602cc56 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. Also, ensure the output directory exists or is created and add dependency on the Makefile. (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. --- math/Makefile | 20 +++++++++++++----- 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, 112 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..367f73e 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,15 @@ 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: Makefile + $(make-target-directory) + 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 +296,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 +338,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 2b5cd1d..78b883c 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