00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if defined(__i386) || defined(__x86_64) || defined(__ppc__) || \
00012 defined(__ppc64__) || defined(_M_IX86) || defined(_M_AMD64) || \
00013 defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \
00014 (defined(_M_MPPC) && !defined(BM_FORBID_UNALIGNED_ACCESS))
00015 #define BM_UNALIGNED_ACCESS_OK 1
00016 #endif
00017
00018 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || \
00019 defined(__i386) || defined(__x86_64) || defined(_M_AMD64) || \
00020 defined(BMSSE2OPT) || defined(BMSSE42OPT)
00021 #define BM_x86
00022 #endif
00023
00024
00025
00026
00027 #if(_MSC_VER >= 1400)
00028
00029 # define BM_HASFORCEINLINE
00030 # ifndef BMRESTRICT
00031 # define BMRESTRICT __restrict
00032 # endif
00033 #endif
00034
00035 #ifdef __GNUG__
00036
00037 # ifndef BMRESTRICT
00038 # define BMRESTRICT __restrict__
00039 # endif
00040
00041 # ifdef __OPTIMIZE__
00042 # define BM_NOASSERT
00043 # endif
00044 #endif
00045
00046 #ifndef BM_ASSERT
00047
00048 # ifndef BM_NOASSERT
00049 # include <cassert>
00050 # define BM_ASSERT assert
00051 # else
00052 # ifndef BM_ASSERT
00053 # define BM_ASSERT(x)
00054 # endif
00055 # endif
00056
00057 #endif
00058
00059
00060 #define FULL_BLOCK_ADDR bm::all_set<true>::_block._p
00061 #define IS_VALID_ADDR(addr) (addr && (addr != FULL_BLOCK_ADDR))
00062 #define IS_FULL_BLOCK(addr) (addr == FULL_BLOCK_ADDR)
00063 #define IS_EMPTY_BLOCK(addr) (addr == 0)
00064
00065
00066
00067
00068
00069
00070
00071
00072 # if ULONG_MAX != 0xffffffff || defined(_WIN64) // 64-bit
00073
00074 # define BMPTR_SETBIT0(ptr) ( ((bm::id64_t)ptr) | 1 )
00075 # define BMPTR_CLEARBIT0(ptr) ( ((bm::id64_t)ptr) & ~(bm::id64_t)1 )
00076 # define BMPTR_TESTBIT0(ptr) ( ((bm::id64_t)ptr) & 1 )
00077
00078 # else // 32-bit
00079
00080 # define BMPTR_SETBIT0(ptr) ( ((bm::id_t)ptr) | 1 )
00081 # define BMPTR_CLEARBIT0(ptr) ( ((bm::id_t)ptr) & ~(bm::id_t)1 )
00082 # define BMPTR_TESTBIT0(ptr) ( ((bm::id_t)ptr) & 1 )
00083
00084 # endif
00085
00086 # define BMGAP_PTR(ptr) ((bm::gap_word_t*)BMPTR_CLEARBIT0(ptr))
00087 # define BMSET_PTRGAP(ptr) ptr = (bm::word_t*)BMPTR_SETBIT0(ptr)
00088 # define BM_IS_GAP(ptr) ( BMPTR_TESTBIT0(ptr)!=0 )
00089
00090
00091
00092
00093
00094 #ifdef BM_HASRESTRICT
00095 # ifndef BMRESTRICT
00096 # define BMRESTRICT restrict
00097 # endif
00098 #else
00099 # ifndef BMRESTRICT
00100 # define BMRESTRICT
00101 # endif
00102 #endif
00103
00104
00105 #ifdef BM_HASFORCEINLINE
00106 # ifndef BMFORCEINLINE
00107 # define BMFORCEINLINE __forceinline
00108 # endif
00109 #else
00110 # define BMFORCEINLINE inline
00111 #endif
00112
00113
00114
00115
00116
00117
00118 #if !(defined(BMSSE2OPT) || defined(BMSSE42OPT))
00119
00120 # ifndef BM_SET_MMX_GUARD
00121 # define BM_SET_MMX_GUARD
00122 # endif
00123
00124 #define BM_ALIGN16
00125 #define BM_ALIGN16ATTR
00126
00127 #else
00128
00129 # ifndef BM_SET_MMX_GUARD
00130 # define BM_SET_MMX_GUARD sse_empty_guard bm_mmx_guard_;
00131 # endif
00132
00133 #ifdef _MSC_VER
00134
00135 #ifndef BM_ALIGN16
00136 # define BM_ALIGN16 __declspec(align(16))
00137 # define BM_ALIGN16ATTR
00138 #endif
00139
00140 # else // GCC
00141
00142 #ifndef BM_ALIGN16
00143 # define BM_ALIGN16
00144 # define BM_ALIGN16ATTR __attribute__((aligned(16)))
00145 #endif
00146
00147 #endif
00148
00149 #endif
00150
00151
00152
00153
00154
00155 #ifndef BM_INCWORD_BITCOUNT
00156
00157 #ifdef BMSSE42OPT
00158
00159 # define BM_INCWORD_BITCOUNT(cnt, w) cnt += _mm_popcnt_u32(w);
00160
00161 #else
00162
00163 # define BM_INCWORD_BITCOUNT(cnt, w) cnt += \
00164 bm::bit_count_table<true>::_count[(unsigned char)(w)] + \
00165 bm::bit_count_table<true>::_count[(unsigned char)((w) >> 8)] + \
00166 bm::bit_count_table<true>::_count[(unsigned char)((w) >> 16)] + \
00167 bm::bit_count_table<true>::_count[(unsigned char)((w) >> 24)];
00168
00169 #endif
00170
00171 #endif
00172
00173