diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-23 20:47:16 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-23 20:47:16 +0000 |
commit | a69b9c38acebdbfd8240024601a9e61cc624605a (patch) | |
tree | d4f9919e9310e1d87efe0675923a657cbb7fc8aa | |
parent | f36fd2153ce2e4668f4e3df1568deddebf25a348 (diff) |
- Use santitized range to align orWith / andNotWith with similar code.
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvector.cpp | 32 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvector.h | 1 |
2 files changed, 17 insertions, 16 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitvector.cpp b/searchlib/src/vespa/searchlib/common/bitvector.cpp index 7ae21b5718a..19d0e194432 100644 --- a/searchlib/src/vespa/searchlib/common/bitvector.cpp +++ b/searchlib/src/vespa/searchlib/common/bitvector.cpp @@ -193,18 +193,18 @@ void BitVector::orWith(const BitVector & right) { verifyInclusiveStart(*this, right); + Range range = sanitize(right.range()); + if ( ! range.validNonZero()) return; if (right.size() < size()) { - if (right.size() > getStartIndex()) { - ssize_t commonBytes = numActiveBytes(getStartIndex(), right.size()) - sizeof(Word); - if (commonBytes > 0) { - IAccelrated::getAccelerator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), commonBytes); - } - Index last(right.size() - 1); - store(getWordIndex(last)[0], getWordIndex(last)[0] | (load(right.getWordIndex(last)[0]) & ~endBits(last))); + ssize_t commonBytes = numActiveBytes(range.start(), range.end()) - sizeof(Word); + if (commonBytes > 0) { + IAccelrated::getAccelerator().orBit(getWordIndex(range.start()), right.getWordIndex(range.start()), commonBytes); } + Index last(range.end() - 1); + store(getWordIndex(last)[0], getWordIndex(last)[0] | (load(right.getWordIndex(last)[0]) & ~endBits(last))); } else { - IAccelrated::getAccelerator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); + IAccelrated::getAccelerator().orBit(getWordIndex(range.start()), right.getWordIndex(range.start()), getActiveBytes()); } repairEnds(); invalidateCachedCount(); @@ -243,18 +243,18 @@ void BitVector::andNotWith(const BitVector& right) { verifyInclusiveStart(*this, right); + Range range = sanitize(right.range()); + if ( ! range.validNonZero()) return; if (right.size() < size()) { - if (right.size() > getStartIndex()) { - ssize_t commonBytes = numActiveBytes(getStartIndex(), right.size()) - sizeof(Word); - if (commonBytes > 0) { - IAccelrated::getAccelerator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), commonBytes); - } - Index last(right.size() - 1); - store(getWordIndex(last)[0], getWordIndex(last)[0] & ~(load(right.getWordIndex(last)[0]) & ~endBits(last))); + ssize_t commonBytes = numActiveBytes(range.start(), range.end()) - sizeof(Word); + if (commonBytes > 0) { + IAccelrated::getAccelerator().andNotBit(getWordIndex(range.start()), right.getWordIndex(range.start()), commonBytes); } + Index last(range.end() - 1); + store(getWordIndex(last)[0], getWordIndex(last)[0] & ~(load(right.getWordIndex(last)[0]) & ~endBits(last))); } else { - IAccelrated::getAccelerator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes()); + IAccelrated::getAccelerator().andNotBit(getWordIndex(range.start()), right.getWordIndex(range.start()), getActiveBytes()); } repairEnds(); diff --git a/searchlib/src/vespa/searchlib/common/bitvector.h b/searchlib/src/vespa/searchlib/common/bitvector.h index 973d1a8704b..67f3e2ad502 100644 --- a/searchlib/src/vespa/searchlib/common/bitvector.h +++ b/searchlib/src/vespa/searchlib/common/bitvector.h @@ -42,6 +42,7 @@ public: bool operator == (const BitVector &right) const; const void * getStart() const { return _words; } void * getStart() { return _words; } + Range range() const noexcept { return {getStartIndex(), size()}; } Index size() const { return vespalib::atomic::load_ref_relaxed(_sz); } Index sizeBytes() const { return numBytes(getActiveSize()); } bool testBit(Index idx) const { |