From patchwork Fri Feb 7 14:34:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rogerio Alves X-Patchwork-Id: 37730 Received: (qmail 8439 invoked by alias); 7 Feb 2020 14:34:28 -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 8383 invoked by uid 89); 7 Feb 2020 14:34:23 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-22.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.1 spammy=suppress X-HELO: mx0a-001b2d01.pphosted.com From: Rogerio Alves To: libc-alpha@sourceware.org Cc: adhemerval.zanella@linaro.org, Rogerio Alves Subject: [PATCH v2] powerpc: Refactor fenvinline.h Date: Fri, 7 Feb 2020 11:34:10 -0300 Message-Id: <20200207143410.3948-1-rcardoso@linux.ibm.com> This patch refactor fenviline.h replaces some statements for builtins. --- * Changes in v2: Per Adhemerval review: don not redefine _buitins use a macro instead. Use of __builtin_popcount allows do eliminate the if (e == 0) test. __builtin_popcount(e) == 1 for e = 0 validate false while (e & (e - 1)) == 0 validate true if e = 0. Appended a comment about the weird asm constrain i#*X. The warning only appear at GCC versions 3 and below. If we even stops to support GCC 3 for installed headers we may replace that for plain `i`. sysdeps/powerpc/bits/fenvinline.h | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/sysdeps/powerpc/bits/fenvinline.h b/sysdeps/powerpc/bits/fenvinline.h index 70689664e2..7b2b75e5ef 100644 --- a/sysdeps/powerpc/bits/fenvinline.h +++ b/sysdeps/powerpc/bits/fenvinline.h @@ -51,9 +51,19 @@ # define fegetround() __fegetround () # ifndef __NO_MATH_INLINES + +/* Builtins to mtfsb0 and mtfsb1 was introduced on GCC 9. */ +# if !__GNUC_PREREQ(9, 0) /* The weird 'i#*X' constraints on the following suppress a gcc warning when __excepts is not a constant. Otherwise, they mean the - same as just plain 'i'. */ + same as just plain 'i'. This warning only happens in old GCC + versions (gcc 3 or less). Otherwise plain 'i' works fine. */ +# define __mtfsb0(__b) __asm__ __volatile__ ("mtfsb0 %0" : : "i#*X" (__b)) +# define __mtfsb1(__b) __asm__ __volatile__ ("mtfsb1 %0" : : "i#*X" (__b)) +# else +# define __mtfsb0(__b) __builtin_mtfsb0 (__b) +# define __mtfsb1(__b) __builtin_mtfsb1 (__b) +# endif # if __GNUC_PREREQ(3, 4) @@ -61,15 +71,12 @@ # define feraiseexcept(__excepts) \ (__extension__ ({ \ int __e = __excepts; \ - int __ret; \ + int __ret = 0; \ if (__builtin_constant_p (__e) \ - && (__e & (__e - 1)) == 0 \ + && (__builtin_popcount (__e) == 1) \ && __e != FE_INVALID) \ { \ - if (__e != 0) \ - __asm__ __volatile__ ("mtfsb1 %0" \ - : : "i#*X" (__builtin_clz (__e))); \ - __ret = 0; \ + __mtfsb1 ((__builtin_clz (__e))); \ } \ else \ __ret = feraiseexcept (__e); \ @@ -80,15 +87,12 @@ # define feclearexcept(__excepts) \ (__extension__ ({ \ int __e = __excepts; \ - int __ret; \ + int __ret = 0; \ if (__builtin_constant_p (__e) \ - && (__e & (__e - 1)) == 0 \ + && (__builtin_popcount (__e) == 1) \ && __e != FE_INVALID) \ { \ - if (__e != 0) \ - __asm__ __volatile__ ("mtfsb0 %0" \ - : : "i#*X" (__builtin_clz (__e))); \ - __ret = 0; \ + __mtfsb0 ((__builtin_clz (__e))); \ } \ else \ __ret = feclearexcept (__e); \