| 286 | |
| 287 | template <typename Table> |
| 288 | char* ProbeState::joinNormalizedKeyFullProbe( |
| 289 | const Table& table, |
| 290 | const uint64_t* keys) { |
| 291 | if (group_ && RowContainer::normalizedKey(group_) == keys[row_]) { |
| 292 | table.incrementHits(); |
| 293 | return group_; |
| 294 | } |
| 295 | const auto kEmptyGroup = BaseHashTable::TagVector::broadcast(kEmptyTag); |
| 296 | for (int64_t numProbedBuckets = 0; numProbedBuckets < table.numBuckets(); |
| 297 | ++numProbedBuckets) { |
| 298 | if (!hits_) { |
| 299 | const uint16_t empty = simd::toBitMask(tagsInTable_ == kEmptyGroup); |
| 300 | if (empty) { |
| 301 | return nullptr; |
| 302 | } |
| 303 | } else { |
| 304 | loadNextHit<Operation::kProbe>( |
| 305 | table, -static_cast<int32_t>(sizeof(normalized_key_t))); |
| 306 | if (RowContainer::normalizedKey(group_) == keys[row_]) { |
| 307 | table.incrementHits(); |
| 308 | return group_; |
| 309 | } |
| 310 | continue; |
| 311 | } |
| 312 | bucketOffset_ = table.nextBucketOffset(bucketOffset_); |
| 313 | tagsInTable_ = BaseHashTable::loadTags( |
| 314 | reinterpret_cast<uint8_t*>(table.table_), bucketOffset_); |
| 315 | hits_ = simd::toBitMask(tagsInTable_ == wantedTags_) & kFullMask; |
| 316 | } |
| 317 | BOLT_FAIL("Have looped through all the buckets in table"); |
| 318 | } |
| 319 | |
| 320 | template <Operation op, typename Table> |
| 321 | void ProbeState::loadNextHit(Table& table, int32_t firstKey) { |
no test coverage detected