diff --git a/common/misc/misc.c b/common/misc/misc.c index dcd2ff7e..3292a683 100644 --- a/common/misc/misc.c +++ b/common/misc/misc.c @@ -188,6 +188,46 @@ void fifocopy_to_mem(void *fifo_addr, uint8_t *data, uint32_t length) } } +/****************************************************************************/ /** + * @brief get u64 first number 1 from right to left + * + * @param val: target value + * @param bit: first 1 in bit + * + * @return SUCCESS or ERROR + * +*******************************************************************************/ +int arch_ffsll(uint64_t *val, uint32_t *bit) +{ + if (!*val) { + return ERROR; + } + + *bit = __builtin_ffsll(*val) - 1; + *val &= ~((1ULL) << (*bit)); + return 0; +} + +int arch_ctzll(uint64_t *val, uint32_t *bit) +{ + if (!*val) + return -1; + + *bit = __builtin_ctzll(*val); + *val &= ~((1ULL) << (*bit)); + return 0; +} + +int arch_clzll(uint64_t *val, uint32_t *bit) +{ + if (!*val) + return -1; + + *bit = __builtin_clzll(*val); + *val &= ~((1ULL) << (*bit)); + return 0; +} + #ifdef DEBUG /******************************************************************************* * @brief Reports the name of the source file and the source line number diff --git a/common/misc/misc.h b/common/misc/misc.h index b00c039b..50ea5cd0 100644 --- a/common/misc/misc.h +++ b/common/misc/misc.h @@ -39,10 +39,6 @@ #define BIT(n) (1UL << (n)) #endif -#ifndef CHECK_PARAM -#define CHECK_PARAM(expr) ((void)0) -#endif - /** * @brief Null Type definition */ @@ -129,4 +125,7 @@ void *arch_memcpy_fast(void *pdst, const void *psrc, uint32_t n); uint32_t *arch_memset4(uint32_t *dst, const uint32_t val, uint32_t n); void memcopy_to_fifo(void *fifo_addr, uint8_t *data, uint32_t length); void fifocopy_to_mem(void *fifo_addr, uint8_t *data, uint32_t length); +int arch_ctzll(uint64_t *val, uint32_t *bit); +int arch_clzll(uint64_t *val, uint32_t *bit); +int arch_ffsll(uint64_t *val, uint32_t *bit); #endif