add zbb check macro
diff --git a/CMakeLists.txt b/CMakeLists.txt index 490f5b8..ac43da3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -155,10 +155,20 @@ return __builtin_expect(0, 1); }" HAVE_BUILTIN_EXPECT) +# Check if the built-in __builtin_ctz (count trailing zeros) is available. +# Require either a non-RISC-V target, or a RISC-V core that implements +# the Zbb bit-manipulation extension where ctz is guaranteed. check_cxx_source_compiles(" -int main() { - return __builtin_ctzll(0); -}" HAVE_BUILTIN_CTZ) +#ifdef __riscv + #ifdef __riscv_zbb + int main() { return __builtin_ctzll(0); } + #else + #error \"ZBB not enabled in current config\" + #endif +#else + int main() { return __builtin_ctzll(0); } +#endif +" HAVE_BUILTIN_CTZ) check_cxx_source_compiles(" int main() {
diff --git a/snappy-stubs-internal.h b/snappy-stubs-internal.h index 526c38b..59ba003 100644 --- a/snappy-stubs-internal.h +++ b/snappy-stubs-internal.h
@@ -304,8 +304,8 @@ void operator=(const Bits&); }; +// In RISC-V, CLZ is supported by instructions from the ZBB bit-manipulation extension. #if HAVE_BUILTIN_CTZ - inline int Bits::Log2FloorNonZero(uint32_t n) { assert(n != 0); // (31 ^ x) is equivalent to (31 - x) for x in [0, 31]. An easy proof @@ -393,6 +393,7 @@ #endif // End portable versions. +// the Zbb bit-manipulation extension where ctz is guaranteed. #if HAVE_BUILTIN_CTZ inline int Bits::FindLSBSetNonZero64(uint64_t n) {