Christian Weisgerber:
> This adds the optimized ffs(3) versions on aarch64 and powerpc to
> libc, for completeness' sake.
>
> Also add a brief regression test.
>
> OK?
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: 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 12 Jun 2020 08:43:43 -0000
@@ -0,0 +1,6 @@
+PROG= ffs_test
+
+# prevent 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]