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
-1
View File
@@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h> #include <sys/param.h>
#include <fdt_platform.h> #include <fdt_platform.h>
#define _KERNEL
#include <machine/cpufunc.h> #include <machine/cpufunc.h>
#include "bootstrap.h" #include "bootstrap.h"
#include "host_syscall.h" #include "host_syscall.h"
-2
View File
@@ -88,8 +88,6 @@ libkern/divdi3.c optional powerpc | powerpcspe
libkern/ffs.c standard libkern/ffs.c standard
libkern/ffsl.c standard libkern/ffsl.c standard
libkern/ffsll.c standard libkern/ffsll.c standard
libkern/fls.c standard
libkern/flsl.c standard
libkern/flsll.c standard libkern/flsll.c standard
libkern/lshrdi3.c optional powerpc | powerpcspe libkern/lshrdi3.c optional powerpc | powerpcspe
libkern/memcmp.c standard libkern/memcmp.c standard
+14
View File
@@ -212,6 +212,20 @@ get_pcpu(void)
return (ret); 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. */ /* "NOP" operations to signify priorities to the kernel. */
static __inline void static __inline void
nop_prio_vlow(void) nop_prio_vlow(void)