mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-10 04:33:40 +00:00
Fix bugs with &=, intersect with complement. Add three argument version of intersect with complement.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41832 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9544dc294f
commit
16ebc260bd
@ -247,6 +247,22 @@ public:
|
||||
BecameZero = !allzero;
|
||||
return changed;
|
||||
}
|
||||
// Three argument version of intersectWithComplement that intersects
|
||||
// RHS1 & ~RHS2 into this element
|
||||
void intersectWithComplement(const SparseBitVectorElement &RHS1,
|
||||
const SparseBitVectorElement &RHS2,
|
||||
bool &BecameZero) {
|
||||
bool allzero = true;
|
||||
|
||||
BecameZero = false;
|
||||
for (unsigned i = 0; i < BITWORDS_PER_ELEMENT; ++i) {
|
||||
Bits[i] = RHS1.Bits[i] & ~RHS2.Bits[i];
|
||||
if (Bits[i] != 0)
|
||||
allzero = false;
|
||||
}
|
||||
BecameZero = !allzero;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
template <unsigned ElementSize = 128>
|
||||
@ -346,7 +362,7 @@ class SparseBitVector {
|
||||
int NextSetBitNumber = (*Iter)->find_next(BitNumber % ElementSize) ;
|
||||
// If we ran out of set bits in this element, move to next element.
|
||||
if (NextSetBitNumber == -1 || (BitNumber % ElementSize == 0)) {
|
||||
Iter++;
|
||||
++Iter;
|
||||
WordNumber = 0;
|
||||
|
||||
// We may run out of elements in the bitmap.
|
||||
@ -371,7 +387,7 @@ class SparseBitVector {
|
||||
public:
|
||||
// Preincrement.
|
||||
inline SparseBitVectorIterator& operator++() {
|
||||
BitNumber++;
|
||||
++BitNumber;
|
||||
Bits >>= 1;
|
||||
AdvanceToNextNonZero();
|
||||
return *this;
|
||||
@ -527,14 +543,14 @@ public:
|
||||
|
||||
NewElem = new SparseBitVectorElement<ElementSize>(*(*Iter2));
|
||||
Elements.insert(Iter1, NewElem);
|
||||
Iter2++;
|
||||
++Iter2;
|
||||
changed = true;
|
||||
} else if ((*Iter1)->index() == (*Iter2)->index()) {
|
||||
changed |= (*Iter1)->unionWith(*(*Iter2));
|
||||
Iter1++;
|
||||
Iter2++;
|
||||
++Iter1;
|
||||
++Iter2;
|
||||
} else {
|
||||
Iter1++;
|
||||
++Iter1;
|
||||
}
|
||||
}
|
||||
CurrElementIter = Elements.begin();
|
||||
@ -563,7 +579,7 @@ public:
|
||||
return changed;
|
||||
|
||||
if ((*Iter1)->index() > (*Iter2)->index()) {
|
||||
Iter2++;
|
||||
++Iter2;
|
||||
} else if ((*Iter1)->index() == (*Iter2)->index()) {
|
||||
bool BecameZero;
|
||||
changed |= (*Iter1)->intersectWith(*(*Iter2), BecameZero);
|
||||
@ -571,18 +587,19 @@ public:
|
||||
ElementListIter IterTmp = Iter1;
|
||||
delete *IterTmp;
|
||||
Elements.erase(IterTmp);
|
||||
Iter1++;
|
||||
} else {
|
||||
Iter1++;
|
||||
}
|
||||
Iter2++;
|
||||
++Iter1;
|
||||
++Iter2;
|
||||
} else {
|
||||
ElementListIter IterTmp = Iter1;
|
||||
Iter1++;
|
||||
++Iter1;
|
||||
delete *IterTmp;
|
||||
Elements.erase(IterTmp);
|
||||
}
|
||||
}
|
||||
for_each(Iter1, Elements.end(),
|
||||
deleter<SparseBitVectorElement<ElementSize> >);
|
||||
Elements.erase(Iter1, Elements.end());
|
||||
CurrElementIter = Elements.begin();
|
||||
return changed;
|
||||
}
|
||||
@ -602,6 +619,8 @@ public:
|
||||
// possible if they are the same bitmap.
|
||||
if (Iter1 != Elements.end() && Iter2 != RHS.Elements.end())
|
||||
if (*Iter1 == *Iter2) {
|
||||
for_each(Elements.begin(), Elements.end(),
|
||||
deleter<SparseBitVectorElement<ElementSize> >);
|
||||
Elements.clear();
|
||||
return true;
|
||||
}
|
||||
@ -612,7 +631,7 @@ public:
|
||||
return changed;
|
||||
|
||||
if ((*Iter1)->index() > (*Iter2)->index()) {
|
||||
Iter2++;
|
||||
++Iter2;
|
||||
} else if ((*Iter1)->index() == (*Iter2)->index()) {
|
||||
bool BecameZero;
|
||||
changed |= (*Iter1)->intersectWithComplement(*(*Iter2), BecameZero);
|
||||
@ -620,14 +639,12 @@ public:
|
||||
ElementListIter IterTmp = Iter1;
|
||||
delete *IterTmp;
|
||||
Elements.erase(IterTmp);
|
||||
Iter1++;
|
||||
} else {
|
||||
Iter1++;
|
||||
}
|
||||
Iter2++;
|
||||
++Iter1;
|
||||
++Iter2;
|
||||
} else {
|
||||
ElementListIter IterTmp = Iter1;
|
||||
Iter1++;
|
||||
++Iter1;
|
||||
delete *IterTmp;
|
||||
Elements.erase(IterTmp);
|
||||
}
|
||||
@ -641,6 +658,71 @@ public:
|
||||
}
|
||||
|
||||
|
||||
// Three argument version of intersectWithComplement. Result of RHS1 & ~RHS2
|
||||
// is stored into this bitmap.
|
||||
void intersectWithComplement(const SparseBitVector<ElementSize> &RHS1,
|
||||
const SparseBitVector<ElementSize> &RHS2)
|
||||
{
|
||||
for_each(Elements.begin(), Elements.end(),
|
||||
deleter<SparseBitVectorElement<ElementSize> >);
|
||||
Elements.clear();
|
||||
|
||||
ElementListConstIter Iter1 = RHS1.Elements.begin();
|
||||
ElementListConstIter Iter2 = RHS2.Elements.begin();
|
||||
|
||||
// IE They may both be end.
|
||||
if (Iter1 == Iter2)
|
||||
return;
|
||||
|
||||
// See if the first bitmap element is the same in both. This is only
|
||||
// possible if they are the same bitmap.
|
||||
if (Iter1 != RHS1.Elements.end() && Iter2 != RHS2.Elements.end())
|
||||
if (*Iter1 == *Iter2) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Loop through, intersecting as we go, erasing elements when necessary.
|
||||
while (Iter2 != RHS2.Elements.end()) {
|
||||
if (Iter1 == RHS1.Elements.end())
|
||||
return;
|
||||
|
||||
if ((*Iter1)->index() > (*Iter2)->index()) {
|
||||
++Iter2;
|
||||
} else if ((*Iter1)->index() == (*Iter2)->index()) {
|
||||
bool BecameZero = false;
|
||||
SparseBitVectorElement<ElementSize> *NewElement =
|
||||
new SparseBitVectorElement<ElementSize>((*Iter1)->index());
|
||||
|
||||
NewElement->intersectWithComplement(*(*Iter1), *(*Iter2), BecameZero);
|
||||
if (BecameZero) {
|
||||
delete NewElement;
|
||||
} else {
|
||||
Elements.push_back(NewElement);
|
||||
}
|
||||
|
||||
++Iter1;
|
||||
++Iter2;
|
||||
} else {
|
||||
++Iter1;
|
||||
}
|
||||
}
|
||||
// copy the remaining elements
|
||||
|
||||
while (Iter1 != RHS1.Elements.end()) {
|
||||
SparseBitVectorElement<ElementSize> *NewElement =
|
||||
new SparseBitVectorElement<ElementSize>(*(*Iter1));
|
||||
Elements.push_back(NewElement);
|
||||
}
|
||||
|
||||
CurrElementIter = Elements.begin();
|
||||
return;
|
||||
}
|
||||
|
||||
void intersectWithComplement(const SparseBitVector<ElementSize> *RHS1,
|
||||
const SparseBitVector<ElementSize> *RHS2) {
|
||||
intersectWithComplement(*RHS1, *RHS2);
|
||||
}
|
||||
|
||||
bool intersects(const SparseBitVector<ElementSize> *RHS) const {
|
||||
return intersects(*RHS);
|
||||
}
|
||||
@ -667,14 +749,14 @@ public:
|
||||
return false;
|
||||
|
||||
if ((*Iter1)->index() > (*Iter2)->index()) {
|
||||
Iter2++;
|
||||
++Iter2;
|
||||
} else if ((*Iter1)->index() == (*Iter2)->index()) {
|
||||
if ((*Iter1)->intersects(*(*Iter2)))
|
||||
return true;
|
||||
Iter1++;
|
||||
Iter2++;
|
||||
++Iter1;
|
||||
++Iter2;
|
||||
} else {
|
||||
Iter1++;
|
||||
++Iter1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@ -713,28 +795,29 @@ public:
|
||||
|
||||
// Convenience functions to allow Or and And without dereferencing in the user
|
||||
// code.
|
||||
template <unsigned ElementSize>
|
||||
inline void operator |=(SparseBitVector<ElementSize> *LHS,
|
||||
const SparseBitVector<ElementSize> &RHS) {
|
||||
LHS->operator|=(RHS);
|
||||
}
|
||||
|
||||
template <unsigned ElementSize>
|
||||
inline void operator |=(SparseBitVector<ElementSize> *LHS,
|
||||
inline bool operator |=(SparseBitVector<ElementSize> &LHS,
|
||||
const SparseBitVector<ElementSize> *RHS) {
|
||||
LHS->operator|=(RHS);
|
||||
return LHS |= *RHS;
|
||||
}
|
||||
|
||||
template <unsigned ElementSize>
|
||||
inline void operator &=(SparseBitVector<ElementSize> *LHS,
|
||||
inline bool operator |=(SparseBitVector<ElementSize> *LHS,
|
||||
const SparseBitVector<ElementSize> &RHS) {
|
||||
LHS->operator&=(RHS);
|
||||
return LHS->operator|=(RHS);
|
||||
}
|
||||
|
||||
template <unsigned ElementSize>
|
||||
inline void operator &=(SparseBitVector<ElementSize> *LHS,
|
||||
inline bool operator &=(SparseBitVector<ElementSize> *LHS,
|
||||
const SparseBitVector<ElementSize> &RHS) {
|
||||
return LHS->operator&=(RHS);
|
||||
}
|
||||
|
||||
template <unsigned ElementSize>
|
||||
inline bool operator &=(SparseBitVector<ElementSize> &LHS,
|
||||
const SparseBitVector<ElementSize> *RHS) {
|
||||
LHS->operator&=(RHS);
|
||||
return LHS &= (*RHS);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user