https://gcc.gnu.org/g:e08ef05e4da86d34223118092bbb857b8dd5d002

commit r16-1584-ge08ef05e4da86d34223118092bbb857b8dd5d002
Author: Sosutha Sethuramapandian <ssethuram...@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.

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

Reply via email to