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) {