From: Craig Topper Date: Tue, 28 Mar 2017 04:00:47 +0000 (+0000) Subject: [APInt] Move the single word cases of the bitwise operators inline. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=38ca8aac82d6abf037d2c2f868df0d9426b830c0;p=llvm [APInt] Move the single word cases of the bitwise operators inline. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298894 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index e527cebc057..1b17a4dc311 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -220,6 +220,15 @@ class LLVM_NODISCARD APInt { /// out-of-line slow case for flipAllBits. void flipAllBitsSlowCase(); + /// out-of-line slow case for operator&=. + APInt& AndAssignSlowCase(const APInt& RHS); + + /// out-of-line slow case for operator|=. + APInt& OrAssignSlowCase(const APInt& RHS); + + /// out-of-line slow case for operator^=. + APInt& XorAssignSlowCase(const APInt& RHS); + public: /// \name Constructors /// @{ @@ -693,7 +702,14 @@ public: /// assigned to *this. /// /// \returns *this after ANDing with RHS. - APInt &operator&=(const APInt &RHS); + APInt &operator&=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL &= RHS.VAL; + return *this; + } + return AndAssignSlowCase(RHS); + } /// \brief Bitwise AND assignment operator. /// @@ -716,7 +732,14 @@ public: /// assigned *this; /// /// \returns *this after ORing with RHS. - APInt &operator|=(const APInt &RHS); + APInt &operator|=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL |= RHS.VAL; + return *this; + } + return OrAssignSlowCase(RHS); + } /// \brief Bitwise OR assignment operator. /// @@ -739,7 +762,14 @@ public: /// assigned to *this. /// /// \returns *this after XORing with RHS. - APInt &operator^=(const APInt &RHS); + APInt &operator^=(const APInt &RHS) { + assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); + if (isSingleWord()) { + VAL ^= RHS.VAL; + return *this; + } + return XorAssignSlowCase(RHS); + } /// \brief Bitwise XOR assignment operator. /// diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index f2c3a2db30c..d5543cafff6 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -406,36 +406,21 @@ APInt& APInt::operator*=(const APInt& RHS) { return *this; } -APInt& APInt::operator&=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL &= RHS.VAL; - return *this; - } +APInt& APInt::AndAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] &= RHS.pVal[i]; return *this; } -APInt& APInt::operator|=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL |= RHS.VAL; - return *this; - } +APInt& APInt::OrAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] |= RHS.pVal[i]; return *this; } -APInt& APInt::operator^=(const APInt& RHS) { - assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); - if (isSingleWord()) { - VAL ^= RHS.VAL; - return *this; - } +APInt& APInt::XorAssignSlowCase(const APInt& RHS) { unsigned numWords = getNumWords(); for (unsigned i = 0; i < numWords; ++i) pVal[i] ^= RHS.pVal[i];