On 24/08/23 16:44, Richard Henderson wrote:
> On 8/24/23 10:13, Adhemerval Zanella via Libc-alpha wrote:
>> 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
>> }
>
> It seems like you also need
>
> #if USE_FFS_BUILTIN
> # define ffs __builtin_ffs
> #endif
>
> in order to avoid a function call for the 32-bit host case, e.g.
I did analyze it and for 32 bits targets that do define USE_FFSLL_BUILTIN
to 1 (armv6t2, arc, i386, m68k/mc68020, and powerpc) gcc will lower ffs to
__builin_ffs. For instance:
armv7a-linux-gnueabihf$ arm-linux-gnueabihf-objdump -d string/ffsll.os
[...]
00000000 <__ffsll>:
0: e2703000 rsbs r3, r0, #0
4: e2e13000 rsc r3, r1, #0
8: e1130001 tst r3, r1
c: 1a000005 bne 28 <__ffsll+0x28>
10: e3500000 cmp r0, #0
14: e6ff0f30 rbit r0, r0
18: e16f0f10 clz r0, r0
1c: 03e00000 mvneq r0, #0
20: e2800001 add r0, r0, #1
24: e12fff1e bx lr
28: e3510000 cmp r1, #0
2c: e6ff1f31 rbit r1, r1
30: e16f1f11 clz r1, r1
34: 03e01000 mvneq r1, #0
38: e2810021 add r0, r1, #33 ; 0x21
3c: e12fff1e bx lr
I also check that arc, i386, m68k/mc68020, and powerpc also lower ffs
correctly. So there is no need to this extra define.
>
>
>> 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
>
> Here. Also, this file is misplaced wrt the armv6t2 files you're removing.
Ack.
>
> This will work, I suppose, but you'll get the libgcc implementation.
> If you're willing to settle for that, you might as well drop all of
> this extra use-builtins stuff and unconditionally use __builtin_ffs*.
It is not that simple, because depending of the target gcc will lower
__builtin_ffs to fss instead of libgcc (riscv64 for instance).
@@ -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)
@@ -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
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 1
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -1 +0,0 @@
-/* This function is defined in ffs.S. */
new file mode 100644
@@ -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
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 0
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -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)
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 0
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 0
+#define USE_FFSLL_BUILTIN 0
@@ -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 */
deleted file mode 100644
@@ -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
deleted file mode 100644
@@ -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
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 0
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 1
deleted file mode 100644
@@ -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
new file mode 100644
@@ -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
deleted file mode 100644
@@ -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
new file mode 100644
@@ -0,0 +1,6 @@
+#define USE_FFS_BUILTIN 1
+#ifdef __powerpc64__
+# define USE_FFSLL_BUILTIN 1
+#else
+# define USE_FFSLL_BUILTIN 0
+#endif
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -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
deleted file mode 100644
@@ -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)
deleted file mode 100644
@@ -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
new file mode 100644
@@ -0,0 +1,2 @@
+#define USE_FFS_BUILTIN 1
+#define USE_FFSLL_BUILTIN 1
deleted file mode 100644
@@ -1,4 +0,0 @@
-#define ffsl __something_else
-#include <sysdeps/x86_64/ffs.c>
-#undef ffsl
-weak_alias (__ffs, ffsl)