21#if defined(__x86_64__) || defined(_M_X64)
23 #include <immintrin.h>
25 #include <x86intrin.h>
31 #pragma intrinsic(__popcnt)
32 #elif defined(_M_X64) || defined(_M_AMD64)
33 #pragma intrinsic(__popcnt)
34 #pragma intrinsic(__popcnt64)
44posix_memalign(
void **memptr,
size_t alignment,
size_t size)
46 void *p = _aligned_malloc(size, alignment);
95 if (posix_memalign(&p, align, size) != 0) {
112 _mm_prefetch((
const char *) ptr, _MM_HINT_T0);
114 __builtin_prefetch(ptr, 0, 1);
126static inline uint64_t
130 #if defined(_M_IX86) || defined(_M_ARM)
131 return (uint64_t) __popcnt((uint32_t) x) +
132 (uint64_t) __popcnt((uint32_t) (x >> 32));
134 return (uint64_t) __popcnt64(x);
137 return (uint64_t) __builtin_popcountll(x);
162#if defined(__x86_64__) || defined(_M_X64)
175cbits_popcount_block_avx2(
const uint64_t *ptr);
189cbits_popcount_block_avx512(
const uint64_t *ptr);
198static inline uint64_t
static uint64_t cbits_popcount64(uint64_t x)
Count bits set in a 64-bit word.
Definition compat.h:127
uint64_t cbits_popcount_block_fallback(const uint64_t *ptr)
Fallback popcount block implementation.
Definition compat_dispatch.c:16
void init_cpu_dispatch(void)
Constructor to initialize popcount dispatch pointer.
Definition compat_dispatch.c:96
static void * cbits_malloc_aligned(size_t size, size_t align)
Allocate aligned memory.
Definition compat.h:92
static void cbits_prefetch(const void *ptr)
Prefetch a cache line at ptr into L1.
Definition compat.h:109
uint64_t(* cbits_popcount_block_ptr)(const uint64_t *ptr)
Dispatch pointer for block popcount.
Definition compat_dispatch.c:25
static uint64_t cbits_popcount_block(const uint64_t *ptr)
Inline wrapper that calls the current dispatch pointer.
Definition compat.h:199
static void cbits_free_aligned(void *ptr)
Free aligned memory.
Definition compat.h:76