illums compat: use flsl/flsll for highbit/highbit64

Do that only when when fast inline versions are available.
At the moment that can be the case only in the kernel and not for all
platforms.

The original code uses the binary search and that's kept as a fallback.
This is a micro optimization.

Differential Revision:	https://reviews.freebsd.org/D2839
Reviewed by:	delphij, mahrens, mav
MFC after:	17 days
This commit is contained in:
Andriy Gapon 2015-06-19 06:41:53 +00:00
parent bda8af6860
commit ab50c99d40

View File

@ -32,6 +32,9 @@
#include <sys/param.h>
#include <sys/isa_defs.h>
#if defined(__FreeBSD__) && defined(_KERNEL)
#include <sys/libkern.h>
#endif
#ifdef __cplusplus
extern "C" {
@ -382,6 +385,9 @@ extern unsigned char bcd_to_byte[256];
static __inline int
highbit(ulong_t i)
{
#if defined(__FreeBSD__) && defined(_KERNEL) && defined(HAVE_INLINE_FLSL)
return (flsl(i));
#else
register int h = 1;
if (i == 0)
@ -407,6 +413,7 @@ highbit(ulong_t i)
h += 1;
}
return (h);
#endif
}
/*
@ -416,6 +423,9 @@ highbit(ulong_t i)
static __inline int
highbit64(uint64_t i)
{
#if defined(__FreeBSD__) && defined(_KERNEL) && defined(HAVE_INLINE_FLSLL)
return (flsll(i));
#else
int h = 1;
if (i == 0)
@ -439,6 +449,7 @@ highbit64(uint64_t i)
h += 1;
}
return (h);
#endif
}
#ifdef __cplusplus