> Date: Thu, 25 Jun 2020 23:05:36 +0200 > From: Christian Weisgerber <[email protected]> > > Trying again, this time with powerpc64 added: > > This adds the optimized ffs(3) versions on aarch64, powerpc, and > powerpc64 to libc. Also add a brief regression test.
Not yet in the position to test the powerpc64 implementation. But it should work. ok kettenis@ > Index: lib/libc/arch/aarch64/string/Makefile.inc > =================================================================== > RCS file: /cvs/src/lib/libc/arch/aarch64/string/Makefile.inc,v > retrieving revision 1.1 > diff -u -p -r1.1 Makefile.inc > --- lib/libc/arch/aarch64/string/Makefile.inc 11 Jan 2017 18:09:24 -0000 > 1.1 > +++ lib/libc/arch/aarch64/string/Makefile.inc 11 Jun 2020 20:30:34 -0000 > @@ -2,7 +2,7 @@ > > SRCS+= bcopy.c memcpy.c memmove.c \ > strchr.c strrchr.c \ > - bcmp.c bzero.c ffs.c memchr.c memcmp.c memset.c \ > + bcmp.c bzero.c ffs.S memchr.c memcmp.c memset.c \ > strcmp.c strncmp.c \ > strcat.c strcpy.c strcspn.c strlen.c strlcat.c strlcpy.c \ > strncat.c strncpy.c strpbrk.c strsep.c \ > Index: lib/libc/arch/aarch64/string/ffs.S > =================================================================== > RCS file: lib/libc/arch/aarch64/string/ffs.S > diff -N lib/libc/arch/aarch64/string/ffs.S > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ lib/libc/arch/aarch64/string/ffs.S 11 Jun 2020 20:31:19 -0000 > @@ -0,0 +1,18 @@ > +/* $OpenBSD$ */ > +/* > + * Written by Christian Weisgerber <[email protected]>. > + * Public domain. > + */ > + > +#include "DEFS.h" > + > +ENTRY(ffs) > + RETGUARD_SETUP(ffs, x15) > + rbit w1, w0 > + clz w1, w1 > + cmp w0, wzr > + csinc w0, wzr, w1, eq > + RETGUARD_CHECK(ffs, x15) > + ret > +END(ffs) > +.protected > Index: lib/libc/arch/powerpc/string/Makefile.inc > =================================================================== > RCS file: /cvs/src/lib/libc/arch/powerpc/string/Makefile.inc,v > retrieving revision 1.6 > diff -u -p -r1.6 Makefile.inc > --- lib/libc/arch/powerpc/string/Makefile.inc 15 May 2015 22:29:37 -0000 > 1.6 > +++ lib/libc/arch/powerpc/string/Makefile.inc 11 Jun 2020 20:33:04 -0000 > @@ -2,7 +2,7 @@ > > SRCS+= memcpy.c memmove.S \ > strchr.c strrchr.c \ > - bcmp.c bzero.c ffs.c memchr.c memcmp.c memset.c strcat.c \ > + bcmp.c bzero.c ffs.S memchr.c memcmp.c memset.c strcat.c \ > strcmp.c strcpy.c strcspn.c strlen.c strlcat.c strlcpy.c \ > strncat.c strncmp.c strncpy.c strpbrk.c strsep.c \ > strspn.c strstr.c swab.c > Index: lib/libc/arch/powerpc/string/ffs.S > =================================================================== > RCS file: lib/libc/arch/powerpc/string/ffs.S > diff -N lib/libc/arch/powerpc/string/ffs.S > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ lib/libc/arch/powerpc/string/ffs.S 11 Jun 2020 20:33:19 -0000 > @@ -0,0 +1,16 @@ > +/* $OpenBSD$ */ > +/* > + * Written by Christian Weisgerber <[email protected]>. > + * Public domain. > + */ > + > +#include "SYS.h" > + > +ENTRY(ffs) > + neg %r4, %r3 > + and %r3, %r3, %r4 > + cntlzw %r3, %r3 > + subfic %r3, %r3, 32 > + blr > +END(ffs) > +.protected > Index: lib/libc/arch/powerpc64/string/Makefile.inc > =================================================================== > RCS file: /cvs/src/lib/libc/arch/powerpc64/string/Makefile.inc,v > retrieving revision 1.1 > diff -u -p -r1.1 Makefile.inc > --- lib/libc/arch/powerpc64/string/Makefile.inc 25 Jun 2020 02:34:22 > -0000 1.1 > +++ lib/libc/arch/powerpc64/string/Makefile.inc 25 Jun 2020 20:53:42 > -0000 > @@ -2,7 +2,7 @@ > > SRCS+= memcpy.c memmove.S \ > strchr.c strrchr.c \ > - bcmp.c bzero.c ffs.c memchr.c memcmp.c memset.c strcat.c \ > + bcmp.c bzero.c ffs.S memchr.c memcmp.c memset.c strcat.c \ > strcmp.c strcpy.c strcspn.c strlen.c strlcat.c strlcpy.c \ > strncat.c strncmp.c strncpy.c strpbrk.c strsep.c \ > strspn.c strstr.c swab.c > Index: lib/libc/arch/powerpc64/string/ffs.S > =================================================================== > RCS file: lib/libc/arch/powerpc64/string/ffs.S > diff -N lib/libc/arch/powerpc64/string/ffs.S > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ lib/libc/arch/powerpc64/string/ffs.S 25 Jun 2020 20:57:16 -0000 > @@ -0,0 +1,15 @@ > +/* $OpenBSD$ */ > +/* > + * Written by Christian Weisgerber <[email protected]>. > + * Public domain. > + */ > + > +#include "DEFS.h" > + > +ENTRY(ffs) > + neg %r4, %r3 > + and %r3, %r3, %r4 > + cntlzw %r3, %r3 > + subfic %r3, %r3, 32 > + blr > +END_BUILTIN(ffs) > Index: regress/lib/libc/ffs/Makefile > =================================================================== > RCS file: regress/lib/libc/ffs/Makefile > diff -N regress/lib/libc/ffs/Makefile > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ regress/lib/libc/ffs/Makefile 20 Jun 2020 15:26:51 -0000 > @@ -0,0 +1,6 @@ > +PROG= ffs_test > + > +# prevent constant folding and inlining of __builtin_ffs() > +CFLAGS+= -ffreestanding > + > +.include <bsd.regress.mk> > Index: regress/lib/libc/ffs/ffs_test.c > =================================================================== > RCS file: regress/lib/libc/ffs/ffs_test.c > diff -N regress/lib/libc/ffs/ffs_test.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ regress/lib/libc/ffs/ffs_test.c 12 Jun 2020 08:43:19 -0000 > @@ -0,0 +1,18 @@ > +/* $OpenBSD$ */ > +/* > + * Written by Christian Weisgerber <[email protected]>. > + * Public domain. > + */ > + > +#include <assert.h> > +#include <stdint.h> > +#include <string.h> > + > +int > +main(void) > +{ > + assert(ffs(0) == 0); > + assert(ffs(0x8080) == 8); > + assert(ffs(INT32_MIN) == 32); > + return (0); > +} > -- > Christian "naddy" Weisgerber [email protected] > >
