mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
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 <carlos@redhat.com>
This commit is contained in:
parent
26d01172f5
commit
ae4b8d6a0e
@ -18,13 +18,16 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#define ffsl __something_else
|
#define ffsl __something_else
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#undef ffs
|
#undef ffs
|
||||||
|
#include <math-use-builtins.h>
|
||||||
|
|
||||||
/* Find the first bit set in I. */
|
/* Find the first bit set in I. */
|
||||||
int
|
int
|
||||||
__ffs (int i)
|
__ffs (int i)
|
||||||
{
|
{
|
||||||
|
#if USE_FFS_BUILTIN
|
||||||
|
return __builtin_ffs (i);
|
||||||
|
#else
|
||||||
static const unsigned char table[] =
|
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,
|
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);
|
a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
|
||||||
|
|
||||||
return table[x >> a] + a;
|
return table[x >> a] + a;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
weak_alias (__ffs, ffs)
|
weak_alias (__ffs, ffs)
|
||||||
libc_hidden_def (__ffs)
|
libc_hidden_def (__ffs)
|
||||||
|
@ -18,20 +18,26 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#define ffsl __something_else
|
#define ffsl __something_else
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#undef ffsll
|
#undef ffsll
|
||||||
|
#include <math-use-builtins.h>
|
||||||
|
#include <libc-diag.h>
|
||||||
|
|
||||||
/* Find the first bit set in I. */
|
/* Find the first bit set in I. */
|
||||||
int
|
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;
|
unsigned long long int x = i & -i;
|
||||||
|
|
||||||
if (x <= 0xffffffff)
|
if (x <= 0xffffffff)
|
||||||
return ffs (i);
|
return ffs (i);
|
||||||
else
|
else
|
||||||
return 32 + ffs (i >> 32);
|
return 32 + ffs (i >> 32);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
weak_alias (__ffsll, ffsll)
|
||||||
|
|
||||||
#if ULONG_MAX != UINT_MAX
|
#if ULONG_MAX != UINT_MAX
|
||||||
#undef ffsl
|
#undef ffsl
|
||||||
|
2
sysdeps/aarch64/math-use-builtins-ffs.h
Normal file
2
sysdeps/aarch64/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 1
|
@ -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
|
|
||||||
<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)
|
|
@ -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
|
|
||||||
<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)
|
|
@ -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
|
|
||||||
<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)
|
|
@ -1 +0,0 @@
|
|||||||
/* This function is defined in ffs.S. */
|
|
7
sysdeps/alpha/math-use-builtins-ffs.h
Normal file
7
sysdeps/alpha/math-use-builtins-ffs.h
Normal file
@ -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
|
2
sysdeps/arc/math-use-builtins-ffs.h
Normal file
2
sysdeps/arc/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 0
|
@ -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
|
|
||||||
<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)
|
|
@ -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
|
|
||||||
<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)
|
|
2
sysdeps/arm/armv6t2/math-use-builtins-ffs.h
Normal file
2
sysdeps/arm/armv6t2/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 0
|
2
sysdeps/generic/math-use-builtins-ffs.h
Normal file
2
sysdeps/generic/math-use-builtins-ffs.h
Normal file
@ -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-lrint.h>
|
||||||
#include <math-use-builtins-llrint.h>
|
#include <math-use-builtins-llrint.h>
|
||||||
#include <math-use-builtins-logb.h>
|
#include <math-use-builtins-logb.h>
|
||||||
|
#include <math-use-builtins-ffs.h>
|
||||||
|
|
||||||
#endif /* MATH_USE_BUILTINS_H */
|
#endif /* MATH_USE_BUILTINS_H */
|
||||||
|
@ -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
|
|
||||||
<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
|
|
@ -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
|
|
||||||
<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
|
|
2
sysdeps/i386/math-use-builtins-ffs.h
Normal file
2
sysdeps/i386/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 0
|
2
sysdeps/ia64/math-use-builtins-ffs.h
Normal file
2
sysdeps/ia64/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 1
|
@ -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
|
|
||||||
<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
|
|
7
sysdeps/m68k/math-use-builtins-ffs.h
Normal file
7
sysdeps/m68k/math-use-builtins-ffs.h
Normal file
@ -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
|
@ -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
|
|
||||||
<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
|
|
6
sysdeps/powerpc/math-use-builtins-ffs.h
Normal file
6
sysdeps/powerpc/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#ifdef __powerpc64__
|
||||||
|
# define USE_FFSLL_BUILTIN 1
|
||||||
|
#else
|
||||||
|
# define USE_FFSLL_BUILTIN 0
|
||||||
|
#endif
|
@ -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
|
|
||||||
<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)
|
|
@ -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
|
|
||||||
<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
|
|
@ -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
|
|
||||||
<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)
|
|
@ -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
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#define ffsl __something_else
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#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
|
|
2
sysdeps/x86_64/math-use-builtins-ffs.h
Normal file
2
sysdeps/x86_64/math-use-builtins-ffs.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define USE_FFS_BUILTIN 1
|
||||||
|
#define USE_FFSLL_BUILTIN 1
|
@ -1,4 +0,0 @@
|
|||||||
#define ffsl __something_else
|
|
||||||
#include <sysdeps/x86_64/ffs.c>
|
|
||||||
#undef ffsl
|
|
||||||
weak_alias (__ffs, ffsl)
|
|
Loading…
Reference in New Issue
Block a user