- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/thierry_delisle_PhD/code/snzm.hpp
r8c60d59 r591f084 11 11 const int root; 12 12 std::unique_ptr<snzm_t::node[]> nodes; 13 14 #if defined(__BMI2__)15 const uint64_t indexes = 0x0706050403020100;16 #endif17 13 18 14 snzm_t(unsigned numLists); … … 32 28 } 33 29 34 uint64_t masks( unsigned node ) {30 size_t masks( unsigned node ) { 35 31 /* paranoid */ assert( (node & mask) == node ); 36 #if defined(__BMI2__) 37 return nodes[node].mask_all; 38 #else 39 return nodes[node].mask; 40 #endif 32 return nodes[node].mask; 41 33 } 42 34 … … 148 140 private: 149 141 volatile val_t value; 150 #if defined(__BMI2__) 151 union __attribute__((packed)) { 152 volatile uint8_t mask[8]; 153 volatile uint64_t mask_all; 154 }; 155 #else 156 volatile size_t mask = 0; 157 #endif 158 142 volatile size_t mask = 0; 159 143 class node * parent = nullptr; 160 144 bool is_leaf = false; … … 167 151 void arrive( int bit ) { 168 152 /* paranoid */ assert( is_leaf ); 153 /* paranoid */ assert( (mask & ( 1 << bit )) == 0 ); 169 154 170 155 arrive_h(); 171 #if defined(__BMI2__) 172 /* paranoid */ assert( bit < 8 ); 173 mask[bit] = 0xff; 174 #else 175 /* paranoid */ assert( (mask & ( 1 << bit )) == 0 ); 176 __atomic_fetch_add( &mask, 1 << bit, __ATOMIC_RELAXED ); 177 #endif 156 __atomic_fetch_add( &mask, 1 << bit, __ATOMIC_RELAXED ); 157 // bts( (std::atomic_size_t&)mask, bit ); 178 158 179 159 } … … 181 161 void depart( int bit ) { 182 162 /* paranoid */ assert( is_leaf ); 163 /* paranoid */ assert( (mask & ( 1 << bit )) != 0 ); 183 164 184 #if defined(__BMI2__) 185 /* paranoid */ assert( bit < 8 ); 186 mask[bit] = 0x00; 187 #else 188 /* paranoid */ assert( (mask & ( 1 << bit )) != 0 ); 189 __atomic_fetch_sub( &mask, 1 << bit, __ATOMIC_RELAXED ); 190 #endif 165 // btr( (std::atomic_size_t&)mask, bit ); 166 __atomic_fetch_sub( &mask, 1 << bit, __ATOMIC_RELAXED ); 191 167 depart_h(); 192 168 }
Note: See TracChangeset
for help on using the changeset viewer.