mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-12 22:36:47 +00:00
55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
#include <common/stddef.h>
|
||
|
||
/**
|
||
* @brief 统计二进制数的前导0
|
||
*
|
||
* @param x 待统计的数
|
||
* @return int 结果
|
||
*/
|
||
static __always_inline int __clz(uint32_t x)
|
||
{
|
||
asm volatile("bsr %%eax, %%eax\n\t"
|
||
"xor $0x1f, %%eax\n\t"
|
||
: "=a"(x)
|
||
: "a"(x)
|
||
: "memory");
|
||
return x;
|
||
}
|
||
|
||
/**
|
||
* @brief 统计二进制数的前导0 (宽度为unsigned long)
|
||
*
|
||
* @param x 待统计的数
|
||
* @return int 结果
|
||
*/
|
||
static __always_inline int __clzl(unsigned long x)
|
||
{
|
||
int res = 0;
|
||
asm volatile("cltq\n\t"
|
||
"bsr %%rax, %%rax\n\t"
|
||
"xor $0x3f, %%rax\n\t"
|
||
"mov %%eax,%0\n\t"
|
||
: "=m"(res)
|
||
: "a"(x)
|
||
: "memory");
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* @brief 统计二进制数的前导0(宽度为unsigned long long)
|
||
*
|
||
* @param x 待统计的数
|
||
* @return int 结果
|
||
*/
|
||
static __always_inline int __clzll(unsigned long long x)
|
||
{
|
||
int res = 0;
|
||
asm volatile("cltq\n\t"
|
||
"bsr %%rax, %%rax\n\t"
|
||
"xor $0x3f, %%rax\n\t"
|
||
"mov %%eax,%0\n\t"
|
||
: "=m"(res)
|
||
: "a"(x)
|
||
: "memory");
|
||
return res;
|
||
} |