mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08: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>
|
||||
#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
|
||||
|
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-llrint.h>
|
||||
#include <math-use-builtins-logb.h>
|
||||
#include <math-use-builtins-ffs.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