From patchwork Tue May 16 19:15:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gabriel F. T. Gomes" X-Patchwork-Id: 763130 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 3wS6cm5W3Qz9s7M for ; Wed, 17 May 2017 05:16:24 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="hEdIFPXo"; 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:from:to:subject:date:in-reply-to:references :message-id; q=dns; s=default; b=Rs2gHv9oBIDuPljuQtmTnnpQDEXaxyt xz4ESj57MekLUS3VQNrmxoj1PDJxUSO6ux/lWRK6bCEIhwMPJBRoneYpe5WNJy3z mkOXduIBX7miz03g+sYDGEDqwSSmaVl0BOMNR7h5ddPjfx8zeicuEkn3NeHAtnkR fLMgKGXIC7d8= 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:from:to:subject:date:in-reply-to:references :message-id; s=default; bh=ur6Lym/8QIs0nCDKlbujpdFwzVA=; b=hEdIF PXovPaCi+g7iC+wXlZOY8gH6n/pyqJaDhOj9zDETf7J0h00QpBGdhCbrIfYRBKRe JfTcE0T142jk7rKXwThGDwN007F5YWfZENUmNrd2JZ2nIAdOYDzLzYD53N/Z3AUW o4M2mhw1UTSls97ET2SDwap996+uXprnLV1efk= Received: (qmail 127287 invoked by alias); 16 May 2017 19:16:13 -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 126136 invoked by uid 89); 16 May 2017 19:16:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy= X-HELO: mx0a-001b2d01.pphosted.com From: "Gabriel F. T. Gomes" To: libc-alpha@sourceware.org Subject: [PATCH] Convert e_exp2l.c into a template Date: Tue, 16 May 2017 16:15:53 -0300 In-Reply-To: References: X-TM-AS-MML: disable x-cbid: 17051619-1523-0000-0000-0000029FC826 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17051619-1524-0000-0000-00002A363F39 Message-Id: <1494962153-12993-1-git-send-email-gftg@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-05-16_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1705160153 This patch converts the implementation of exp2l in math/e_exp2l.c into a template in math/e_exp2_template.c, then adjusts Makefile to use this template for long double (the implementations for float and double in sysdeps have higher precedence and are not used). This template can also be used for float128, thus reducing the amount of duplicated code that gets added when adding support the new type. Tested for powerpc64le and s390x. 2017-05-16 Gabriel F. T. Gomes * math/Makefile (libm-calls): Move e_exp2F to gen-libm-calls. (gen-libm-calls): Add e_exp2F to use the template. * math/e_exp2l.c: Rename to math/e_exp2_template.c. * math/e_exp2_template.c: New file, renamed from math/e_exp2l.c, and made into a template. --- math/Makefile | 4 ++-- math/{e_exp2l.c => e_exp2_template.c} | 40 +++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 16 deletions(-) rename math/{e_exp2l.c => e_exp2_template.c} (56%) diff --git a/math/Makefile b/math/Makefile index ff4aa00..9aca4e0 100644 --- a/math/Makefile +++ b/math/Makefile @@ -59,7 +59,7 @@ gen-libm-calls = cargF conjF cimagF crealF cabsF s_cacosF \ w_acoshF w_asinF w_atan2F w_atanhF w_coshF w_exp10F \ w_exp2F w_fmodF w_hypotF w_j0F w_j1F w_jnF w_logF \ w_log10F w_log2F w_powF w_remainderF w_sinhF w_sqrtF \ - w_tgammaF w_lgammaF w_lgammaF_r w_expF + w_tgammaF w_lgammaF w_lgammaF_r w_expF e_exp2F libm-calls = \ e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \ @@ -72,7 +72,7 @@ libm-calls = \ s_nextafterF s_nexttowardF s_rintF s_scalblnF \ s_significandF s_sinF s_tanF s_tanhF \ s_fpclassifyF s_truncF \ - s_remquoF e_log2F e_exp2F s_roundF s_nearbyintF s_sincosF \ + s_remquoF e_log2F s_roundF s_nearbyintF s_sincosF \ s_fmaF s_lrintF s_llrintF s_lroundF s_llroundF e_exp10F \ s_issignalingF $(calls:s_%=m_%) x2y2m1F \ gamma_productF lgamma_negF lgamma_productF \ diff --git a/math/e_exp2l.c b/math/e_exp2_template.c similarity index 56% rename from math/e_exp2l.c rename to math/e_exp2_template.c index bd68e62..85b138c 100644 --- a/math/e_exp2l.c +++ b/math/e_exp2_template.c @@ -27,22 +27,34 @@ # define LDBL_EPSILON 0x1p-106L #endif -long double -__ieee754_exp2l (long double x) +#define M_PRE_X(prefix, x) prefix ## _ ## x +#define M_PRE_S(prefix, x) M_PRE_X (prefix, x) +#define M_PRE(x) M_PRE_S (M_PFX, x) + +#define declare_mgen_finite_alias_x(from, to) \ + strong_alias (from, to ## _finite) +#define declare_mgen_finite_alias_s(from,to) \ + declare_mgen_finite_alias_x (from, to) +#define declare_mgen_finite_alias(from, to) \ + declare_mgen_finite_alias_s (M_SUF (from), M_SUF (to)) + +FLOAT +M_DECL_FUNC (__ieee754_exp2) (FLOAT x) { - if (__glibc_likely (isless (x, (long double) LDBL_MAX_EXP))) + if (__glibc_likely (isless (x, (FLOAT) M_PRE (MAX_EXP)))) { - if (__builtin_expect (isgreaterequal (x, (long double) (LDBL_MIN_EXP - - LDBL_MANT_DIG - - 1)), 1)) + if (__builtin_expect (isgreaterequal (x, (FLOAT) (M_PRE (MIN_EXP) + - M_PRE (MANT_DIG) + - 1)), 1)) { int intx = (int) x; - long double fractx = x - intx; - long double result; - if (fabsl (fractx) < LDBL_EPSILON / 4.0L) - result = __scalbnl (1.0L + fractx, intx); + FLOAT fractx = x - intx; + FLOAT result; + if (M_SUF (fabs) (fractx) < M_PRE (EPSILON) / M_LIT (4.0)) + result = M_SUF (__scalbn) (M_LIT (1.0) + fractx, intx); else - result = __scalbnl (__ieee754_expl (M_LN2l * fractx), intx); + result = M_SUF (__scalbn) (M_SUF (__ieee754_exp) (M_SUF (M_LN2) + * fractx), intx); math_check_force_underflow_nonneg (result); return result; } @@ -52,11 +64,11 @@ __ieee754_exp2l (long double x) if (isinf (x)) return 0; else - return LDBL_MIN * LDBL_MIN; + return M_PRE (MIN) * M_PRE (MIN); } } else /* Infinity, NaN or overflow. */ - return LDBL_MAX * x; + return M_PRE (MAX) * x; } -strong_alias (__ieee754_exp2l, __exp2l_finite) +declare_mgen_finite_alias (__ieee754_exp2, __exp2)