Message ID | 20230717143431.2075924-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | string: Use builtins for ffs and ffsll | expand |
Ping. On 17/07/23 11:34, Adhemerval Zanella wrote: > It allows to remove a lot of arch-specific implementations. > > Checked on x86_64, aarch64, powerpc64. > --- > 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/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/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 -- > 27 files changed, 41 insertions(+), 651 deletions(-) > create mode 100644 sysdeps/aarch64/math-use-builtins-ffs.h > delete mode 100644 sysdeps/alpha/alphaev67/ffs.S > delete mode 100644 sysdeps/alpha/alphaev67/ffsll.S > delete mode 100644 sysdeps/alpha/ffs.S > delete mode 100644 sysdeps/alpha/ffsll.S > create mode 100644 sysdeps/alpha/math-use-builtins-ffs.h > create mode 100644 sysdeps/arc/math-use-builtins-ffs.h > delete mode 100644 sysdeps/arm/armv6t2/ffs.S > delete mode 100644 sysdeps/arm/armv6t2/ffsll.S > create mode 100644 sysdeps/arm/math-use-builtins-ffs.h > create mode 100644 sysdeps/generic/math-use-builtins-ffs.h > delete mode 100644 sysdeps/i386/ffs.c > delete mode 100644 sysdeps/i386/i686/ffs.c > create mode 100644 sysdeps/i386/math-use-builtins-ffs.h > create mode 100644 sysdeps/ia64/math-use-builtins-ffs.h > delete mode 100644 sysdeps/m68k/ffs.c > delete mode 100644 sysdeps/powerpc/ffs.c > create mode 100644 sysdeps/powerpc/math-use-builtins-ffs.h > delete mode 100644 sysdeps/powerpc/powerpc64/ffsll.c > delete mode 100644 sysdeps/s390/ffs.c > delete mode 100644 sysdeps/x86_64/ffs.c > delete mode 100644 sysdeps/x86_64/ffsll.c > create mode 100644 sysdeps/x86_64/math-use-builtins-ffs.h > delete mode 100644 sysdeps/x86_64/x32/ffs.c > > diff --git a/string/ffs.c b/string/ffs.c > index bf58f0b7ca..8302ae8420 100644 > --- a/string/ffs.c > +++ b/string/ffs.c > @@ -18,13 +18,16 @@ > #include <limits.h> > #define ffsl __something_else > #include <string.h> > - > #undef ffs > +#include <math-use-builtins.h> > > /* 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 0cc461a1cf..2315fe1bd7 100644 > --- a/string/ffsll.c > +++ b/string/ffsll.c > @@ -18,20 +18,26 @@ > #include <limits.h> > #define ffsl __something_else > #include <string.h> > - > #undef ffsll > +#include <math-use-builtins.h> > +#include <libc-diag.h> > > /* 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 48361bd8c5..0000000000 > --- a/sysdeps/alpha/alphaev67/ffs.S > +++ /dev/null > @@ -1,51 +0,0 @@ > -/* Copyright (C) 2000-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -/* Finds the first bit set in an integer. */ > - > -#include <sysdep.h> > - > - .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 52f406ec32..0000000000 > --- a/sysdeps/alpha/alphaev67/ffsll.S > +++ /dev/null > @@ -1,44 +0,0 @@ > -/* Copyright (C) 2000-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -/* Finds the first bit set in a long. */ > - > -#include <sysdep.h> > - > - .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 047fd60352..0000000000 > --- a/sysdeps/alpha/ffs.S > +++ /dev/null > @@ -1,90 +0,0 @@ > -/* Copyright (C) 1996-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -/* Finds the first bit set in an integer. Optimized for the Alpha > - architecture. */ > - > -#include <sysdep.h> > - > - .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 870957a4bb..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#include <sysdep.h> > - > - .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 bc3cbf81b0..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#include <sysdep.h> > - > - .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/math-use-builtins-ffs.h b/sysdeps/arm/math-use-builtins-ffs.h > new file mode 100644 > index 0000000000..c0f108c264 > --- /dev/null > +++ b/sysdeps/arm/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 04b1d0d5ab..038eb2c523 100644 > --- a/sysdeps/generic/math-use-builtins.h > +++ b/sysdeps/generic/math-use-builtins.h > @@ -40,5 +40,6 @@ > #include <math-use-builtins-lrint.h> > #include <math-use-builtins-llrint.h> > #include <math-use-builtins-logb.h> > +#include <math-use-builtins-ffs.h> > > #endif /* MATH_USE_BUILTINS_H */ > diff --git a/sysdeps/i386/ffs.c b/sysdeps/i386/ffs.c > deleted file mode 100644 > index b8e798420b..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <string.h> > - > -#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 <string/ffs.c> > -#endif > diff --git a/sysdeps/i386/i686/ffs.c b/sysdeps/i386/i686/ffs.c > deleted file mode 100644 > index a522077cfe..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <string.h> > - > -#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 <string/ffs.c> > -#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 4415bb0cff..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <string.h> > - > -#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 <string/ffs.c> > - > -#endif > diff --git a/sysdeps/powerpc/ffs.c b/sysdeps/powerpc/ffs.c > deleted file mode 100644 > index 0a046dab99..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <limits.h> > -#include <string.h> > - > -#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 <string/ffs.c> > -#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 d17cdd1c6b..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <limits.h> > -#include <string.h> > - > -#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 7627bd3346..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#include <limits.h> > -#define ffsl __something_else > -#include <string.h> > - > -#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 a31202969e..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#include <string.h> > - > -#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 a1c13d4906..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-2023 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 > - <https://www.gnu.org/licenses/>. */ > - > -#define ffsl __something_else > -#include <string.h> > - > -#undef ffsll > - > -int > -ffsll (long long int x) > -{ > - long long int cnt; > - long long int tmp; > - > - asm ("bsfq %2,%0\n" /* Count low bits in X and store in %1. */ > - "cmoveq %1,%0\n" /* If number was zero, use -1 as result. */ > - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); > - > - return cnt + 1; > -} > - > -#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 <sysdeps/x86_64/ffs.c> > -#undef ffsl > -weak_alias (__ffs, ffsl)
Please add diff --git c/sysdeps/m68k/math-use-builtins-ffs.h i/sysdeps/m68k/math-use-builtins-ffs.h new file mode 100644 index 0000000000..4e1d994453 --- /dev/null +++ i/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/string/ffs.c b/string/ffs.c index bf58f0b7ca..8302ae8420 100644 --- a/string/ffs.c +++ b/string/ffs.c @@ -18,13 +18,16 @@ #include <limits.h> #define ffsl __something_else #include <string.h> - #undef ffs +#include <math-use-builtins.h> /* 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 0cc461a1cf..2315fe1bd7 100644 --- a/string/ffsll.c +++ b/string/ffsll.c @@ -18,20 +18,26 @@ #include <limits.h> #define ffsl __something_else #include <string.h> - #undef ffsll +#include <math-use-builtins.h> +#include <libc-diag.h> /* 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 48361bd8c5..0000000000 --- a/sysdeps/alpha/alphaev67/ffs.S +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2000-2023 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 - <https://www.gnu.org/licenses/>. */ - -/* Finds the first bit set in an integer. */ - -#include <sysdep.h> - - .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 52f406ec32..0000000000 --- a/sysdeps/alpha/alphaev67/ffsll.S +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2000-2023 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 - <https://www.gnu.org/licenses/>. */ - -/* Finds the first bit set in a long. */ - -#include <sysdep.h> - - .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 047fd60352..0000000000 --- a/sysdeps/alpha/ffs.S +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 1996-2023 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 - <https://www.gnu.org/licenses/>. */ - -/* Finds the first bit set in an integer. Optimized for the Alpha - architecture. */ - -#include <sysdep.h> - - .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 870957a4bb..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - - .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 bc3cbf81b0..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - - .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/math-use-builtins-ffs.h b/sysdeps/arm/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/arm/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 04b1d0d5ab..038eb2c523 100644 --- a/sysdeps/generic/math-use-builtins.h +++ b/sysdeps/generic/math-use-builtins.h @@ -40,5 +40,6 @@ #include <math-use-builtins-lrint.h> #include <math-use-builtins-llrint.h> #include <math-use-builtins-logb.h> +#include <math-use-builtins-ffs.h> #endif /* MATH_USE_BUILTINS_H */ diff --git a/sysdeps/i386/ffs.c b/sysdeps/i386/ffs.c deleted file mode 100644 index b8e798420b..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <string.h> - -#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 <string/ffs.c> -#endif diff --git a/sysdeps/i386/i686/ffs.c b/sysdeps/i386/i686/ffs.c deleted file mode 100644 index a522077cfe..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <string.h> - -#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 <string/ffs.c> -#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 4415bb0cff..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <string.h> - -#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 <string/ffs.c> - -#endif diff --git a/sysdeps/powerpc/ffs.c b/sysdeps/powerpc/ffs.c deleted file mode 100644 index 0a046dab99..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <limits.h> -#include <string.h> - -#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 <string/ffs.c> -#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 d17cdd1c6b..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <limits.h> -#include <string.h> - -#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 7627bd3346..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#include <limits.h> -#define ffsl __something_else -#include <string.h> - -#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 a31202969e..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#include <string.h> - -#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 a1c13d4906..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-2023 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 - <https://www.gnu.org/licenses/>. */ - -#define ffsl __something_else -#include <string.h> - -#undef ffsll - -int -ffsll (long long int x) -{ - long long int cnt; - long long int tmp; - - asm ("bsfq %2,%0\n" /* Count low bits in X and store in %1. */ - "cmoveq %1,%0\n" /* If number was zero, use -1 as result. */ - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); - - return cnt + 1; -} - -#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 <sysdeps/x86_64/ffs.c> -#undef ffsl -weak_alias (__ffs, ffsl)