Re: git: ee8b0c436d72 - main - lib/libc/string: replace ffs/fls implementations with clang builtins
Date: Mon, 10 Jul 2023 19:56:19 UTC
On 7/3/23 1:23 PM, Robert Clausecker wrote: > The branch main has been updated by fuz: > > URL: https://cgit.FreeBSD.org/src/commit/?id=ee8b0c436d7221c25e8be3c3fe1f9da78b9d5b16 > > commit ee8b0c436d7221c25e8be3c3fe1f9da78b9d5b16 > Author: Robert Clausecker <fuz@FreeBSD.org> > AuthorDate: 2023-06-23 16:22:54 +0000 > Commit: Robert Clausecker <fuz@FreeBSD.org> > CommitDate: 2023-07-03 20:18:27 +0000 > > lib/libc/string: replace ffs/fls implementations with clang builtins > > Most architectures we support (except for riscv64) have instructions > to compute these functions very quickly. Replace old code with the > ffs and clz builtin functions, allowing clang to generate good code > for all architectures. > > As a consequence, toss out arm and i386 ffs() implementations. > > Sponsored by: FreeBSD Foundation > Approved by: mhorne > MFC after: 1 week > Differential Revision: https://reviews.freebsd.org/D40730 > --- > lib/libc/arm/string/Makefile.inc | 1 - > lib/libc/arm/string/ffs.S | 57 --------------------------------------- > lib/libc/i386/string/Makefile.inc | 1 - > lib/libc/i386/string/ffs.S | 56 -------------------------------------- > lib/libc/string/ffs.c | 12 ++++----- > lib/libc/string/ffsl.c | 12 ++++----- > lib/libc/string/ffsll.c | 12 ++++----- > lib/libc/string/fls.c | 13 +++++---- > lib/libc/string/flsl.c | 14 +++++----- > lib/libc/string/flsll.c | 13 +++++---- > 10 files changed, 34 insertions(+), 157 deletions(-) > > diff --git a/lib/libc/string/ffs.c b/lib/libc/string/ffs.c > index 738ef90ce091..c011b3390612 100644 > --- a/lib/libc/string/ffs.c > +++ b/lib/libc/string/ffs.c > @@ -3,6 +3,10 @@ > * > * Copyright (c) 1990, 1993 > * The Regents of the University of California. All rights reserved. > + * Copyright (c) 2023 The FreeBSD Foundation > + * > + * Portions of this software were developed by Robert Clausecker > + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions > @@ -43,11 +47,5 @@ __FBSDID("$FreeBSD$"); > int > ffs(int mask) > { > - int bit; > - > - if (mask == 0) > - return(0); > - for (bit = 1; !(mask & 1); bit++) > - mask = (unsigned int)mask >> 1; > - return (bit); > + return (__builtin_ffs(mask)); This breaks the build on GCC: /usr/home/john/work/freebsd/main/lib/libc/string/ffs.c: In function 'ffs': /usr/home/john/work/freebsd/main/lib/libc/string/ffs.c:48:1: error: infinite recursion detected [-Werror=infinite-recursion] 48 | ffs(int mask) | ^~~ /usr/home/john/work/freebsd/main/lib/libc/string/ffs.c:50:17: note: recursive call 50 | return (__builtin_ffs(mask)); | ~^~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors *** Error code 1 -- John Baldwin