Changeset: 45912f01a150 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45912f01a150
Modified Files:
        gdk/gdk_select.c
Branch: Oct2020
Log Message:

Inline ilog2 and use intrinsics if available.


diffs (45 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -801,9 +801,32 @@ scanselect(BAT *b, struct canditer *rest
 /* calculate the integer 2 logarithm (i.e. position of highest set
  * bit) of the argument (with a slight twist: 0 gives 0, 1 gives 1,
  * 0x8 to 0xF give 4, etc.) */
-static unsigned
+static inline unsigned
 ilog2(BUN x)
 {
+#if defined(__GNUC__)
+       if (x == 0)
+               return 0;
+#if SIZEOF_BUN == 8
+       return (unsigned) (64 - __builtin_clzll((unsigned long long) x));
+#else
+       return (unsigned) (32 - __builtin_clz((unsigned) x));
+#endif
+#elif defined(_MSC_VER)
+       if (x == 0)
+               return 0;
+       unsigned long n;
+       if (
+#if SIZEOF_BUN == 8
+               _BitScanReverse64(&n, (unsigned __int64) x)
+#else
+               _BitScanReverse(&n, (unsigned long) x)
+#endif
+               )
+               return (unsigned) n + 1;
+       else
+               return 0;
+#else
        unsigned n = 0;
        BUN y;
 
@@ -835,6 +858,7 @@ ilog2(BUN x)
                n += 1;
        }
        return n + (x != 0);
+#endif
 }
 
 /* Normalize the variables li, hi, lval, hval, possibly changing anti
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to