[gcc(refs/vendors/riscv/heads/gcc-15-with-riscv-opts)] [PATCH] RISC-V: Use builtin clz/ctz when count_leading_zeros and count_trailing_zeros is used
Jeff Law
law@gcc.gnu.org
Fri Jan 30 06:48:32 GMT 2026
https://gcc.gnu.org/g:527428773019bfcb4967567eb5d6e7aa70a2820f
commit 527428773019bfcb4967567eb5d6e7aa70a2820f
Author: Sosutha Sethuramapandian <ssethuramapa@marvell.com>
Date: Thu Jun 19 20:53:56 2025 -0600
[PATCH] RISC-V: Use builtin clz/ctz when count_leading_zeros and count_trailing_zeros is used
longlong.h for RISCV should define count_leading_zeros and
count_trailing_zeros and COUNT_LEADING_ZEROS_0 when ZBB is enabled.
The following patch patch fixes the bug reported in,
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110181
The divdi3 on riscv32 with zbb extension generates __clz_tab
instead of genearating __builtin_clzll/__builtin_clz which is
not efficient since lookup table is emitted.
Updating longlong.h to use this __builtin_clzll/__builtin_clz
generates optimized code for the instruction.
PR target/110181
include/ChangeLog
* longlong.h [__riscv] (count_leading_zeros): Define.
[__riscv] (count_trailing_zeros): Likewise.
[__riscv] (COUNT_LEADING_ZEROS_0): Likewise.
(cherry picked from commit e08ef05e4da86d34223118092bbb857b8dd5d002)
Diff:
---
include/longlong.h | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/include/longlong.h b/include/longlong.h
index 40f94243a1af..5ae250f7192d 100644
--- a/include/longlong.h
+++ b/include/longlong.h
@@ -1065,6 +1065,20 @@ extern UDItype __umulsidi3 (USItype, USItype);
#endif
#if defined(__riscv)
+
+#ifdef __riscv_zbb
+#if W_TYPE_SIZE == 32
+#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
+#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X))
+#define COUNT_LEADING_ZEROS_0 32
+#endif /* W_TYPE_SIZE == 32 */
+#if W_TYPE_SIZE == 64
+#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clzll (X))
+#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctzll (X))
+#define COUNT_LEADING_ZEROS_0 64
+#endif /* W_TYPE_SIZE == 64 */
+#endif /* __riscv_zbb */
+
#ifdef __riscv_mul
#define __umulsidi3(u,v) ((UDWtype)(UWtype)(u) * (UWtype)(v))
#define __muluw3(a, b) ((UWtype)(a) * (UWtype)(b))
More information about the Gcc-cvs
mailing list