From patchwork Fri Mar 29 13:35:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 161451 Delivered-To: patch@linaro.org Received: by 2002:a02:c6d8:0:0:0:0:0 with SMTP id r24csp2055683jan; Fri, 29 Mar 2019 06:42:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqzQT1B7GkFAIQYCl11k4EAldT8TpGJTWGmcUON3XioyhwaShdj/61N0SR5ShtCUZusODwin X-Received: by 2002:a62:12d0:: with SMTP id 77mr47483870pfs.15.1553866936926; Fri, 29 Mar 2019 06:42:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553866936; cv=none; d=google.com; s=arc-20160816; b=tO/ijGadBC9j0AWDl8cCGENBPv05nUXMaVSbbJG1dmhQ9iK3Bh+Ghc9z1FTBlN6sw0 dzCaEGRNwMWUQWPvdjZ137agWAR24Jp5rzYm/rUg3NsCTvwjvqzFIDsvWJsJQpWkFdtT 1j71wLgsWsSAeqxfJqoxILO3E4xsldLWZF0Y14OHwziY1cAKqMI/N7wBa7TXNSEN7tYc IJ05Js5x7Ebw10V92/i37UxrtwleR42Ld2hK1iGr+xCF84TgnAbBeaRq2oXENyUObpMl Kq56fWnw4Q0sGtWbFcE9I5LRNH9yNOdt+WA4+HfPBN8KIhyBeakiA2GujfNCdqJg24IK n38A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from :dkim-signature:delivered-to:sender:list-help:list-post:list-archive :list-subscribe:list-unsubscribe:list-id:precedence:mailing-list :dkim-signature:domainkey-signature; bh=E4FAv7PBwLCP6d6vZpaxRFgMx8KruYUip9Pfc2wWkhc=; b=NKHxfOCyMBBU5hJ6JJ+8aOx44b2MQpDKIcB74UCfYEWpUkhz9ZtnKWlp70s96UNijI pmg4zDnAui1ExKiF6jRp+QYHPQ3sqP0dcoX4HMuJ0oM9TiIl9wn7PgnVKMuEGvM6oDVf IVeGjN4os8CR9em8XjiVEz3zKPSf5BSMK9ccO88i6Ql5hFkok/0rM761+1QQ2OPLc39U 8WouKIx9/UB/mN+lfi8GTp2LB2Z52MjeUsiXjcVYbsElTUNT7CcxAD+Reai2Hwyc8xtw jUSZLsk0FqqbSbnDtrWDGzHdPnzIgIJHmyXRMN1mGfAwqYLmZTfUu0B6kvIruDw/xEgq XFzw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b="CYVy/aNt"; dkim=pass header.i=@linaro.org header.s=google header.b=nAdvOp8a; spf=pass (google.com: domain of libc-alpha-return-101020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-101020-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id k24si1774298pfk.284.2019.03.29.06.42.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 29 Mar 2019 06:42:16 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-101020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b="CYVy/aNt"; dkim=pass header.i=@linaro.org header.s=google header.b=nAdvOp8a; spf=pass (google.com: domain of libc-alpha-return-101020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom="libc-alpha-return-101020-patch=linaro.org@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org 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:message-id:in-reply-to :references; q=dns; s=default; b=fly8DU4xoC/hre6w0i+VhyXZzBpurLr mNxJ01sgsPge3l6XkYI6Z8j+xp/bWuvJkNetqD+W3vnCz/jVXQ3gDziGyi+eqhQA RbdhcdwrlBZ5qs8elLyW6XUPH6YiG3u8qnN+u2l0kBCSyEPlaBLxqJ77zvjVwxJI vD1AVFugp9Ow= 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:message-id:in-reply-to :references; s=default; bh=kEX5iS2nw3+etChNcSLEQ6pCrjg=; b=CYVy/ aNtDLBWN45LGZkLYe4Kq/khqWaZByjSFhKPGDa156eWn9srFRtfETefOF6PiL+wP 1YjJ2clFGRoWsuKshnAngoxe7i/UwECbWLLfJoqQFM92LeR9lzYG49W3faLGKWHK Y2fQoo6zFCJBq7wfHZlf/28UqOhcG8TlALmhis= Received: (qmail 124176 invoked by alias); 29 Mar 2019 13:36:43 -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 121855 invoked by uid 89); 29 Mar 2019 13:36:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=1023 X-HELO: mail-ua1-f65.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=E4FAv7PBwLCP6d6vZpaxRFgMx8KruYUip9Pfc2wWkhc=; b=nAdvOp8aWEEUxQzotHwzBQAyoyI6geeVkhLMkN5uvzBCm/0aGIRl7RmyGo9c+ynG33 xmR18lhz88/h3S6DC7UOliffZv1LJE3wLJZIaoSsRUQ8eTSOPLibuOrRhLgllVB9K94x 9AqBbm/zEgCF5FP5VLRTI3QGq8xe1VpAnZtLodQ5W7oeh5hL3ZMclQaYNtwt9eu9yE3J crPwXPsavNJqR0M0OA+K9TnRo3Ih8wgGPXeKAUEhF5a68WZxq3nCYI1GOEibwEFG+vxh C5XmuR5cfRwOGeHjgg1W9XfheCMFPmx4L3oMnX/XiOP3of9BsGKabKnjZwyZPrUESMJd Xsdw== Return-Path: From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 28/28] powerpc: refactor logb{f,l} Date: Fri, 29 Mar 2019 10:35:29 -0300 Message-Id: <20190329133529.22523-29-adhemerval.zanella@linaro.org> In-Reply-To: <20190329133529.22523-1-adhemerval.zanella@linaro.org> References: <20190329133529.22523-1-adhemerval.zanella@linaro.org> The power7 logb implementation does not show a performance gain on ISA 2.07+ chips with faster floating-point to GRP instructions (currently POWER8 and POWER9). This patch moves the POWER7 implementation to generic one and enables it for POWER7. It also add some cleanup to use inline floating-point number instead of define them using static const. The performance difference is for POWER9: - Without patch: "logb": { "subnormal": { "duration": 4.99202e+09, "iterations": 8.83662e+08, "max": 75.194, "min": 5.501, "mean": 5.64925 }, "normal": { "duration": 4.97063e+09, "iterations": 9.97094e+08, "max": 46.489, "min": 4.956, "mean": 4.98512 } } - With patch: "logb": { "subnormal": { "duration": 4.97226e+09, "iterations": 9.92036e+08, "max": 77.209, "min": 4.892, "mean": 5.01218 }, "normal": { "duration": 4.96192e+09, "iterations": 1.07545e+09, "max": 12.361, "min": 4.593, "mean": 4.61382 } } The ifunc implementation is also enabled only for powerpc64. Checked on powerpc-linux-gnu (built without --with-cpu, with --with-cpu=power4 and with --with-cpu=power5+ and --disable-multi-arch), powerpc64-linux-gnu (built without --with-cp and with --with-cpu=power5+ and --disable-multi-arch). * sysdeps/powerpc/power7/fpu/s_logb.c: Move to ... * sysdeps/powerpc/fpu/s_logb.c: ... here. Use inline FP constants. * sysdeps/powerpc/power7/fpu/s_logbf.c: Move to ... * sysdeps/powerpc/fpu/s_logbf.c: ... here. Use inline FP constants. * sysdeps/powerpc/power7/fpu/s_logbl.c: Move to ... * sysdeps/powerpc/fpu/s_logbl.c: ... here. Use inline FP constants. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c: Adjust implementation path. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c: Adjust implementation path. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c: Adjust implementation path. * sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile (libm-sysdep_routines): Add s_log* objects. (CFLAGS-s_logbf-power7.c, CFLAGS-s_logbl-power7.c, CFLAGS-s_logb-power7.c): New fule. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-power7.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-ppc64.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-power7.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-ppc64.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-power7.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-ppc64.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c: Move to ... * sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl.c: ... here. * sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile: Remove file. * sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c: Remove file. * sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c: Likewise. * sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c: Likewise. --- sysdeps/powerpc/{power7 => }/fpu/s_logb.c | 64 ++++++++----------- sysdeps/powerpc/{power7 => }/fpu/s_logbf.c | 44 ++++++------- sysdeps/powerpc/{power7 => }/fpu/s_logbl.c | 47 ++++++-------- .../power4/fpu/multiarch/s_logb-power7.c | 13 +--- .../power4/fpu/multiarch/s_logbf-power7.c | 8 +-- .../power4/fpu/multiarch/s_logbl-power7.c | 3 +- .../powerpc64/be/fpu/multiarch/Makefile | 10 +++ .../{ => be}/fpu/multiarch/s_logb-power7.c | 3 +- .../{ => be}/fpu/multiarch/s_logb-ppc64.c | 0 .../powerpc64/{ => be}/fpu/multiarch/s_logb.c | 0 .../{ => be}/fpu/multiarch/s_logbf-power7.c | 3 +- .../{ => be}/fpu/multiarch/s_logbf-ppc64.c | 0 .../{ => be}/fpu/multiarch/s_logbf.c | 0 .../{ => be}/fpu/multiarch/s_logbl-power7.c | 3 +- .../{ => be}/fpu/multiarch/s_logbl-ppc64.c | 0 .../{ => be}/fpu/multiarch/s_logbl.c | 0 .../powerpc/powerpc64/fpu/multiarch/Makefile | 11 ---- sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c | 1 - .../powerpc/powerpc64/power7/fpu/s_logbf.c | 1 - .../powerpc/powerpc64/power7/fpu/s_logbl.c | 1 - 20 files changed, 87 insertions(+), 125 deletions(-) rename sysdeps/powerpc/{power7 => }/fpu/s_logb.c (56%) rename sysdeps/powerpc/{power7 => }/fpu/s_logbf.c (67%) rename sysdeps/powerpc/{power7 => }/fpu/s_logbl.c (72%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logb-power7.c (91%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logb-ppc64.c (100%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logb.c (100%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbf-power7.c (91%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbf-ppc64.c (100%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbf.c (100%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbl-power7.c (91%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbl-ppc64.c (100%) rename sysdeps/powerpc/powerpc64/{ => be}/fpu/multiarch/s_logbl.c (100%) delete mode 100644 sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile delete mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c delete mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c delete mode 100644 sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c -- 2.17.1 Reviewed-by: Gabriel F. T. Gomes diff --git a/sysdeps/powerpc/power7/fpu/s_logb.c b/sysdeps/powerpc/fpu/s_logb.c similarity index 56% rename from sysdeps/powerpc/power7/fpu/s_logb.c rename to sysdeps/powerpc/fpu/s_logb.c index 4cddc0f9c1..364f7f0cc3 100644 --- a/sysdeps/powerpc/power7/fpu/s_logb.c +++ b/sysdeps/powerpc/fpu/s_logb.c @@ -1,4 +1,4 @@ -/* logb(). PowerPC/POWER7 version. +/* Get exponent of a floating-point value. PowerPC version. Copyright (C) 2012-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,59 +16,49 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include -#include +/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make + generic implementation faster. */ +#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7) +# include +#else +# include +# include +# include +# include /* This implementation avoids FP to INT conversions by using VSX bitwise instructions over FP values. */ - -static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */ -static const double two10m1 = -1023.0; /* 2**10 -1 */ - -/* FP mask to extract the exponent. */ -static const union { - unsigned long long mask; - double d; -} mask = { 0x7ff0000000000000ULL }; - double __logb (double x) { double ret; - if (__builtin_expect (x == 0.0, 0)) + if (__glibc_unlikely (x == 0.0)) /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */ - return -1.0 / __builtin_fabs (x); + return -1.0 / fabs (x); - /* ret = x & 0x7ff0000000000000; */ - asm ( - "xxland %x0,%x1,%x2\n" - "fcfid %0,%0" - : "=f" (ret) - : "f" (x), "f" (mask.d)); - /* ret = (ret >> 52) - 1023.0; */ - ret = (ret * two1div52) + two10m1; - if (__builtin_expect (ret > -two10m1, 0)) + /* Mask to extract the exponent. */ + asm ("xxland %x0,%x1,%x2\n" + "fcfid %0,%0" + : "=d" (ret) + : "d" (x), "d" (0x7ff0000000000000ULL)); + ret = (ret * 0x1p-52) - 1023.0; + if (ret > 1023.0) /* Multiplication is used to set logb (+-INF) = INF. */ return (x * x); - else if (__builtin_expect (ret == two10m1, 0)) + else if (ret == -1023.0) { /* POSIX specifies that denormal numbers are treated as though they were normalized. */ - int32_t lx, ix; - int ma; - - EXTRACT_WORDS (ix, lx, x); - ix &= 0x7fffffff; - if (ix == 0) - ma = __builtin_clz (lx) + 32; - else - ma = __builtin_clz (ix); - return (double) (-1023 - (ma - 12)); + int64_t ix; + EXTRACT_WORDS64 (ix, x); + ix &= UINT64_C (0x7fffffffffffffff); + return (double) (-1023 - (__builtin_clzll (ix) - 12)); } /* Test to avoid logb_downward (0.0) == -0.0. */ return ret == -0.0 ? 0.0 : ret; } +# ifndef __logb libm_alias_double (__logb, logb) +# endif +#endif diff --git a/sysdeps/powerpc/power7/fpu/s_logbf.c b/sysdeps/powerpc/fpu/s_logbf.c similarity index 67% rename from sysdeps/powerpc/power7/fpu/s_logbf.c rename to sysdeps/powerpc/fpu/s_logbf.c index b0d006b5c7..cf564ad294 100644 --- a/sysdeps/powerpc/power7/fpu/s_logbf.c +++ b/sysdeps/powerpc/fpu/s_logbf.c @@ -1,4 +1,4 @@ -/* logbf(). PowerPC/POWER7 version. +/* Get exponent of a floating-point value. PowerPC version. Copyright (C) 2012-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,40 +16,33 @@ License along with the GNU C Library; if not, see . */ -#include - +/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make + generic implementation faster. */ +#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7) +# include +#else +# include +# include /* This implementation avoids FP to INT conversions by using VSX bitwise instructions over FP values. */ - -static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */ -static const double two10m1 = -1023.0; /* -2**10 + 1 */ -static const double two7m1 = -127.0; /* -2**7 + 1 */ - -/* FP mask to extract the exponent. */ -static const union { - unsigned long long mask; - double d; -} mask = { 0x7ff0000000000000ULL }; - float __logbf (float x) { /* VSX operation are all done internally as double. */ double ret; - if (__builtin_expect (x == 0.0, 0)) + if (__glibc_unlikely (x == 0.0)) /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */ - return -1.0 / __builtin_fabsf (x); + return -1.0 / fabs (x); - /* ret = x & 0x7f800000; */ - asm ( - "xxland %x0,%x1,%x2\n" - "fcfid %0,%0" - : "=f"(ret) - : "f" (x), "f" (mask.d)); + /* mask to extract the exponent. */ + asm ("xxland %x0,%x1,%x2\n" + "fcfid %0,%0" + : "=d"(ret) + : "d" (x), "d" (0x7ff0000000000000ULL)); /* ret = (ret >> 52) - 1023.0, since ret is double. */ - ret = (ret * two1div52) + two10m1; - if (__builtin_expect (ret > -two7m1, 0)) + ret = (ret * 0x1p-52) - 1023.0; + if (ret > 127.0) /* Multiplication is used to set logb (+-INF) = INF. */ return (x * x); /* Since operations are done with double we don't need @@ -57,4 +50,7 @@ __logbf (float x) The test is to avoid logb_downward (0.0) == -0.0. */ return ret == -0.0 ? 0.0 : ret; } +# ifndef __logbf libm_alias_float (__logb, logb) +# endif +#endif diff --git a/sysdeps/powerpc/power7/fpu/s_logbl.c b/sysdeps/powerpc/fpu/s_logbl.c similarity index 72% rename from sysdeps/powerpc/power7/fpu/s_logbl.c rename to sysdeps/powerpc/fpu/s_logbl.c index 76c29daeca..543cd4a188 100644 --- a/sysdeps/powerpc/power7/fpu/s_logbl.c +++ b/sysdeps/powerpc/fpu/s_logbl.c @@ -1,4 +1,4 @@ -/* logbl(). PowerPC/POWER7 version. +/* Get exponent of a floating-point value. PowerPC version. Copyright (C) 2012-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,22 +16,17 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include +/* ISA 2.07 provides fast GPR to FP instruction (mfvsr{d,wz}) which make + generic implementation faster. */ +#if defined(_ARCH_PWR8) || !defined(_ARCH_PWR7) +# include <./sysdeps/ieee754/ldbl-128ibm/s_logbl.c> +#else +# include +# include +# include /* This implementation avoids FP to INT conversions by using VSX bitwise instructions over FP values. */ - -static const double two1div52 = 2.220446049250313e-16; /* 1/2**52 */ -static const double two10m1 = -1023.0; /* 2**10 -1 */ - -/* FP mask to extract the exponent. */ -static const union { - unsigned long long mask; - double d; -} mask = { 0x7ff0000000000000ULL }; - long double __logbl (long double x) { @@ -39,24 +34,23 @@ __logbl (long double x) double ret; int64_t hx; - if (__builtin_expect (x == 0.0L, 0)) + if (__glibc_unlikely (x == 0.0)) /* Raise FE_DIVBYZERO and return -HUGE_VAL[LF]. */ return -1.0L / __builtin_fabsl (x); ldbl_unpack (x, &xh, &xl); EXTRACT_WORDS64 (hx, xh); - /* ret = x & 0x7ff0000000000000; */ - asm ( - "xxland %x0,%x1,%x2\n" - "fcfid %0,%0" - : "=f" (ret) - : "f" (xh), "f" (mask.d)); - /* ret = (ret >> 52) - 1023.0; */ - ret = (ret * two1div52) + two10m1; - if (__builtin_expect (ret > -two10m1, 0)) + + /* Mask to extract the exponent. */ + asm ("xxland %x0,%x1,%x2\n" + "fcfid %0,%0" + : "=d" (ret) + : "d" (xh), "d" (0x7ff0000000000000ULL)); + ret = (ret * 0x1p-52) - 1023.0; + if (ret > 1023.0) /* Multiplication is used to set logb (+-INF) = INF. */ return (xh * xh); - else if (__builtin_expect (ret == two10m1, 0)) + else if (ret == -1023.0) { /* POSIX specifies that denormal number is treated as though it were normalized. */ @@ -78,6 +72,7 @@ __logbl (long double x) /* Test to avoid logb_downward (0.0) == -0.0. */ return ret == -0.0 ? 0.0 : ret; } -#ifndef __logbl +# ifndef __logbl long_double_symbol (libm, __logbl, logbl); +# endif #endif diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c index 812771ac2e..c893ebcf29 100644 --- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c +++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logb-power7.c @@ -16,16 +16,5 @@ License along with the GNU C Library; if not, see . */ -#include -#include - -#undef weak_alias -#define weak_alias(a, b) -#undef strong_alias -#define strong_alias(a, b) -#undef compat_symbol -#define compat_symbol(lib, name, alias, ver) - #define __logb __logb_power7 - -#include +#include diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c index 62c2318421..059c53bce2 100644 --- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c +++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbf-power7.c @@ -16,11 +16,5 @@ License along with the GNU C Library; if not, see . */ -#include - -#undef weak_alias -#define weak_alias(a, b) - #define __logbf __logbf_power7 - -#include +#include diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c index c4fe590c6c..22a6ffb064 100644 --- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c +++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_logbl-power7.c @@ -17,5 +17,4 @@ . */ #define __logbl __logbl_power7 - -#include +#include diff --git a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile index 63de39bbf1..f4e2e88af0 100644 --- a/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/Makefile @@ -32,6 +32,12 @@ libm-sysdep_routines += s_ceil-power5+ \ s_llround-power5+ \ s_llround-ppc64 \ s_llroundf-ppc64 \ + s_logb-power7 \ + s_logbf-power7 \ + s_logbl-power7 \ + s_logb-ppc64 \ + s_logbf-ppc64 \ + s_logbl-ppc64 \ $(sysdep_calls:s_%=m_%) CFLAGS-s_ceil-power5+.c = -mcpu=power5+ @@ -48,6 +54,10 @@ CFLAGS-s_llround-power5+.c += -mcpu=power5+ CFLAGS-s_modf-power5+.c += -mcpu=power5+ CFLAGS-s_modff-power5+.c += -mcpu=power5+ +CFLAGS-s_logbf-power7.c = -mcpu=power7 +CFLAGS-s_logbl-power7.c = -mcpu=power7 +CFLAGS-s_logb-power7.c = -mcpu=power7 + # These files quiet sNaNs in a way that is optimized away without # -fsignaling-nans. CFLAGS-s_modf-ppc64.c += -fsignaling-nans diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-power7.c similarity index 91% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-power7.c index 507862b2bf..807bf58eeb 100644 --- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-power7.c +++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-power7.c @@ -16,4 +16,5 @@ License along with the GNU C Library; if not, see . */ -#include +#define __logb __logb_power7 +#include diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-ppc64.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb-ppc64.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb-ppc64.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logb.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logb.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-power7.c similarity index 91% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-power7.c index 3535ea78cd..4fee11dd84 100644 --- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-power7.c +++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-power7.c @@ -16,4 +16,5 @@ License along with the GNU C Library; if not, see . */ -#include +#define __logbf __logbf_power7 +#include diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-ppc64.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf-ppc64.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf-ppc64.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbf.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbf.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-power7.c similarity index 91% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-power7.c index 915636176d..c413d6e50d 100644 --- a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-power7.c +++ b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-power7.c @@ -16,4 +16,5 @@ License along with the GNU C Library; if not, see . */ -#include +#define __logbl __logbl_power7 +#include diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-ppc64.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl-ppc64.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl-ppc64.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c b/sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl.c similarity index 100% rename from sysdeps/powerpc/powerpc64/fpu/multiarch/s_logbl.c rename to sysdeps/powerpc/powerpc64/be/fpu/multiarch/s_logbl.c diff --git a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile deleted file mode 100644 index d7ad1e2724..0000000000 --- a/sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -ifeq ($(subdir),math) -sysdep_routines += $(sysdep_calls) -libm-sysdep_routines += s_logb-power7 s_logbf-power7 \ - s_logbl-power7 s_logb-ppc64 s_logbf-ppc64 \ - s_logbl-ppc64 \ - $(sysdep_calls:s_%=m_%) - -CFLAGS-s_logbf-power7.c = -mcpu=power7 -CFLAGS-s_logbl-power7.c = -mcpu=power7 -CFLAGS-s_logb-power7.c = -mcpu=power7 -endif diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c deleted file mode 100644 index 2599c771d9..0000000000 --- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logb.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c deleted file mode 100644 index 7a5a8032e0..0000000000 --- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbf.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c b/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c deleted file mode 100644 index 524ae2c78d..0000000000 --- a/sysdeps/powerpc/powerpc64/power7/fpu/s_logbl.c +++ /dev/null @@ -1 +0,0 @@ -#include