diff --git a/vmap.h b/vmap.h index 4feb71f..8dd90a4 100644 --- a/vmap.h +++ b/vmap.h @@ -98,7 +98,9 @@ static inline vmap_find_res search_all_vmap(vmap *map, uint32_t key, vmap_find_r /* Probably the loop exists always without this predicate being false */ while(level <= map->max_levels) { /* Rare edge-case when last lane element was returned and we continue from it */ - if(prev.lane_abcd_next > 4) { + /* We should not try lane processing, just jump next level - but only if there */ + /* is a next level (so last checked lane was totally filled already to full cap. */ + if((prev.lane_abcd_next > 4) && (prev.last_found_lane_val != 0)) { prev = vmap_search_all_begin(); ++level; /* prev.level = level; // unnecessary, I hand-optimized out */ @@ -130,7 +132,7 @@ static inline vmap_find_res search_all_vmap(vmap *map, uint32_t key, vmap_find_r int lane_next_begin = 0; /* Further lanes only needed if ours is fully filled */ - /* Overlay simd and integer units here for perf */ + /* Overlays SIMD and integer units here for perf */ uint32_t *afind = simd_map_lane_find( lane_a, key,