Mailing List Archive

[PATCH 1/2] mpi/longlong: make use of compiler provided __builtin_ctz/__builtin_clz
* configure.ac (gcry_cv_have_builtin_ctzl, gcry_cv_have_builtin_clz)
(gcry_cv_have_builtin_clzl): New checks.
* mpi/longlong.h (count_leading_zeros, count_trailing_zeros): Use
__buildin_clz[l]/__builtin_ctz[l] if available and bit counting
macros not yet provided by inline assembly.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
---
configure.ac | 45 +++++++++++++++++++++++++++++++++++++++++++++
mpi/longlong.h | 20 ++++++++++++++++++++
2 files changed, 65 insertions(+)

diff --git a/configure.ac b/configure.ac
index fda74056..e0d52d8c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -903,6 +903,51 @@ if test "$gcry_cv_have_builtin_ctz" = "yes" ; then
fi


+#
+# Check for __builtin_ctzl intrinsic.
+#
+AC_CACHE_CHECK(for __builtin_ctzl,
+ [gcry_cv_have_builtin_ctzl],
+ [gcry_cv_have_builtin_ctzl=no
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],
+ [.unsigned long x = 0; long y = __builtin_ctzl(x); return y;])],
+ [gcry_cv_have_builtin_ctzl=yes])])
+if test "$gcry_cv_have_builtin_ctzl" = "yes" ; then
+ AC_DEFINE(HAVE_BUILTIN_CTZL, 1,
+ [Defined if compiler has '__builtin_ctzl' intrinsic])
+fi
+
+
+#
+# Check for __builtin_clz intrinsic.
+#
+AC_CACHE_CHECK(for __builtin_clz,
+ [gcry_cv_have_builtin_clz],
+ [gcry_cv_have_builtin_clz=no
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],
+ [.unsigned int x = 0; int y = __builtin_clz(x); return y;])],
+ [gcry_cv_have_builtin_clz=yes])])
+if test "$gcry_cv_have_builtin_clz" = "yes" ; then
+ AC_DEFINE(HAVE_BUILTIN_CLZ, 1,
+ [Defined if compiler has '__builtin_clz' intrinsic])
+fi
+
+
+#
+# Check for __builtin_clzl intrinsic.
+#
+AC_CACHE_CHECK(for __builtin_clzl,
+ [gcry_cv_have_builtin_clzl],
+ [gcry_cv_have_builtin_clzl=no
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],
+ [.unsigned long x = 0; long y = __builtin_clzl(x); return y;])],
+ [gcry_cv_have_builtin_clzl=yes])])
+if test "$gcry_cv_have_builtin_clzl" = "yes" ; then
+ AC_DEFINE(HAVE_BUILTIN_CLZL, 1,
+ [Defined if compiler has '__builtin_clzl' intrinsic])
+fi
+
+
#
# Check for __sync_synchronize intrinsic.
#
diff --git a/mpi/longlong.h b/mpi/longlong.h
index 6573c984..6993d6eb 100644
--- a/mpi/longlong.h
+++ b/mpi/longlong.h
@@ -1681,6 +1681,26 @@ extern USItype __udiv_qrnnd ();
# define udiv_qrnnd __udiv_qrnnd_c
#endif

+#if !defined (count_leading_zeros)
+# if defined (HAVE_BUILTIN_CLZL) && SIZEOF_UNSIGNED_LONG * 8 == W_TYPE_SIZE
+# define count_leading_zeros(count, x) (count = __builtin_clzl(x))
+# undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */
+# elif defined (HAVE_BUILTIN_CLZ) && SIZEOF_UNSIGNED_INT * 8 == W_TYPE_SIZE
+# define count_leading_zeros(count, x) (count = __builtin_clz(x))
+# undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */
+# endif
+#endif
+
+#if !defined (count_trailing_zeros)
+# if defined (HAVE_BUILTIN_CTZL) && SIZEOF_UNSIGNED_LONG * 8 == W_TYPE_SIZE
+# define count_trailing_zeros(count, x) (count = __builtin_ctzl(x))
+# undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */
+# elif defined (HAVE_BUILTIN_CTZ) && SIZEOF_UNSIGNED_INT * 8 == W_TYPE_SIZE
+# define count_trailing_zeros(count, x) (count = __builtin_ctz(x))
+# undef COUNT_LEADING_ZEROS_0 /* Input X=0 is undefined for the builtin. */
+# endif
+#endif
+
#if !defined (count_leading_zeros)
extern
# ifdef __STDC__
--
2.27.0


_______________________________________________
Gcrypt-devel mailing list
Gcrypt-devel@gnupg.org
http://lists.gnupg.org/mailman/listinfo/gcrypt-devel