From 8a3caf7dea955b513a6c1b572a2423c6b4213402 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 15 Feb 2024 23:54:17 -0800 Subject: Introduce `Group::MaskNonFull` without usage. It can be used instead of `MaskEmptyOrDeleted` in case of inserting to empty table. `MaskNonFull` requires less operations, in particular it eliminates `_mm_set1_epi8` and `_mm_cmpgt_epi8` operations. PiperOrigin-RevId: 607587394 Change-Id: Ia48f922d1ca6de38cc91e7ab0d608c45f8f2c446 --- absl/container/internal/raw_hash_set.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'absl/container/internal/raw_hash_set.h') diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h index d6950e61..cef042e7 100644 --- a/absl/container/internal/raw_hash_set.h +++ b/absl/container/internal/raw_hash_set.h @@ -657,6 +657,14 @@ struct GroupSse2Impl { static_cast(_mm_movemask_epi8(ctrl) ^ 0xffff)); } + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + return BitMask( + static_cast(_mm_movemask_epi8(ctrl))); + } + // Returns a bitmask representing the positions of empty or deleted slots. NonIterableBitMask MaskEmptyOrDeleted() const { auto special = _mm_set1_epi8(static_cast(ctrl_t::kSentinel)); @@ -725,6 +733,18 @@ struct GroupAArch64Impl { /*NullifyBitsOnIteration=*/true>(mask); } + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + uint64_t mask = vget_lane_u64( + vreinterpret_u64_u8(vclt_s8(vreinterpret_s8_u8(ctrl), + vdup_n_s8(static_cast(0)))), + 0); + return BitMask(mask); + } + NonIterableBitMask MaskEmptyOrDeleted() const { uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(vcgt_s8( @@ -797,6 +817,13 @@ struct GroupPortableImpl { return BitMask((ctrl ^ kMsbs8Bytes) & kMsbs8Bytes); } + // Returns a bitmask representing the positions of non full slots. + // Note: this includes: kEmpty, kDeleted, kSentinel. + // It is useful in contexts when kSentinel is not present. + auto MaskNonFull() const { + return BitMask(ctrl & kMsbs8Bytes); + } + NonIterableBitMask MaskEmptyOrDeleted() const { return NonIterableBitMask((ctrl & ~(ctrl << 7)) & kMsbs8Bytes); -- cgit v1.2.3