mirror of git://gcc.gnu.org/git/gcc.git
[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:
parent
89ec7ba1b1
commit
e08ef05e4d
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Reference in New Issue