powerpc: Use builtins for fls/flsl

Summary:
There's no need to use the fallback fls() and flsl() libkern functions
when the PowerISA includes instructions that already do the bulk of the
work.  Take advantage of this through the GCC builtins __builtin_clz()
and __builtin_clzl().

Reviewed by:	luporl
Differential Revision:	https://reviews.freebsd.org/D22340
This commit is contained in:
Justin Hibbits 2019-12-08 04:36:42 +00:00
parent a795401110
commit 9e319462a0
3 changed files with 14 additions and 3 deletions

View File

@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <fdt_platform.h>
#define _KERNEL
#include <machine/cpufunc.h>
#include "bootstrap.h"
#include "host_syscall.h"

View File

@ -88,8 +88,6 @@ libkern/divdi3.c optional powerpc | powerpcspe
libkern/ffs.c standard
libkern/ffsl.c standard
libkern/ffsll.c standard
libkern/fls.c standard
libkern/flsl.c standard
libkern/flsll.c standard
libkern/lshrdi3.c optional powerpc | powerpcspe
libkern/memcmp.c standard

View File

@ -212,6 +212,20 @@ get_pcpu(void)
return (ret);
}
#define HAVE_INLINE_FLS
static __inline __pure2 int
fls(int mask)
{
return (mask ? 32 - __builtin_clz(mask) : 0);
}
#define HAVE_INLINE_FLSL
static __inline __pure2 int
flsl(long mask)
{
return (mask ? (8 * sizeof(long) - __builtin_clzl(mask)) : 0);
}
/* "NOP" operations to signify priorities to the kernel. */
static __inline void
nop_prio_vlow(void)