[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.
This commit is contained in:
Sosutha Sethuramapandian 2025-06-19 20:53:56 -06:00 committed by Jeff Law
parent 89ec7ba1b1
commit e08ef05e4d
1 changed files with 14 additions and 0 deletions

View File

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