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.

gcc/include/ChangeLog

         * longlong.h  [__riscv] (count_leading_zeros): Define.
         [__riscv] (count_trailing_zeros): Likewise.
         [__riscv] (COUNT_LEADING_ZEROS_0): Likewise.


diff --git a/include/longlong.h b/include/longlong.h
index b5dec95b7ed..de737586180 100644
--- a/include/longlong.h
+++ b/include/longlong.h
@@ -1065,6 +1065,18 @@ extern UDItype __umulsidi3 (USItype, USItype);
#endif
#if defined(__riscv)

LGTM, however, the patch seems corrupt down here to apply

for missing a space at the beginning, could you fix the patch format?

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

Same in end three line.


Thanks,
Jiawei

--
2.43.0

The above patch updates libgcc library, so the change can be
visualized only through full disassembly for a testcase.

The existing gcc regression test suite for riscv cannot be used
to check this code generation, change as-is.
Hence no testcase is added as part of the patch.
Please suggest a way to add a visual testcase and
confirm the changes in the code generation.

Reply via email to