summaryrefslogtreecommitdiffstats
path: root/sys/lib
diff options
context:
space:
mode:
authornaddy <naddy@openbsd.org>2020-06-10 20:19:29 +0000
committernaddy <naddy@openbsd.org>2020-06-10 20:19:29 +0000
commitd41240fab998b3c42f736af0544339ebedba7e73 (patch)
tree19d408af44104ca010e71bc6b888b8b60e576e69 /sys/lib
parentAdd clock interrupt support, adapted from the randomized dual clock (diff)
downloadwireguard-openbsd-d41240fab998b3c42f736af0544339ebedba7e73.tar.xz
wireguard-openbsd-d41240fab998b3c42f736af0544339ebedba7e73.zip
Provide an optimized implementation of ffs(3) in the kernel on
arm64/powerpc/powerpc64, making use of the count leading zeros instruction. powerpc testing by cwen@; ok kettenis@ deraadt@
Diffstat (limited to 'sys/lib')
-rw-r--r--sys/lib/libkern/arch/arm64/ffs.S17
-rw-r--r--sys/lib/libkern/arch/powerpc/ffs.S15
-rw-r--r--sys/lib/libkern/arch/powerpc64/ffs.S15
3 files changed, 47 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/arm64/ffs.S b/sys/lib/libkern/arch/arm64/ffs.S
new file mode 100644
index 00000000000..03101cb2c9f
--- /dev/null
+++ b/sys/lib/libkern/arch/arm64/ffs.S
@@ -0,0 +1,17 @@
+/* $OpenBSD: ffs.S,v 1.1 2020/06/10 20:19:29 naddy Exp $ */
+/*
+ * Written by Christian Weisgerber <naddy@openbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.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)
diff --git a/sys/lib/libkern/arch/powerpc/ffs.S b/sys/lib/libkern/arch/powerpc/ffs.S
new file mode 100644
index 00000000000..13fe17fb4f8
--- /dev/null
+++ b/sys/lib/libkern/arch/powerpc/ffs.S
@@ -0,0 +1,15 @@
+/* $OpenBSD: ffs.S,v 1.1 2020/06/10 20:19:29 naddy Exp $ */
+/*
+ * Written by Christian Weisgerber <naddy@openbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+ENTRY(ffs)
+ neg %r4, %r3
+ and %r3, %r3, %r4
+ cntlzw %r3, %r3
+ subfic %r3, %r3, 32
+ blr
+END(ffs)
diff --git a/sys/lib/libkern/arch/powerpc64/ffs.S b/sys/lib/libkern/arch/powerpc64/ffs.S
new file mode 100644
index 00000000000..13fe17fb4f8
--- /dev/null
+++ b/sys/lib/libkern/arch/powerpc64/ffs.S
@@ -0,0 +1,15 @@
+/* $OpenBSD: ffs.S,v 1.1 2020/06/10 20:19:29 naddy Exp $ */
+/*
+ * Written by Christian Weisgerber <naddy@openbsd.org>.
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+ENTRY(ffs)
+ neg %r4, %r3
+ and %r3, %r3, %r4
+ cntlzw %r3, %r3
+ subfic %r3, %r3, 32
+ blr
+END(ffs)