From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1791) id C1C9F3858029; Thu, 1 Feb 2024 12:45:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C1C9F3858029 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1706791534; bh=ZwkzPtmVOgZlmM3U0SFkGE2+cOyrMSA7QPC9J0LIwEQ=; h=From:To:Subject:Date:From; b=kYZMx8upstJ5rVZIsv+TofRaPfVlX+RAPTdMCuaVaZfXc1T0eWt3qqEXCMCsOn0vt sS+mVvz7vUdavg/tJnTaYrfSyuLHeIUpguOjtQEBYEttJfX+RQY8hTJczcWOtez2I/ NoJ8v8Kf06PtNdwTYypbzZoUaSEbS1pz8B3KL1sI= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Adhemerval Zanella To: glibc-cvs@sourceware.org Subject: [glibc] string: Use builtins for ffs and ffsll X-Act-Checkin: glibc X-Git-Author: Adhemerval Zanella Netto X-Git-Refname: refs/heads/master X-Git-Oldrev: 26d01172f5c3f3b912ecf21ebb911eb5351bba4d X-Git-Newrev: ae4b8d6a0e0dc502e3d8307474a2e5691b7434da Message-Id: <20240201124534.C1C9F3858029@sourceware.org> Date: Thu, 1 Feb 2024 12:45:34 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=ae4b8d6a0e0dc502e3d8307474a2e5691b7434da commit ae4b8d6a0e0dc502e3d8307474a2e5691b7434da Author: Adhemerval Zanella Netto Date: Fri Aug 25 13:30:58 2023 -0300 string: Use builtins for ffs and ffsll It allows to remove a lot of arch-specific implementations. Checked on x86_64, aarch64, powerpc64. Reviewed-by: Carlos O'Donell Diff: --- string/ffs.c | 6 +- string/ffsll.c | 10 +++- sysdeps/aarch64/math-use-builtins-ffs.h | 2 + sysdeps/alpha/alphaev67/ffs.S | 51 ---------------- sysdeps/alpha/alphaev67/ffsll.S | 44 -------------- sysdeps/alpha/ffs.S | 90 ----------------------------- sysdeps/alpha/ffsll.S | 1 - sysdeps/alpha/math-use-builtins-ffs.h | 7 +++ sysdeps/arc/math-use-builtins-ffs.h | 2 + sysdeps/arm/armv6t2/ffs.S | 36 ------------ sysdeps/arm/armv6t2/ffsll.S | 50 ---------------- sysdeps/arm/armv6t2/math-use-builtins-ffs.h | 2 + sysdeps/generic/math-use-builtins-ffs.h | 2 + sysdeps/generic/math-use-builtins.h | 1 + sysdeps/i386/ffs.c | 49 ---------------- sysdeps/i386/i686/ffs.c | 47 --------------- sysdeps/i386/math-use-builtins-ffs.h | 2 + sysdeps/ia64/math-use-builtins-ffs.h | 2 + sysdeps/m68k/ffs.c | 46 --------------- sysdeps/m68k/math-use-builtins-ffs.h | 7 +++ sysdeps/powerpc/ffs.c | 46 --------------- sysdeps/powerpc/math-use-builtins-ffs.h | 6 ++ sysdeps/powerpc/powerpc64/ffsll.c | 36 ------------ sysdeps/s390/ffs.c | 69 ---------------------- sysdeps/x86_64/ffs.c | 38 ------------ sysdeps/x86_64/ffsll.c | 41 ------------- sysdeps/x86_64/math-use-builtins-ffs.h | 2 + sysdeps/x86_64/x32/ffs.c | 4 -- 28 files changed, 48 insertions(+), 651 deletions(-) diff --git a/string/ffs.c b/string/ffs.c index 6a05ef8386..760c2bdd8d 100644 --- a/string/ffs.c +++ b/string/ffs.c @@ -18,13 +18,16 @@ #include #define ffsl __something_else #include - #undef ffs +#include /* Find the first bit set in I. */ int __ffs (int i) { +#if USE_FFS_BUILTIN + return __builtin_ffs (i); +#else static const unsigned char table[] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -42,6 +45,7 @@ __ffs (int i) a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); return table[x >> a] + a; +#endif } weak_alias (__ffs, ffs) libc_hidden_def (__ffs) diff --git a/string/ffsll.c b/string/ffsll.c index 7d16250026..0ec39a0c56 100644 --- a/string/ffsll.c +++ b/string/ffsll.c @@ -18,20 +18,26 @@ #include #define ffsl __something_else #include - #undef ffsll +#include +#include /* Find the first bit set in I. */ int -ffsll (long long int i) +__ffsll (long long int i) { +#if USE_FFSLL_BUILTIN + return __builtin_ffsll (i); +#else unsigned long long int x = i & -i; if (x <= 0xffffffff) return ffs (i); else return 32 + ffs (i >> 32); +#endif } +weak_alias (__ffsll, ffsll) #if ULONG_MAX != UINT_MAX #undef ffsl diff --git a/sysdeps/aarch64/math-use-builtins-ffs.h b/sysdeps/aarch64/math-use-builtins-ffs.h new file mode 100644 index 0000000000..a83bb15414 --- /dev/null +++ b/sysdeps/aarch64/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 1 diff --git a/sysdeps/alpha/alphaev67/ffs.S b/sysdeps/alpha/alphaev67/ffs.S deleted file mode 100644 index 0b5e6776af..0000000000 --- a/sysdeps/alpha/alphaev67/ffs.S +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2000-2024 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 - . */ - -/* Finds the first bit set in an integer. */ - -#include - - .arch ev6 - .set noreorder - .set noat - - -ENTRY(__ffs) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -#else - .prologue 0 -#endif - - zap $16, 0xF0, $16 - cttz $16, $0 - addq $0, 1, $0 - cmoveq $16, 0, $0 - - nop - nop - nop - ret - -END(__ffs) - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/alpha/alphaev67/ffsll.S b/sysdeps/alpha/alphaev67/ffsll.S deleted file mode 100644 index 56e26d10b5..0000000000 --- a/sysdeps/alpha/alphaev67/ffsll.S +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2000-2024 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 - . */ - -/* Finds the first bit set in a long. */ - -#include - - .arch ev6 - .set noreorder - .set noat - -ENTRY(ffsl) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -#else - .prologue 0 -#endif - - cttz $16, $0 - addq $0, 1, $0 - cmoveq $16, 0, $0 - ret - -END(ffsl) - -weak_extern (ffsl) -weak_alias (ffsl, ffsll) diff --git a/sysdeps/alpha/ffs.S b/sysdeps/alpha/ffs.S deleted file mode 100644 index 350d9ddd1e..0000000000 --- a/sysdeps/alpha/ffs.S +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 1996-2024 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 - . */ - -/* Finds the first bit set in an integer. Optimized for the Alpha - architecture. */ - -#include - - .set noreorder - .set noat - - -ENTRY(__ffs) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 - zap $16, 0xF0, $16 - br $ffsl..ng -#else - .prologue 0 - zap $16, 0xF0, $16 - # FALLTHRU -#endif -END(__ffs) - - .align 4 -ENTRY(ffsl) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -$ffsl..ng: -#else - .prologue 0 -#endif - not $16, $1 # e0 : - ldi $2, -1 # .. e1 : - cmpbge $1, $2, $3 # e0 : bit N == 1 for byte N == 0 - clr $0 # .. e1 : - addq $3, 1, $4 # e0 : - bic $4, $3, $3 # e1 : bit N == 1 for first byte N != 0 - and $3, 0xF0, $4 # e0 : - and $3, 0xCC, $5 # .. e1 : - and $3, 0xAA, $6 # e0 : - cmovne $4, 4, $0 # .. e1 : - cmovne $5, 2, $5 # e0 : - cmovne $6, 1, $6 # .. e1 : - addl $0, $5, $0 # e0 : - addl $0, $6, $0 # e1 : $0 == N - extbl $16, $0, $1 # e0 : $1 == byte N - ldi $2, 1 # .. e1 : - negq $1, $3 # e0 : - and $3, $1, $3 # e1 : bit N == least bit set of byte N - and $3, 0xF0, $4 # e0 : - and $3, 0xCC, $5 # .. e1 : - and $3, 0xAA, $6 # e0 : - cmovne $4, 5, $2 # .. e1 : - cmovne $5, 2, $5 # e0 : - cmovne $6, 1, $6 # .. e1 : - s8addl $0, $2, $0 # e0 : mult byte ofs by 8 and sum - addl $5, $6, $5 # .. e1 : - addl $0, $5, $0 # e0 : - nop # .. e1 : - cmoveq $16, 0, $0 # e0 : trap input == 0 case. - ret # .. e1 : 18 - -END(ffsl) - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -weak_extern (ffsl) -weak_alias (ffsl, ffsll) diff --git a/sysdeps/alpha/ffsll.S b/sysdeps/alpha/ffsll.S deleted file mode 100644 index b2f46d899c..0000000000 --- a/sysdeps/alpha/ffsll.S +++ /dev/null @@ -1 +0,0 @@ -/* This function is defined in ffs.S. */ diff --git a/sysdeps/alpha/math-use-builtins-ffs.h b/sysdeps/alpha/math-use-builtins-ffs.h new file mode 100644 index 0000000000..9925e374ac --- /dev/null +++ b/sysdeps/alpha/math-use-builtins-ffs.h @@ -0,0 +1,7 @@ +#ifdef __alpha_cix__ +# define USE_FFS_BUILTIN 1 +# define USE_FFSLL_BUILTIN 1 +#else +# define USE_FFS_BUILTIN 0 +# define USE_FFSLL_BUILTIN 0 +#endif diff --git a/sysdeps/arc/math-use-builtins-ffs.h b/sysdeps/arc/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/arc/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/arm/armv6t2/ffs.S b/sysdeps/arm/armv6t2/ffs.S deleted file mode 100644 index 57df60f5f7..0000000000 --- a/sysdeps/arm/armv6t2/ffs.S +++ /dev/null @@ -1,36 +0,0 @@ -/* ffs -- find first set bit in an int, from least significant end. - Copyright (C) 2013-2024 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 - . */ - -#include - - .syntax unified - .text - -ENTRY (__ffs) - cmp r0, #0 - rbit r0, r0 - itt ne - clzne r0, r0 - addne r0, r0, #1 - bx lr -END (__ffs) - -weak_alias (__ffs, ffs) -weak_alias (__ffs, ffsl) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/arm/armv6t2/ffsll.S b/sysdeps/arm/armv6t2/ffsll.S deleted file mode 100644 index bd51c38471..0000000000 --- a/sysdeps/arm/armv6t2/ffsll.S +++ /dev/null @@ -1,50 +0,0 @@ -/* ffsll -- find first set bit in a long long, from least significant end. - Copyright (C) 2013-2024 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 - . */ - -#include - - .syntax unified - .text - -ENTRY (ffsll) - @ If low part is 0, operate on the high part. Ensure that the - @ word on which we operate is in r0. Set r2 to the bit offset - @ of the word being considered. Set the flags for the word - @ being operated on. -#ifdef __ARMEL__ - cmp r0, #0 - itee ne - movne r2, #0 - moveq r2, #32 - movseq r0, r1 -#else - cmp r1, #0 - ittee ne - movne r2, #0 - movne r0, r1 - moveq r2, #32 - cmpeq r0, #0 -#endif - @ Perform the ffs on r0. - rbit r0, r0 - ittt ne - clzne r0, r0 - addne r2, r2, #1 - addne r0, r0, r2 - bx lr -END (ffsll) diff --git a/sysdeps/arm/armv6t2/math-use-builtins-ffs.h b/sysdeps/arm/armv6t2/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/arm/armv6t2/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/generic/math-use-builtins-ffs.h b/sysdeps/generic/math-use-builtins-ffs.h new file mode 100644 index 0000000000..add8537470 --- /dev/null +++ b/sysdeps/generic/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 0 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/generic/math-use-builtins.h b/sysdeps/generic/math-use-builtins.h index 2352104c85..63728e0cc6 100644 --- a/sysdeps/generic/math-use-builtins.h +++ b/sysdeps/generic/math-use-builtins.h @@ -40,5 +40,6 @@ #include #include #include +#include #endif /* MATH_USE_BUILTINS_H */ diff --git a/sysdeps/i386/ffs.c b/sysdeps/i386/ffs.c deleted file mode 100644 index 587d80de88..0000000000 --- a/sysdeps/i386/ffs.c +++ /dev/null @@ -1,49 +0,0 @@ -/* ffs -- find first set bit in a word, counted from least significant end. - For Intel 80x86, x>=3. - This file is part of the GNU C Library. - Copyright (C) 1991-2024 Free Software Foundation, Inc. - - 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 ffsl __something_else -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("xorl %0,%0\n" /* Set CNT to zero. */ - "bsfl %2,%1\n" /* Count low bits in X and store in %1. */ - "jz 1f\n" /* Jump if OK, i.e. X was non-zero. */ - "leal 1(%1),%0\n" /* Return bsfl-result plus one on %0. */ - "1:" : "=&a" (cnt), "=r" (tmp) : "rm" (x)); - - return cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else -#include -#endif diff --git a/sysdeps/i386/i686/ffs.c b/sysdeps/i386/i686/ffs.c deleted file mode 100644 index 6712730ad8..0000000000 --- a/sysdeps/i386/i686/ffs.c +++ /dev/null @@ -1,47 +0,0 @@ -/* ffs -- find first set bit in a word, counted from least significant end. - For Intel 80x86, x>=6. - This file is part of the GNU C Library. - Copyright (C) 1991-2024 Free Software Foundation, Inc. - - 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 ffsl __something_else -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("bsfl %2,%0\n" /* Count low bits in X and store in %1. */ - "cmovel %1,%0\n" /* If number was zero, use -1 as result. */ - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); - - return cnt + 1; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else -#include -#endif diff --git a/sysdeps/i386/math-use-builtins-ffs.h b/sysdeps/i386/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/i386/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/ia64/math-use-builtins-ffs.h b/sysdeps/ia64/math-use-builtins-ffs.h new file mode 100644 index 0000000000..a83bb15414 --- /dev/null +++ b/sysdeps/ia64/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 1 diff --git a/sysdeps/m68k/ffs.c b/sysdeps/m68k/ffs.c deleted file mode 100644 index 496ceb8941..0000000000 --- a/sysdeps/m68k/ffs.c +++ /dev/null @@ -1,46 +0,0 @@ -/* ffs -- find first set bit in a word, counted from least significant end. - For mc68020, mc68030, mc68040. - This file is part of the GNU C Library. - Copyright (C) 1991-2024 Free Software Foundation, Inc. - - 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 ffsl __something_else -#include - -#undef ffs - -#if defined (__GNUC__) && defined (__mc68020__) - -int -__ffs (int x) -{ - int cnt; - - asm ("bfffo %1{#0:#0},%0" : "=d" (cnt) : "dm" (x & -x)); - - return 32 - cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else - -#include - -#endif diff --git a/sysdeps/m68k/math-use-builtins-ffs.h b/sysdeps/m68k/math-use-builtins-ffs.h new file mode 100644 index 0000000000..4e1d994453 --- /dev/null +++ b/sysdeps/m68k/math-use-builtins-ffs.h @@ -0,0 +1,7 @@ +#if defined __mc68020__ || defined __mc68030__ || defined __mc68040__ \ + || defined __mc68060__ +# define USE_FFS_BUILTIN 1 +#else +# define USE_FFS_BUILTIN 0 +#endif +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/powerpc/ffs.c b/sysdeps/powerpc/ffs.c deleted file mode 100644 index 9614d48da2..0000000000 --- a/sysdeps/powerpc/ffs.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Find first set bit in a word, counted from least significant end. - For PowerPC. - Copyright (C) 1991-2024 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 ffsl __something_else -#include -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - - asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x)); - return 32 - cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#if ULONG_MAX == UINT_MAX -#undef ffsl -weak_alias (__ffs, ffsl) -#endif - -#else -#include -#endif diff --git a/sysdeps/powerpc/math-use-builtins-ffs.h b/sysdeps/powerpc/math-use-builtins-ffs.h new file mode 100644 index 0000000000..7b1d401823 --- /dev/null +++ b/sysdeps/powerpc/math-use-builtins-ffs.h @@ -0,0 +1,6 @@ +#define USE_FFS_BUILTIN 1 +#ifdef __powerpc64__ +# define USE_FFSLL_BUILTIN 1 +#else +# define USE_FFSLL_BUILTIN 0 +#endif diff --git a/sysdeps/powerpc/powerpc64/ffsll.c b/sysdeps/powerpc/powerpc64/ffsll.c deleted file mode 100644 index a8f0c30058..0000000000 --- a/sysdeps/powerpc/powerpc64/ffsll.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Find first set bit in a word, counted from least significant end. - For PowerPC. - Copyright (C) 1991-2024 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 ffsl __something_else -#include -#include - -#undef ffs - -int -__ffsll (long long int x) -{ - int cnt; - - asm ("cntlzd %0,%1" : "=r" (cnt) : "r" (x & -x)); - return 64 - cnt; -} -weak_alias (__ffsll, ffsll) -#undef ffsl -weak_alias (__ffsll, ffsl) diff --git a/sysdeps/s390/ffs.c b/sysdeps/s390/ffs.c deleted file mode 100644 index 027e0ce6d4..0000000000 --- a/sysdeps/s390/ffs.c +++ /dev/null @@ -1,69 +0,0 @@ -/* ffs -- find first set bit in a word, counted from least significant end. - S/390 version. - Copyright (C) 2000-2024 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 - . */ - -#include -#define ffsl __something_else -#include - -#undef ffs - -/* ffs: find first bit set. This is defined the same way as - the libc and compiler builtin ffs routines, therefore - differs in spirit from the above ffz (man ffs). */ - -int -__ffs (int x) -{ - int r; - - if (x == 0) - return 0; - __asm__(" lr %%r1,%1\n" - " sr %0,%0\n" - " tml %%r1,0xFFFF\n" - " jnz 0f\n" - " ahi %0,16\n" - " srl %%r1,16\n" - "0: tml %%r1,0x00FF\n" - " jnz 1f\n" - " ahi %0,8\n" - " srl %%r1,8\n" - "1: tml %%r1,0x000F\n" - " jnz 2f\n" - " ahi %0,4\n" - " srl %%r1,4\n" - "2: tml %%r1,0x0003\n" - " jnz 3f\n" - " ahi %0,2\n" - " srl %%r1,2\n" - "3: tml %%r1,0x0001\n" - " jnz 4f\n" - " ahi %0,1\n" - "4:" - : "=&d" (r) : "d" (x) : "cc", "1" ); - return r+1; -} - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#if ULONG_MAX == UINT_MAX -#undef ffsl -weak_alias (__ffs, ffsl) -#endif diff --git a/sysdeps/x86_64/ffs.c b/sysdeps/x86_64/ffs.c deleted file mode 100644 index a049e87b94..0000000000 --- a/sysdeps/x86_64/ffs.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ffs -- find first set bit in a word, counted from least significant end. - For AMD x86-64. - This file is part of the GNU C Library. - Copyright (C) 1991-2024 Free Software Foundation, Inc. - - 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 - . */ - -#include - -#undef ffs - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("bsfl %2,%0\n" /* Count low bits in X and store in %1. */ - "cmovel %1,%0\n" /* If number was zero, use -1 as result. */ - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); - - return cnt + 1; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/x86_64/ffsll.c b/sysdeps/x86_64/ffsll.c deleted file mode 100644 index 28444284e6..0000000000 --- a/sysdeps/x86_64/ffsll.c +++ /dev/null @@ -1,41 +0,0 @@ -/* ffsll -- find first set bit in a word, counted from least significant end. - For AMD x86-64. - This file is part of the GNU C Library. - Copyright (C) 1991-2024 Free Software Foundation, Inc. - - 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 ffsl __something_else -#include - -#undef ffsll - -int -ffsll (long long int x) -{ - long long int cnt; - - asm ("mov $-1,%k0\n" /* Initialize cnt to -1. */ - "bsf %1,%0\n" /* Count low bits in x and store in cnt. */ - "inc %k0\n" /* Increment cnt by 1. */ - : "=&r" (cnt) : "r" (x)); - - return cnt; -} - -#ifndef __ILP32__ -#undef ffsl -weak_alias (ffsll, ffsl) -#endif diff --git a/sysdeps/x86_64/math-use-builtins-ffs.h b/sysdeps/x86_64/math-use-builtins-ffs.h new file mode 100644 index 0000000000..a83bb15414 --- /dev/null +++ b/sysdeps/x86_64/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 1 diff --git a/sysdeps/x86_64/x32/ffs.c b/sysdeps/x86_64/x32/ffs.c deleted file mode 100644 index fa7de8b887..0000000000 --- a/sysdeps/x86_64/x32/ffs.c +++ /dev/null @@ -1,4 +0,0 @@ -#define ffsl __something_else -#include -#undef ffsl -weak_alias (__ffs, ffsl)