summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-01-23 20:47:16 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-01-23 20:47:16 +0000
commita69b9c38acebdbfd8240024601a9e61cc624605a (patch)
treed4f9919e9310e1d87efe0675923a657cbb7fc8aa
parentf36fd2153ce2e4668f4e3df1568deddebf25a348 (diff)
- Use santitized range to align orWith / andNotWith with similar code.
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.h1
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 {