Index: doc/theses/thierry_delisle_PhD/code/snzi.hpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/snzi.hpp	(revision edb2fe0b068c3382b841331673b53e5a5a00f674)
+++ doc/theses/thierry_delisle_PhD/code/snzi.hpp	(revision 8c60d59241a81a3be2841e6ed16dbc7c727eef67)
@@ -29,5 +29,5 @@
 
 private:
-	class __attribute__((aligned(64))) node {
+	class __attribute__((aligned(128))) node {
 		friend class snzi_t;
 	private:
Index: doc/theses/thierry_delisle_PhD/code/snzm.hpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/snzm.hpp	(revision edb2fe0b068c3382b841331673b53e5a5a00f674)
+++ doc/theses/thierry_delisle_PhD/code/snzm.hpp	(revision 8c60d59241a81a3be2841e6ed16dbc7c727eef67)
@@ -12,4 +12,8 @@
 	std::unique_ptr<snzm_t::node[]> nodes;
 
+	#if defined(__BMI2__)
+		const uint64_t indexes = 0x0706050403020100;
+	#endif
+
 	snzm_t(unsigned numLists);
 
@@ -28,11 +32,15 @@
 	}
 
-	size_t masks( unsigned node ) {
+	uint64_t masks( unsigned node ) {
 		/* paranoid */ assert( (node & mask) == node );
-		return nodes[node].mask;
+		#if defined(__BMI2__)
+			return nodes[node].mask_all;
+		#else
+			return nodes[node].mask;
+		#endif
 	}
 
 private:
-	class __attribute__((aligned(64))) node {
+	class __attribute__((aligned(128))) node {
 		friend class snzm_t;
 	private:
@@ -140,5 +148,13 @@
 	private:
 		volatile val_t value;
-		volatile size_t mask = 0;
+		#if defined(__BMI2__)
+			union __attribute__((packed)) {
+				volatile uint8_t mask[8];
+				volatile uint64_t mask_all;
+			};
+		#else
+			volatile size_t mask = 0;
+		#endif
+
 		class node * parent = nullptr;
 		bool is_leaf = false;
@@ -151,8 +167,13 @@
 		void arrive( int bit ) {
 			/* paranoid */ assert( is_leaf );
-			/* paranoid */ assert( (mask & ( 1 << bit )) == 0 );
-
-			__atomic_fetch_add( &mask, 1 << bit, __ATOMIC_RELAXED );
+
 			arrive_h();
+			#if defined(__BMI2__)
+				/* paranoid */ assert( bit < 8 );
+				mask[bit] = 0xff;
+			#else
+				/* paranoid */ assert( (mask & ( 1 << bit )) == 0 );
+				__atomic_fetch_add( &mask, 1 << bit, __ATOMIC_RELAXED );
+			#endif
 
 		}
@@ -160,8 +181,13 @@
 		void depart( int bit ) {
 			/* paranoid */ assert( is_leaf );
-			/* paranoid */ assert( (mask & ( 1 << bit )) != 0 );
-
+
+			#if defined(__BMI2__)
+				/* paranoid */ assert( bit < 8 );
+				mask[bit] = 0x00;
+			#else
+				/* paranoid */ assert( (mask & ( 1 << bit )) != 0 );
+				__atomic_fetch_sub( &mask, 1 << bit, __ATOMIC_RELAXED );
+			#endif
 			depart_h();
-			__atomic_fetch_sub( &mask, 1 << bit, __ATOMIC_RELAXED );
 		}
 
