Index: doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 8c60d59241a81a3be2841e6ed16dbc7c727eef67)
+++ doc/theses/thierry_delisle_PhD/code/relaxed_list.hpp	(revision 5f259f328b42a1af87332bf2abfa64b1ac0a6ba8)
@@ -220,15 +220,26 @@
 					if(maski == 0 && maskj == 0) continue;
 
-					unsigned bi = rand_bit(ri >> snzm.depth, maski);
-					unsigned bj = rand_bit(rj >> snzm.depth, maskj);
-
-					assertf(bi < 64, "%zu %u", maski, bi);
-					assertf(bj < 64, "%zu %u", maskj, bj);
+					#if defined(__BMI2__)
+						uint64_t idxsi = _pext_u64(snzm.indexes, maski);
+						uint64_t idxsj = _pext_u64(snzm.indexes, maskj);
+
+						auto pi = __builtin_popcountll(maski);
+						auto pj = __builtin_popcountll(maskj);
+
+						ri = pi ? ri & ((pi >> 3) - 1) : 0;
+						rj = pj ? rj & ((pj >> 3) - 1) : 0;
+
+						unsigned bi = (idxsi >> (ri << 3)) & 0xff;
+						unsigned bj = (idxsj >> (rj << 3)) & 0xff;
+					#else
+						unsigned bi = rand_bit(ri >> snzm.depth, maski);
+						unsigned bj = rand_bit(rj >> snzm.depth, maskj);
+					#endif
 
 					i = (bi << snzm.depth) | wdxi;
 					j = (bj << snzm.depth) | wdxj;
 
-					assertf(i < numLists, "%u %u", bj, wdxi);
-					assertf(j < numLists, "%u %u", bj, wdxj);
+					/* paranoid */ assertf(i < numLists, "%u %u", bj, wdxi);
+					/* paranoid */ assertf(j < numLists, "%u %u", bj, wdxj);
 				}
 
