| 1349 | |
| 1350 | |
| 1351 | bool mi_bitmap_bsr(mi_bitmap_t* bitmap, size_t* idx) { |
| 1352 | const size_t chunkmap_max = _mi_divide_up(mi_bitmap_chunk_count(bitmap), MI_BFIELD_BITS); |
| 1353 | for (size_t i = chunkmap_max; i > 0; ) { |
| 1354 | i--; |
| 1355 | mi_bfield_t cmap = mi_atomic_load_relaxed(&bitmap->chunkmap.bfields[i]); |
| 1356 | size_t cmap_idx; |
| 1357 | if (mi_bsr(cmap,&cmap_idx)) { |
| 1358 | // highest chunk |
| 1359 | const size_t chunk_idx = i*MI_BFIELD_BITS + cmap_idx; |
| 1360 | size_t cidx; |
| 1361 | if (mi_bchunk_bsr(&bitmap->chunks[chunk_idx], &cidx)) { |
| 1362 | *idx = (chunk_idx * MI_BCHUNK_BITS) + cidx; |
| 1363 | return true; |
| 1364 | } |
| 1365 | } |
| 1366 | } |
| 1367 | return false; |
| 1368 | } |
| 1369 | |
| 1370 | // Return count of all set bits in a bitmap. |
| 1371 | size_t mi_bitmap_popcount(mi_bitmap_t* bitmap) { |
no test coverage detected