summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-10-18 20:08:07 +0200
committerDavid Robillard <d@drobilla.net>2019-10-18 20:15:53 +0200
commitfd6ff412c6c25bcbc71985ba08f3654cbf621f5a (patch)
tree485852325a30a0ad8f25fa1f1deb22c3f08c0827
parent92e2833403321fe630b22ccdeb00a31fec7785aa (diff)
downloadzix-fd6ff412c6c25bcbc71985ba08f3654cbf621f5a.tar.gz
zix-fd6ff412c6c25bcbc71985ba08f3654cbf621f5a.tar.bz2
zix-fd6ff412c6c25bcbc71985ba08f3654cbf621f5a.zip
Implement Bitset for Windows
-rw-r--r--zix/bitset.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/zix/bitset.c b/zix/bitset.c
index 2f551b2..fc1873d 100644
--- a/zix/bitset.c
+++ b/zix/bitset.c
@@ -16,11 +16,25 @@
#include "zix/bitset.h"
+#ifdef _MSC_VER
+#include <intrin.h>
+#endif
+
#include <string.h>
/** Number of bits per ZixBitset element (ala CHAR_BIT). */
#define ZIX_BITSET_ELEM_BIT (CHAR_BIT * sizeof(ZixBitset))
+static inline size_t
+zix_bitset_popcount(const ZixBitset value)
+{
+#ifdef _MSC_VER
+ return (size_t)__popcnt(value);
+#else
+ return (size_t)__builtin_popcountl(value);
+#endif
+}
+
ZIX_API void
zix_bitset_clear(ZixBitset* b, ZixBitsetTally* t, size_t n_bits)
{
@@ -79,7 +93,7 @@ zix_bitset_count_up_to(const ZixBitset* b, const ZixBitsetTally* t, size_t i)
if (extra) {
const ZixBitset mask = ~(~(ZixBitset)0 << extra);
- count += (size_t)__builtin_popcountl(b[full_elems] & mask);
+ count += zix_bitset_popcount(b[full_elems] & mask);
}
return count;
@@ -103,7 +117,7 @@ zix_bitset_count_up_to_if(const ZixBitset* b, const ZixBitsetTally* t, size_t i)
if (extra) {
const ZixBitset mask = ~(~(ZixBitset)0 << extra);
- count += (size_t)__builtin_popcountl(b[full_elems] & mask);
+ count += zix_bitset_popcount(b[full_elems] & mask);
}
return count;