From patchwork Thu Aug 24 17:13:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 1825549 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=qiXfRjZu; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RWqSm61kVz1yfF for ; Fri, 25 Aug 2023 03:14:32 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 88F6A385DC03 for ; Thu, 24 Aug 2023 17:14:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 88F6A385DC03 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1692897270; bh=mH68icg25/DkT3D2mht1rml3+UdlqxEPQixrDkkpe00=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=qiXfRjZukHzb3R7QfziuuNhih5GcyOoF2XUm09fl5DfnY5zQ6qK7XF1HUOU+iARPx x2sS3ZKV7qNeYdLoCDr8NcwOip9pP97kSV9cgq0jlm0F741ewUs6vy4269mmH0KDM+ YzBiWlMjOq7Pl9IAe51nqPz8/ay5Vpa43X1TZygM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-oi1-x235.google.com (mail-oi1-x235.google.com [IPv6:2607:f8b0:4864:20::235]) by sourceware.org (Postfix) with ESMTPS id 2D97A385C6ED for ; Thu, 24 Aug 2023 17:13:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2D97A385C6ED Received: by mail-oi1-x235.google.com with SMTP id 5614622812f47-3a36b52b4a4so63609b6e.1 for ; Thu, 24 Aug 2023 10:13:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692897219; x=1693502019; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mH68icg25/DkT3D2mht1rml3+UdlqxEPQixrDkkpe00=; b=h+R7m7UoMoRZnzTMeAniBQM4IOwHNa1r2bPyLeBbAehBDq8BDMIeJGUTVXZJglul4R fpdoAN/2/6UINQ7oYyayu8SkhekKbIhJ9hg2pWRO/OXqKpSgsVKbcfovd90S5V75MMOx NC+AhAGXnv11XzjuRH58FMV0KrvCQaznBA17nFavB1EU86S/mDTF3DOHrticKKrczau6 nzR99HhnmqJ2NeMuHZB3I2zT7Yw6LE6p7V2P6DivKJFsEo3o0MP46+oopU45ehfMkJ57 x5NvFFNk74dbpjACN3JtsnjoxXPTEhd6ogj7XSj2AxbPd78Ysb+0olEoGehDG8ZiooBE M4HA== X-Gm-Message-State: AOJu0YzLm7jZr2U0IGJ7Y1EOBbpaEJjrBliYrpGHcK2GfvWCd7jfoous CKb+riwDWCzrx1AfQGzrFaLCPRCUiJZZJ4yvMT0xOA== X-Google-Smtp-Source: AGHT+IFfEZYDpKVO/HSluXa9dDIcesGjfrfvRz13asZXRl3+3rjFPSoRYsE4eJOx1gQ00aGvnK8M8A== X-Received: by 2002:a05:6808:1805:b0:3a9:a304:4e6f with SMTP id bh5-20020a056808180500b003a9a3044e6fmr200548oib.25.1692897218254; Thu, 24 Aug 2023 10:13:38 -0700 (PDT) Received: from mandiga.. ([2804:1b3:a7c2:c275:5154:75ba:e0b6:f70d]) by smtp.gmail.com with ESMTPSA id y2-20020a056808130200b003a8560a9d34sm5094546oiv.25.2023.08.24.10.13.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Aug 2023 10:13:37 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v2] string: Use builtins for ffs and ffsll Date: Thu, 24 Aug 2023 14:13:33 -0300 Message-Id: <20230824171333.1032744-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" 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/m68k/math-use-builtins-ffs.h | 7 ++ sysdeps/powerpc/ffs.c | 46 ------------- sysdeps/powerpc/math-use-builtins-ffs.h | 6 ++ sysdeps/powerpc/powerpc64/ffsll.c | 36 ---------- sysdeps/s390/ffs.c | 69 ------------------- sysdeps/x86_64/ffs.c | 38 ----------- sysdeps/x86_64/ffsll.c | 41 ----------- sysdeps/x86_64/math-use-builtins-ffs.h | 2 + sysdeps/x86_64/x32/ffs.c | 4 -- 28 files changed, 48 insertions(+), 651 deletions(-) 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 create mode 100644 sysdeps/m68k/math-use-builtins-ffs.h 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 #define ffsl __something_else #include - #undef ffs +#include /* Find the first bit set in I. */ int __ffs (int i) { +#if USE_FFS_BUILTIN + return __builtin_ffs (i); +#else static const unsigned char table[] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -42,6 +45,7 @@ __ffs (int i) a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); return table[x >> a] + a; +#endif } weak_alias (__ffs, ffs) libc_hidden_def (__ffs) diff --git a/string/ffsll.c b/string/ffsll.c index 0cc461a1cf..2315fe1bd7 100644 --- a/string/ffsll.c +++ b/string/ffsll.c @@ -18,20 +18,26 @@ #include #define ffsl __something_else #include - #undef ffsll +#include +#include /* Find the first bit set in I. */ int -ffsll (long long int i) +__ffsll (long long int i) { +#if USE_FFSLL_BUILTIN + return __builtin_ffsll (i); +#else unsigned long long int x = i & -i; if (x <= 0xffffffff) return ffs (i); else return 32 + ffs (i >> 32); +#endif } +weak_alias (__ffsll, ffsll) #if ULONG_MAX != UINT_MAX #undef ffsl diff --git a/sysdeps/aarch64/math-use-builtins-ffs.h b/sysdeps/aarch64/math-use-builtins-ffs.h new file mode 100644 index 0000000000..a83bb15414 --- /dev/null +++ b/sysdeps/aarch64/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 1 diff --git a/sysdeps/alpha/alphaev67/ffs.S b/sysdeps/alpha/alphaev67/ffs.S deleted file mode 100644 index 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 - . */ - -/* Finds the first bit set in an integer. */ - -#include - - .arch ev6 - .set noreorder - .set noat - - -ENTRY(__ffs) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -#else - .prologue 0 -#endif - - zap $16, 0xF0, $16 - cttz $16, $0 - addq $0, 1, $0 - cmoveq $16, 0, $0 - - nop - nop - nop - ret - -END(__ffs) - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/alpha/alphaev67/ffsll.S b/sysdeps/alpha/alphaev67/ffsll.S deleted file mode 100644 index 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 - . */ - -/* Finds the first bit set in a long. */ - -#include - - .arch ev6 - .set noreorder - .set noat - -ENTRY(ffsl) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -#else - .prologue 0 -#endif - - cttz $16, $0 - addq $0, 1, $0 - cmoveq $16, 0, $0 - ret - -END(ffsl) - -weak_extern (ffsl) -weak_alias (ffsl, ffsll) diff --git a/sysdeps/alpha/ffs.S b/sysdeps/alpha/ffs.S deleted file mode 100644 index 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 - . */ - -/* Finds the first bit set in an integer. Optimized for the Alpha - architecture. */ - -#include - - .set noreorder - .set noat - - -ENTRY(__ffs) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 - zap $16, 0xF0, $16 - br $ffsl..ng -#else - .prologue 0 - zap $16, 0xF0, $16 - # FALLTHRU -#endif -END(__ffs) - - .align 4 -ENTRY(ffsl) -#ifdef PROF - ldgp gp, 0(pv) - lda AT, _mcount - jsr AT, (AT), _mcount - .prologue 1 -$ffsl..ng: -#else - .prologue 0 -#endif - not $16, $1 # e0 : - ldi $2, -1 # .. e1 : - cmpbge $1, $2, $3 # e0 : bit N == 1 for byte N == 0 - clr $0 # .. e1 : - addq $3, 1, $4 # e0 : - bic $4, $3, $3 # e1 : bit N == 1 for first byte N != 0 - and $3, 0xF0, $4 # e0 : - and $3, 0xCC, $5 # .. e1 : - and $3, 0xAA, $6 # e0 : - cmovne $4, 4, $0 # .. e1 : - cmovne $5, 2, $5 # e0 : - cmovne $6, 1, $6 # .. e1 : - addl $0, $5, $0 # e0 : - addl $0, $6, $0 # e1 : $0 == N - extbl $16, $0, $1 # e0 : $1 == byte N - ldi $2, 1 # .. e1 : - negq $1, $3 # e0 : - and $3, $1, $3 # e1 : bit N == least bit set of byte N - and $3, 0xF0, $4 # e0 : - and $3, 0xCC, $5 # .. e1 : - and $3, 0xAA, $6 # e0 : - cmovne $4, 5, $2 # .. e1 : - cmovne $5, 2, $5 # e0 : - cmovne $6, 1, $6 # .. e1 : - s8addl $0, $2, $0 # e0 : mult byte ofs by 8 and sum - addl $5, $6, $5 # .. e1 : - addl $0, $5, $0 # e0 : - nop # .. e1 : - cmoveq $16, 0, $0 # e0 : trap input == 0 case. - ret # .. e1 : 18 - -END(ffsl) - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -weak_extern (ffsl) -weak_alias (ffsl, ffsll) diff --git a/sysdeps/alpha/ffsll.S b/sysdeps/alpha/ffsll.S deleted file mode 100644 index b2f46d899c..0000000000 --- a/sysdeps/alpha/ffsll.S +++ /dev/null @@ -1 +0,0 @@ -/* This function is defined in ffs.S. */ diff --git a/sysdeps/alpha/math-use-builtins-ffs.h b/sysdeps/alpha/math-use-builtins-ffs.h new file mode 100644 index 0000000000..9925e374ac --- /dev/null +++ b/sysdeps/alpha/math-use-builtins-ffs.h @@ -0,0 +1,7 @@ +#ifdef __alpha_cix__ +# define USE_FFS_BUILTIN 1 +# define USE_FFSLL_BUILTIN 1 +#else +# define USE_FFS_BUILTIN 0 +# define USE_FFSLL_BUILTIN 0 +#endif diff --git a/sysdeps/arc/math-use-builtins-ffs.h b/sysdeps/arc/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/arc/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/arm/armv6t2/ffs.S b/sysdeps/arm/armv6t2/ffs.S deleted file mode 100644 index 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 - . */ - -#include - - .syntax unified - .text - -ENTRY (__ffs) - cmp r0, #0 - rbit r0, r0 - itt ne - clzne r0, r0 - addne r0, r0, #1 - bx lr -END (__ffs) - -weak_alias (__ffs, ffs) -weak_alias (__ffs, ffsl) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/arm/armv6t2/ffsll.S b/sysdeps/arm/armv6t2/ffsll.S deleted file mode 100644 index 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 - . */ - -#include - - .syntax unified - .text - -ENTRY (ffsll) - @ If low part is 0, operate on the high part. Ensure that the - @ word on which we operate is in r0. Set r2 to the bit offset - @ of the word being considered. Set the flags for the word - @ being operated on. -#ifdef __ARMEL__ - cmp r0, #0 - itee ne - movne r2, #0 - moveq r2, #32 - movseq r0, r1 -#else - cmp r1, #0 - ittee ne - movne r2, #0 - movne r0, r1 - moveq r2, #32 - cmpeq r0, #0 -#endif - @ Perform the ffs on r0. - rbit r0, r0 - ittt ne - clzne r0, r0 - addne r2, r2, #1 - addne r0, r0, r2 - bx lr -END (ffsll) diff --git a/sysdeps/arm/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 #include #include +#include #endif /* MATH_USE_BUILTINS_H */ diff --git a/sysdeps/i386/ffs.c b/sysdeps/i386/ffs.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("xorl %0,%0\n" /* Set CNT to zero. */ - "bsfl %2,%1\n" /* Count low bits in X and store in %1. */ - "jz 1f\n" /* Jump if OK, i.e. X was non-zero. */ - "leal 1(%1),%0\n" /* Return bsfl-result plus one on %0. */ - "1:" : "=&a" (cnt), "=r" (tmp) : "rm" (x)); - - return cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else -#include -#endif diff --git a/sysdeps/i386/i686/ffs.c b/sysdeps/i386/i686/ffs.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("bsfl %2,%0\n" /* Count low bits in X and store in %1. */ - "cmovel %1,%0\n" /* If number was zero, use -1 as result. */ - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); - - return cnt + 1; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else -#include -#endif diff --git a/sysdeps/i386/math-use-builtins-ffs.h b/sysdeps/i386/math-use-builtins-ffs.h new file mode 100644 index 0000000000..c0f108c264 --- /dev/null +++ b/sysdeps/i386/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/ia64/math-use-builtins-ffs.h b/sysdeps/ia64/math-use-builtins-ffs.h new file mode 100644 index 0000000000..a83bb15414 --- /dev/null +++ b/sysdeps/ia64/math-use-builtins-ffs.h @@ -0,0 +1,2 @@ +#define USE_FFS_BUILTIN 1 +#define USE_FFSLL_BUILTIN 1 diff --git a/sysdeps/m68k/ffs.c b/sysdeps/m68k/ffs.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include - -#undef ffs - -#if defined (__GNUC__) && defined (__mc68020__) - -int -__ffs (int x) -{ - int cnt; - - asm ("bfffo %1{#0:#0},%0" : "=d" (cnt) : "dm" (x & -x)); - - return 32 - cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#undef ffsl -weak_alias (__ffs, ffsl) - -#else - -#include - -#endif diff --git a/sysdeps/m68k/math-use-builtins-ffs.h b/sysdeps/m68k/math-use-builtins-ffs.h new file mode 100644 index 0000000000..4e1d994453 --- /dev/null +++ b/sysdeps/m68k/math-use-builtins-ffs.h @@ -0,0 +1,7 @@ +#if defined __mc68020__ || defined __mc68030__ || defined __mc68040__ \ + || defined __mc68060__ +# define USE_FFS_BUILTIN 1 +#else +# define USE_FFS_BUILTIN 0 +#endif +#define USE_FFSLL_BUILTIN 0 diff --git a/sysdeps/powerpc/ffs.c b/sysdeps/powerpc/ffs.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include -#include - -#undef ffs - -#ifdef __GNUC__ - -int -__ffs (int x) -{ - int cnt; - - asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x)); - return 32 - cnt; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#if ULONG_MAX == UINT_MAX -#undef ffsl -weak_alias (__ffs, ffsl) -#endif - -#else -#include -#endif diff --git a/sysdeps/powerpc/math-use-builtins-ffs.h b/sysdeps/powerpc/math-use-builtins-ffs.h new file mode 100644 index 0000000000..7b1d401823 --- /dev/null +++ b/sysdeps/powerpc/math-use-builtins-ffs.h @@ -0,0 +1,6 @@ +#define USE_FFS_BUILTIN 1 +#ifdef __powerpc64__ +# define USE_FFSLL_BUILTIN 1 +#else +# define USE_FFSLL_BUILTIN 0 +#endif diff --git a/sysdeps/powerpc/powerpc64/ffsll.c b/sysdeps/powerpc/powerpc64/ffsll.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include -#include - -#undef ffs - -int -__ffsll (long long int x) -{ - int cnt; - - asm ("cntlzd %0,%1" : "=r" (cnt) : "r" (x & -x)); - return 64 - cnt; -} -weak_alias (__ffsll, ffsll) -#undef ffsl -weak_alias (__ffsll, ffsl) diff --git a/sysdeps/s390/ffs.c b/sysdeps/s390/ffs.c deleted file mode 100644 index 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 - . */ - -#include -#define ffsl __something_else -#include - -#undef ffs - -/* ffs: find first bit set. This is defined the same way as - the libc and compiler builtin ffs routines, therefore - differs in spirit from the above ffz (man ffs). */ - -int -__ffs (int x) -{ - int r; - - if (x == 0) - return 0; - __asm__(" lr %%r1,%1\n" - " sr %0,%0\n" - " tml %%r1,0xFFFF\n" - " jnz 0f\n" - " ahi %0,16\n" - " srl %%r1,16\n" - "0: tml %%r1,0x00FF\n" - " jnz 1f\n" - " ahi %0,8\n" - " srl %%r1,8\n" - "1: tml %%r1,0x000F\n" - " jnz 2f\n" - " ahi %0,4\n" - " srl %%r1,4\n" - "2: tml %%r1,0x0003\n" - " jnz 3f\n" - " ahi %0,2\n" - " srl %%r1,2\n" - "3: tml %%r1,0x0001\n" - " jnz 4f\n" - " ahi %0,1\n" - "4:" - : "=&d" (r) : "d" (x) : "cc", "1" ); - return r+1; -} - -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) -#if ULONG_MAX == UINT_MAX -#undef ffsl -weak_alias (__ffs, ffsl) -#endif diff --git a/sysdeps/x86_64/ffs.c b/sysdeps/x86_64/ffs.c deleted file mode 100644 index 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 - . */ - -#include - -#undef ffs - -int -__ffs (int x) -{ - int cnt; - int tmp; - - asm ("bsfl %2,%0\n" /* Count low bits in X and store in %1. */ - "cmovel %1,%0\n" /* If number was zero, use -1 as result. */ - : "=&r" (cnt), "=r" (tmp) : "rm" (x), "1" (-1)); - - return cnt + 1; -} -weak_alias (__ffs, ffs) -libc_hidden_def (__ffs) -libc_hidden_builtin_def (ffs) diff --git a/sysdeps/x86_64/ffsll.c b/sysdeps/x86_64/ffsll.c deleted file mode 100644 index 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 - . */ - -#define ffsl __something_else -#include - -#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 -#undef ffsl -weak_alias (__ffs, ffsl)