2022-06-03 19:15:11 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2019-08-21 19:15:29 +00:00
|
|
|
* Copyright(c) Intel Corporation. All rights reserved.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "spdk/stdinc.h"
|
|
|
|
#include "spdk/util.h"
|
2021-02-08 14:17:24 +00:00
|
|
|
#include "spdk/assert.h"
|
2019-08-21 19:15:29 +00:00
|
|
|
|
|
|
|
/* The following will automatically generate several version of
|
|
|
|
* this function, targeted at different architectures. This
|
|
|
|
* is only supported by GCC 6 or newer. */
|
|
|
|
#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \
|
2021-02-08 14:17:24 +00:00
|
|
|
&& (defined(__i386__) || defined(__x86_64__)) \
|
|
|
|
&& defined(__ELF__)
|
2019-08-21 19:15:29 +00:00
|
|
|
__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default")))
|
|
|
|
#endif
|
|
|
|
uint32_t
|
|
|
|
spdk_u32log2(uint32_t x)
|
|
|
|
{
|
|
|
|
if (x == 0) {
|
|
|
|
/* log(0) is undefined */
|
|
|
|
return 0;
|
|
|
|
}
|
2021-02-08 14:17:24 +00:00
|
|
|
SPDK_STATIC_ASSERT(sizeof(x) == sizeof(unsigned int), "Incorrect size");
|
2019-08-21 19:15:29 +00:00
|
|
|
return 31u - __builtin_clz(x);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The following will automatically generate several version of
|
|
|
|
* this function, targeted at different architectures. This
|
|
|
|
* is only supported by GCC 6 or newer. */
|
|
|
|
#if defined(__GNUC__) && __GNUC__ >= 6 && !defined(__clang__) \
|
2021-02-08 14:17:24 +00:00
|
|
|
&& (defined(__i386__) || defined(__x86_64__)) \
|
|
|
|
&& defined(__ELF__)
|
2019-08-21 19:15:29 +00:00
|
|
|
__attribute__((target_clones("bmi", "arch=core2", "arch=atom", "default")))
|
|
|
|
#endif
|
|
|
|
uint64_t
|
|
|
|
spdk_u64log2(uint64_t x)
|
|
|
|
{
|
|
|
|
if (x == 0) {
|
|
|
|
/* log(0) is undefined */
|
|
|
|
return 0;
|
|
|
|
}
|
2021-02-08 14:17:24 +00:00
|
|
|
SPDK_STATIC_ASSERT(sizeof(x) == sizeof(unsigned long long), "Incorrect size");
|
|
|
|
return 63u - __builtin_clzll(x);
|
2019-08-21 19:15:29 +00:00
|
|
|
}
|