Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/thierry_delisle_PhD/code/snzm.hpp

    r8c60d59 r591f084  
    1111        const int root;
    1212        std::unique_ptr<snzm_t::node[]> nodes;
    13 
    14         #if defined(__BMI2__)
    15                 const uint64_t indexes = 0x0706050403020100;
    16         #endif
    1713
    1814        snzm_t(unsigned numLists);
     
    3228        }
    3329
    34         uint64_t masks( unsigned node ) {
     30        size_t masks( unsigned node ) {
    3531                /* 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;
    4133        }
    4234
     
    148140        private:
    149141                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;
    159143                class node * parent = nullptr;
    160144                bool is_leaf = false;
     
    167151                void arrive( int bit ) {
    168152                        /* paranoid */ assert( is_leaf );
     153                        /* paranoid */ assert( (mask & ( 1 << bit )) == 0 );
    169154
    170155                        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 );
    178158
    179159                }
     
    181161                void depart( int bit ) {
    182162                        /* paranoid */ assert( is_leaf );
     163                        /* paranoid */ assert( (mask & ( 1 << bit )) != 0 );
    183164
    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 );
    191167                        depart_h();
    192168                }
Note: See TracChangeset for help on using the changeset viewer.