+#ifndef _BITSET_IA32_H
+#define _BITSET_IA32_H
+
+typedef unsigned int bitset_unit_t;
+#define BITSET_UNIT_FMT "%0x"
#undef _bitset_inside_clear
#undef _bitset_inside_set
#define _bitset_inside_ntz(unit) _bitset_ia32_inside_ntz(unit)
#define _bitset_inside_ntz_value(unit) _bitset_ia32_inside_ntz_value(unit)
-static INLINE int _bitset_ia32_inside_is_set(unsigned long *unit, unsigned bit)
+static INLINE int _bitset_ia32_inside_is_set(bitset_unit_t *unit, unsigned bit)
{
int res = 0;
__asm__("mov $0,%0\n\tbtl %1,%2\n\tadc $0,%0"
return res;
}
-static INLINE unsigned _bitset_ia32_inside_nlz(unsigned long *unit)
+static INLINE unsigned _bitset_ia32_inside_nlz(bitset_unit_t *unit)
{
unsigned res = 0;
__asm__("bsrl %1,%0" :"=r" (res) :"m" (unit));
return *unit == 0 ? 32 : res;
}
-static INLINE unsigned _bitset_ia32_inside_ntz(unsigned long *unit) {
+static INLINE unsigned _bitset_ia32_inside_ntz(bitset_unit_t *unit) {
unsigned res = 0;
__asm__("bsfl %1,%0" :"=r" (res) :"m" (unit));
return *unit == 0 ? 32 : res;
}
-static INLINE unsigned _bitset_ia32_inside_ntz_value(unsigned long unit) {
+static INLINE unsigned _bitset_ia32_inside_ntz_value(bitset_unit_t unit) {
unsigned res = 0;
__asm__("bsfl %1,%0" :"=r" (res) :"rm" (unit));
return unit == 0 ? 32 : res;
#define _bitset_data_ptr(data,bitset_base_size,highest_bit) \
_bitset_sse_data_ptr(data, bitset_base_size, highest_bit)
-static INLINE unsigned long *_bitset_sse_data_ptr(void *data, size_t bitset_base_size,
- unsigned long highest_bit)
+static INLINE bitset_unit_t *_bitset_sse_data_ptr(void *data, size_t bitset_base_size,
+ bitset_pos_t highest_bit)
{
ptrdiff_t diff;
char *units = data;
diff = (units - (char *) 0) + bitset_base_size;
diff = round_up2(diff, 16);
units = (char *) 0 + diff;
- return (unsigned long *) units;
+ return (bitset_unit_t *) units;
}
#define _BITSET_BINOP_UNITS_INC 4
#define _bitset_inside_binop_or(tgt,src) _bitset_sse_inside_binop_or(tgt,src)
#define _bitset_inside_binop_xor(tgt,src) _bitset_sse_inside_binop_xor(tgt,src)
-/* and with zero sets everything to zero. */
-#define _bitset_inside_binop_with_zero_and(tgt) _bitset_sse_inside_binop_with_zero_and(tgt)
-
-/* And Not with 0 is the identity (its like and with 1) */
-#define _bitset_inside_binop_with_zero_andnot(tgt)
-
-/* Or with zero is also the identity */
-#define _bitset_inside_binop_with_zero_or(tgt)
-
-/* Xor with 0 is like negation, we have to do it. */
-#define _bitset_inside_binop_with_zero_xor(tgt) _bitset_sse_inside_binop_with_zero_xor(tgt)
-
#define _BITSET_SSE_BINOP(name) \
-static INLINE void _bitset_sse_inside_binop_ ## name(unsigned long *tgt, unsigned long *src) \
+static INLINE void _bitset_sse_inside_binop_ ## name(bitset_unit_t *tgt, bitset_unit_t *src) \
{ \
__m128i src_op = _mm_load_si128((__m128i *) src); \
__m128i tgt_op = _mm_load_si128((__m128i *) tgt); \
}
-static INLINE void _bitset_sse_inside_binop_with_zero_and(unsigned long *tgt)
+static INLINE void _bitset_sse_inside_binop_with_zero_and(bitset_unit_t *tgt)
{
-#ifdef _BITSET_SSE_USE_INLINE_ASM
- asm("pxor %%xmm0,%%xmm0\n\t"
- "movapd %%xmm0,%0"
- :
- : "m" (tgt)
- : "xmm0", "memory");
-#else
tgt[0] = 0;
tgt[1] = 0;
tgt[2] = 0;
tgt[3] = 0;
-#endif
}
-static INLINE void _bitset_sse_inside_binop_with_zero_xor(unsigned long *tgt)
-{
-#ifdef _BITSET_SSE_USE_INLINE_ASM
- asm("pxor %%xmm0,%%xmm0\n\t"
- "pxor %0,%%xmm0\n\t"
- "movapd %%xmm0,%0"
- :
- : "m" (tgt)
- : "xmm0", "memory");
-#else
- __m128i src_op = _mm_setzero_si128();
- __m128i tgt_op = _mm_load_si128((void *) tgt);
- __m128i res = _mm_xor_si128(tgt_op, src_op);
- _mm_store_si128((__m128i *) tgt, res);
-#endif
-}
-
-static INLINE void _bitset_sse_inside_binop_andnot(unsigned long *tgt, unsigned long *src)
+static INLINE void _bitset_sse_inside_binop_andnot(bitset_unit_t *tgt, bitset_unit_t *src)
{
__m128i src_op = _mm_load_si128((void *) src);
__m128i tgt_op = _mm_load_si128((void *) tgt);
#endif
+#endif