|
@@ -0,0 +1,55 @@
|
|
|
+#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;
|
|
|
+}
|