LoongArch: implement count_{leading,trailing}_zeros

Message ID 20221012142300.16833-1-xry111@xry111.site
State Accepted, archived
Headers
Series LoongArch: implement count_{leading,trailing}_zeros |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Xi Ruoyao Oct. 12, 2022, 2:23 p.m. UTC
  LoongArch always support clz and ctz instructions, so we can always use
__builtin_{clz,ctz} for count_{leading,trailing}_zeros.  This improves
the code of libgcc, and also benefits Glibc once we merge longlong.h
there.

Bootstrapped and regtested on loongarch64-linux-gnu.

include/ChangeLog:

	* longlong.h [__loongarch__] (count_leading_zeros): Define.
	[__loongarch__] (count_trailing_zeros): Likewise.
	[__loongarch__] (COUNT_LEADING_ZEROS_0): Likewise.
---
 include/longlong.h | 12 ++++++++++++
 1 file changed, 12 insertions(+)
  

Comments

chenglulu Oct. 13, 2022, 8:43 a.m. UTC | #1
Looks good to me!

Thanks!

在 2022/10/12 下午10:23, Xi Ruoyao 写道:
> LoongArch always support clz and ctz instructions, so we can always use
> __builtin_{clz,ctz} for count_{leading,trailing}_zeros.  This improves
> the code of libgcc, and also benefits Glibc once we merge longlong.h
> there.
>
> Bootstrapped and regtested on loongarch64-linux-gnu.
>
> include/ChangeLog:
>
> 	* longlong.h [__loongarch__] (count_leading_zeros): Define.
> 	[__loongarch__] (count_trailing_zeros): Likewise.
> 	[__loongarch__] (COUNT_LEADING_ZEROS_0): Likewise.
> ---
>   include/longlong.h | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
>
> diff --git a/include/longlong.h b/include/longlong.h
> index 64a7b10f9b2..c3a6f1e7eaa 100644
> --- a/include/longlong.h
> +++ b/include/longlong.h
> @@ -593,6 +593,18 @@ extern UDItype __umulsidi3 (USItype, USItype);
>   #define UMUL_TIME 14
>   #endif
>   
> +#ifdef __loongarch__
> +# 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
> +# elif 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
> +#endif
> +
>   #if defined (__M32R__) && W_TYPE_SIZE == 32
>   #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>     /* The cmp clears the condition bit.  */ \
  
Xi Ruoyao Oct. 13, 2022, 10:06 a.m. UTC | #2
On Thu, 2022-10-13 at 16:43 +0800, Lulu Cheng wrote:
> Looks good to me!
> 
> Thanks!

Pushed r13-3269.

> 
> 在 2022/10/12 下午10:23, Xi Ruoyao 写道:
> > LoongArch always support clz and ctz instructions, so we can always
> > use
> > __builtin_{clz,ctz} for count_{leading,trailing}_zeros.  This
> > improves
> > the code of libgcc, and also benefits Glibc once we merge longlong.h
> > there.
> > 
> > Bootstrapped and regtested on loongarch64-linux-gnu.
> > 
> > include/ChangeLog:
> > 
> >         * longlong.h [__loongarch__] (count_leading_zeros): Define.
> >         [__loongarch__] (count_trailing_zeros): Likewise.
> >         [__loongarch__] (COUNT_LEADING_ZEROS_0): Likewise.
> > ---
> >   include/longlong.h | 12 ++++++++++++
> >   1 file changed, 12 insertions(+)
> > 
> > diff --git a/include/longlong.h b/include/longlong.h
> > index 64a7b10f9b2..c3a6f1e7eaa 100644
> > --- a/include/longlong.h
> > +++ b/include/longlong.h
> > @@ -593,6 +593,18 @@ extern UDItype __umulsidi3 (USItype, USItype);
> >   #define UMUL_TIME 14
> >   #endif
> >   
> > +#ifdef __loongarch__
> > +# 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
> > +# elif 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
> > +#endif
> > +
> >   #if defined (__M32R__) && W_TYPE_SIZE == 32
> >   #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
> >     /* The cmp clears the condition bit.  */ \
>
  

Patch

diff --git a/include/longlong.h b/include/longlong.h
index 64a7b10f9b2..c3a6f1e7eaa 100644
--- a/include/longlong.h
+++ b/include/longlong.h
@@ -593,6 +593,18 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #define UMUL_TIME 14
 #endif
 
+#ifdef __loongarch__
+# 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
+# elif 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
+#endif
+
 #if defined (__M32R__) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   /* The cmp clears the condition bit.  */ \