diff --git a/include/util.h b/include/util.h index 9b3e472ff..2f469c8b8 100644 --- a/include/util.h +++ b/include/util.h @@ -95,45 +95,10 @@ int __builtin_clzl (unsigned long x); int __builtin_ctzl (unsigned long x); #ifdef CONFIG_ARCH_RISCV -uint32_t __clzsi2(uint32_t x) -{ - uint32_t count = 0; - while ( !(x & 0x80000000U) && count < 34) { - x <<= 1; - count++; - } - return count; -} - -uint32_t __ctzsi2(uint32_t x) -{ - uint32_t count = 0; - while ( !(x & 0x000000001) && count <= 32) { - x >>= 1; - count++; - } - return count; -} - -uint32_t __clzdi2(uint64_t x) -{ - uint32_t count = 0; - while ( !(x & 0x8000000000000000U) && count < 65) { - x <<= 1; - count++; - } - return count; -} - -uint32_t __ctzdi2(uint64_t x) -{ - uint32_t count = 0; - while ( !(x & 0x00000000000000001) && count <= 64) { - x >>= 1; - count++; - } - return count; -} +uint32_t __clzsi2(uint32_t x); +uint32_t __ctzsi2(uint32_t x); +uint32_t __clzdi2(uint64_t x); +uint32_t __ctzdi2(uint64_t x); #endif /** MODIFIES: */ /** DONT_TRANSLATE */ diff --git a/src/util.c b/src/util.c index 552e736e8..d9af3e3fe 100644 --- a/src/util.c +++ b/src/util.c @@ -141,3 +141,45 @@ str_to_long(const char* str) return val; } + +#ifdef CONFIG_ARCH_RISCV +uint32_t __clzsi2(uint32_t x) +{ + uint32_t count = 0; + while ( !(x & 0x80000000U) && count < 34) { + x <<= 1; + count++; + } + return count; +} + +uint32_t __ctzsi2(uint32_t x) +{ + uint32_t count = 0; + while ( !(x & 0x000000001) && count <= 32) { + x >>= 1; + count++; + } + return count; +} + +uint32_t __clzdi2(uint64_t x) +{ + uint32_t count = 0; + while ( !(x & 0x8000000000000000U) && count < 65) { + x <<= 1; + count++; + } + return count; +} + +uint32_t __ctzdi2(uint64_t x) +{ + uint32_t count = 0; + while ( !(x & 0x00000000000000001) && count <= 64) { + x >>= 1; + count++; + } + return count; +} +#endif /* CONFIG_ARCH_RISCV */