> From: Christian Weisgerber <[email protected]>
> Date: Tue, 9 Jun 2020 18:39:45 -0000 (UTC)
> 
> Here are optimized ffs(3) implementations for
> * arm64  (superseding the earlier ffs.S)
> * powerpc
> * powerpc64
> 
> arm64 tested by myself, powerpc tested by cwen@.
> 
> OK?
> 
> (Some other archs fell through.  sparc64 specifies the popc instruction
> that can be used for this, but UltraSPARC doesn't implement it.
> alpha's ctlz was only added late with the CIX extension.)

Unfortunately that doesn't quite work.  At least in my build it
doesn't pick up .c files in the linker/arch directories.

> Index: lib/libkern/arch/arm64/ffs.c
> ===================================================================
> RCS file: lib/libkern/arch/arm64/ffs.c
> diff -N lib/libkern/arch/arm64/ffs.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ lib/libkern/arch/arm64/ffs.c      9 Jun 2020 18:09:11 -0000
> @@ -0,0 +1,12 @@
> +/*   $OpenBSD$ */
> +/*
> + * Written by Christian Weisgerber <[email protected]>.
> + * Public domain.
> + */
> +
> +int ffs(int x)
> +{
> +     x = x & -x;
> +     __asm volatile("clz %w0, %w0" : "+r" (x));
> +     return (32 - x);
> +}
> Index: lib/libkern/arch/powerpc/ffs.c
> ===================================================================
> RCS file: lib/libkern/arch/powerpc/ffs.c
> diff -N lib/libkern/arch/powerpc/ffs.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ lib/libkern/arch/powerpc/ffs.c    9 Jun 2020 18:10:20 -0000
> @@ -0,0 +1,12 @@
> +/*   $OpenBSD$ */
> +/*
> + * Written by Christian Weisgerber <[email protected]>.
> + * Public domain.
> + */
> +
> +int ffs(int x)
> +{
> +     x = x & -x;
> +     __asm volatile("cntlzw %0, %0" : "+r" (x));
> +     return (32 - x);
> +}
> Index: lib/libkern/arch/powerpc64/ffs.c
> ===================================================================
> RCS file: lib/libkern/arch/powerpc64/ffs.c
> diff -N lib/libkern/arch/powerpc64/ffs.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ lib/libkern/arch/powerpc64/ffs.c  9 Jun 2020 18:10:49 -0000
> @@ -0,0 +1,12 @@
> +/*   $OpenBSD$ */
> +/*
> + * Written by Christian Weisgerber <[email protected]>.
> + * Public domain.
> + */
> +
> +int ffs(int x)
> +{
> +     x = x & -x;
> +     __asm volatile("cntlzw %0, %0" : "+r" (x));
> +     return (32 - x);
> +}
> -- 
> Christian "naddy" Weisgerber                          [email protected]
> 
> 

Reply via email to