forked from OSchip/llvm-project
[APInt] Implement APInt::intersects without creating a temporary APInt in the multiword case
Summary: This is a simple question we should be able to answer without creating a temporary to hold the AND result. We can also get an early out as soon as we find a word that intersects. Reviewers: RKSimon, hans, spatel, davide Reviewed By: hans, davide Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D32253 llvm-svn: 300812
This commit is contained in:
parent
e49252cea1
commit
baa392e4e0
|
@ -209,6 +209,9 @@ private:
|
|||
/// out-of-line slow case for countPopulation
|
||||
unsigned countPopulationSlowCase() const LLVM_READONLY;
|
||||
|
||||
/// out-of-line slow case for intersects.
|
||||
bool intersectsSlowCase(const APInt &RHS) const LLVM_READONLY;
|
||||
|
||||
/// out-of-line slow case for setBits.
|
||||
void setBitsSlowCase(unsigned loBit, unsigned hiBit);
|
||||
|
||||
|
@ -1206,9 +1209,10 @@ public:
|
|||
/// This operation tests if there are any pairs of corresponding bits
|
||||
/// between this APInt and RHS that are both set.
|
||||
bool intersects(const APInt &RHS) const {
|
||||
APInt temp(*this);
|
||||
temp &= RHS;
|
||||
return temp != 0;
|
||||
assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
|
||||
if (isSingleWord())
|
||||
return (VAL & RHS.VAL) != 0;
|
||||
return intersectsSlowCase(RHS);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
|
|
@ -722,6 +722,14 @@ unsigned APInt::countPopulationSlowCase() const {
|
|||
return Count;
|
||||
}
|
||||
|
||||
bool APInt::intersectsSlowCase(const APInt &RHS) const {
|
||||
for (unsigned i = 0, e = getNumWords(); i != e; ++i)
|
||||
if ((pVal[i] & RHS.pVal[i]) != 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
APInt APInt::byteSwap() const {
|
||||
assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!");
|
||||
if (BitWidth == 16)
|
||||
|
|
Loading…
Reference in New Issue