This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.

commit c54a1285b7b8b166e162ad879e2c8beaae4f8ba2
Author: Dana Jacobsen <d...@acm.org>
Date:   Thu Jan 9 14:59:00 2014 -0800

    More clz,ctz,log2floor changes
---
 util.h | 53 ++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 19 deletions(-)

diff --git a/util.h b/util.h
index 1c65466..59c1da3 100644
--- a/util.h
+++ b/util.h
@@ -119,28 +119,40 @@ static int is_perfect_square(UV n)
 }
 #endif
 
-/* clz gives floor(log2(n)).  ctz gives number of times divisible by 2 */
-#if defined(FUNC_clz) || defined(FUNC_ctz)
+#if defined(FUNC_clz) || defined(FUNC_ctz) || defined(FUNC_log2floor)
+/* log2floor(n) gives the location of the first set bit (starting from left)
+ * ctz(n)       gives the number of times n is divisible by 2
+ * clz(n)       gives the number of zeros on the left                       */
 #ifdef __GNUC__
  #if BITS_PER_WORD == 64
-  #define ctz(n)  ((n)?__builtin_ctzll(n):64)
-  #define clz(n)  ((n)?__builtin_clzll(n):64)
+  #define ctz(n)        ((n) ?    __builtin_ctzll(n) : 64)
+  #define clz(n)        ((n) ?    __builtin_clzll(n) : 64)
+  #define log2floor(n)  ((n) ? 63-__builtin_clzll(n) : 0)
  #else
-  #define ctz(n)  ((n)?__builtin_ctzl(n):32)
-  #define clz(n)  ((n)?__builtin_clzl(n):32)
+  #define ctz(n)        ((n) ?    __builtin_ctzl(n) : 32)
+  #define clz(n)        ((n) ?    __builtin_clzl(n) : 32)
+  #define log2floor(n)  ((n) ? 31-__builtin_clzl(n) : 0)
  #endif
 #elif defined (_MSC_VER)
  #include <intrin.h>
  #ifdef FUNC_ctz
   static int ctz(UV n) {
     UV tz = 0;
-    if (_BitScanForward(&tz, n)) return tz; else return BITS_PER_WORD;
+   #ifdef BITS_PER_WORD == 64
+    if (_BitScanForward64(&tz, n)) return tz; else return 64;
+   #else
+    if (_BitScanForward(&tz, n))   return tz; else return 32;
+   #endif
   }
  #endif
- #ifdef FUNC_clz
-  static int clz(UV n) {
+ #if defined(FUNC_clz) || defined(FUNC_log2floor)
+  static int log2floor(UV n) {
     UV lz = 0;
-    if (_BitScanReverse(&lz, n)) return BITS_PER_WORD-1-lz; else return 
BITS_PER_WORD;
+   #ifdef BITS_PER_WORD == 64
+    if (_BitScanReverse64(&lz, n)) return lz; else return 0;
+   #else
+    if (_BitScanReverse(&lz, n))   return lz; else return 0;
+   #endif
   }
  #endif
 #elif BITS_PER_WORD == 64
@@ -153,12 +165,12 @@ static int is_perfect_square(UV n)
      return n ? _debruijn64[((n & -n)*UVCONST(0x07EDD5E59A4E28C2)) >> 58] : 64;
    }
  #endif
- #ifdef FUNC_clz
-   static unsigned int clz(UV n) {
-     if (n == 0) return 64;
+ #if defined(FUNC_clz) || defined(FUNC_log2floor)
+   static unsigned int log2floor(UV n) {
+     if (n == 0) return 0;
      n |= n >> 1;   n |= n >> 2;   n |= n >> 4;
      n |= n >> 8;   n |= n >> 16;  n |= n >> 32;
-     return 63 - _debruijn64[((n-(n>>1))*UVCONST(0x07EDD5E59A4E28C2)) >> 58];
+     return _debruijn64[((n-(n>>1))*UVCONST(0x07EDD5E59A4E28C2)) >> 58];
    }
  #endif
 #else
@@ -170,17 +182,20 @@ static int is_perfect_square(UV n)
      return n ? _trail_debruijn32[((n & -n) * UVCONST(0x077CB531)) >> 27] : 32;
    }
  #endif
- #ifdef FUNC_clz
+ #if defined(FUNC_clz) || defined(FUNC_log2floor)
    static const unsigned char _lead_debruijn32[32] = {
       0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
       8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
-   static unsigned int clz(UV n) {
-     if (n == 0) return 32;
+   static unsigned int log2floor(UV n) {
+     if (n == 0) return 0;
      n |= n >> 1;   n |= n >> 2;   n |= n >> 4;   n |= n >> 8;   n |= n >> 16;
-     return 31 - _lead_debruijn32[(n * UVCONST(0x07C4ACDD)) >> 27];
+     return _lead_debruijn32[(n * UVCONST(0x07C4ACDD)) >> 27];
    }
  #endif
 #endif
-#endif  /* End of clz and ctz */
+#if defined(FUNC_clz) && !defined(clz)
+ #define clz(n)  ( (n) ? BITS_PER_WORD-1-log2floor(n) : BITS_PER_WORD )
+#endif
+#endif  /* End of log2floor, clz, and ctz */
 
 #endif

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to